2017-04-06 4 views
0

これは改訂されたコードです。初期値は変換せずに無計画に高いです! temperatureCと同様にinitialTempに適用する変換を取得するにはどうすればよいですか?初心者のArduinoループ関数と変数

私が知る限りで助けてくれたコードは、私が達成しようとしていたものですが、明らかにそうです。

ありがとうございました!

int pin_tempRead = 0; // temperature sensor pin 
int coolLED = 2; // cooling LED digital pin 
int heatLED = 3; // heating LED digital pin 
float initialTemp; 
float cutOffTemp = 30; //cut off temperature = 30°C 

void setup() 
{ 
    Serial.begin(9600); //Start the serial connection with the computer 
    pinMode(heatLED, OUTPUT); //initialise as OUTPUT 
    pinMode(coolLED, OUTPUT); //initialise as OUTPUT 
    initialTemp = analogRead(pin_tempRead); // read the initial temp 
    Serial.print("Initial temperature: "); Serial.print(initialTemp); Serial.println("C"); //prints out starting temperature 
} 

void loop()      // run over and over again 
{ 
    //getting the voltage reading from the temperature sensor 
    float current_temp = analogRead(pin_tempRead); 

    // converting that reading to voltage 
    float voltage = current_temp * 5.0; voltage /= 1024.0; 

    float temperatureC = (voltage - 0.5) * 100 ; //converting from 10 mv per degree with 500 mV offset 
    //to degrees ((voltage - 500mV) times 100) 

    if(temperatureC > cutOffTemp) { 
     // temp too high -> turn on the cooling system 
     digitalWrite(heatLED, LOW); 
     digitalWrite(coolLED, HIGH);       
    }else if (temperatureC < initialTemp) { 
     // temp too low -> turn on the heating system 
     digitalWrite(heatLED, HIGH); 
     digitalWrite(coolLED, LOW); 
    } 
    Serial.print("Current pump temperature: "); 
    Serial.print(temperatureC); Serial.println("C"); 
    delay(1000); 
} 

答えて

1

loop()機能は何度も繰り返し実行し、それは、初期値を格納するのに適した場所ではありません。あなたは、グローバル変数を定義setup()関数内で初期化されて行う必要があり、その後、あなたがloop()機能でそれを読むことができますどのような

ミニマ例:

int pin_tempRead = 0; // temperature sensor pin 
float initial_temp;  // define a global variable 

void setup() { 
    initial_temp = analogRead(pin_tempRead); // read the initial temp 
} 

void loop() { 
    float current_temp = analogRead(pin_tempRead); 
    // get the temperature difference respect to the initial one 
    float difference = initial_temp - current_temp; 
    delay(1000); 
} 

PD:またハードウェア接続(ピン)を定義する変数とソフトウェアの変数を区別するのが良い方法です。私は通常、接続を定義する変数にpin_を追加します。それ以外の場合は、tempReadがセンサの温度またはピンの値であるかどうかはわかりません。

また、ヒーター/冷却システムの電源をオン/オフするには:既にループしています(loop()の機能はループです)ので、whileループは必要ありません。

あなたは私たちのロジックにいくつか問題があります。

私が理解していたように、より高い閾値(cutOff)に達するまで加熱し、次に低い閾値に達するまで(initialTemperature)まで冷却したいとします。

これはヒステリシスと呼ばれるが、あなたのロジックが間違っていた、ここに訂正一つですされています

だけで実行します。

void loop() { 

    if(temperatureC > cutOffTemp) { 
     // temp too high -> turn on the cooling system 
     digitalWrite(heatLED, LOW); 
     digitalWrite(coolLED, HIGH);       
    }else if (temperatureC < initialTemp) { 
     // temp too low -> turn on the heating system 
     digitalWrite(heatLED, HIGH); 
     digitalWrite(coolLED, LOW); 
    } 
    Serial.print("Current pump temperature: "); 
    Serial.print(temperatureC); Serial.println("C"); 
    delay(1000); 
} 

ところで、あなたがオンにするための低閾値としてinitialTemperatureを使用しています加熱。

あなたは本当に欲しいものですか?

初期温度がcutOffTempよりも高い場合はどうなりますか?その場合、下限のしきい値が上限のしきい値より高いため、問題が発生します。

+0

ありがとうございました!あなたは大量に正しい方向に私を入れました。だから私が望むのは、最初は常温でデバイスの温度を測定し、最初の読みを印刷するarduinoです。 50℃に達するまで読み取り値をプリントアウトします(私は30℃を選んだので、手で温度をトリップするのが簡単です)。実際には、最初の温度はカットオフ温度を決して超えません。ですから、あなたは、現在の温度に電圧変換されないアナログ読み出しでは、初期温度を150℃と表示します。新しいコードで投稿を編集します。ありがとうありがとう!! – vividillusion

+0

変換コードをすべてスキップしました。答えをスケルトンコードとして取り出し、必要なコードを追加します。 –

+0

最初の一時行をvoid設定に移動したのは、最初に一度だけ印刷する必要があるためです。それは明らかにどこでエラーが発生しているのですか? – vividillusion