Stap 4: Temperatuur controle logica
De code bestaat uit 3 delen:
-temperatuur van sensor lezen en schrijven het tentoongesteld, we temperatuur controleren elke 800ms
-knoppen lezen en schrijven van de gewenste temperatuur op het display
-keuze tussen Verwarming, koeling en off staat. Wij opgenomen de temperatuur hysteresis Voorkom schakelen tussen twee staten vaak als we in de buurt van de gewenste temperatuur zijn.
PROGRAMMA:
#include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal.h> unsigned long lasttime; int comand; float oldTc; float Td = 21; //desired T, controlled with buttonI and buttonD float Th = 1.0; //allowed deviation float Tc; //chamber temperature int buttonD = 9; //button which decrease desired T int buttonI = 8; //button which increase desired T int relay1 = 5; int relay2 = 4; //FUNCTION WHICH READS CHAMBER TEMPERATURE #define ONE_WIRE_BUS 6 // Temperature sensors data wire is plugged into pin 6 on the Arduino. OneWire oneWire(ONE_WIRE_BUS); //Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); LiquidCrystal lcd(A3,A2,A1,A0,13,12); void setup(void){ lcd.begin(16, 2); delay(200); // Start up the library sensors.begin(); sensors.setWaitForConversion(false); pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); lasttime = millis(); } void loop(void) { int button_state; if((millis()-lasttime)>800){ Tc = sensors.getTempCByIndex(0); sensors.requestTemperatures(); //Send the command to get temperatures. lasttime = millis(); } lcd.setCursor(0, 0); lcd.print("T="); lcd.print(Tc,1); lcd.print("C "); lcd.setCursor(0, 1); lcd.print("Desired T="); lcd.print(Td,1); lcd.print("C "); int down = 0; button_state=digitalRead(buttonD); if(button_state==0) { Td = Td - 0.1; down = 1; } button_state=digitalRead(buttonI); if(button_state==0) { Td = Td + 0.1; down = 1; } if (down) { //for faster/better button response delay(200); } //SELECTING BETWEEN HEATING, COOLING AND OFF if(Tc<=(Td-Th/2)){ comand = 1; } if(Tc>=(Td+Th/2)){ comand = -1; } if(Tc>Td && oldTc<=Td) { //hysteresis comand = 0; } if(Tc=Td) { //hysteresis comand = 0; } oldTc = Tc; //commands for heating, cooling and off lcd.setCursor(9, 0); if(comand==-1) { //cooling digitalWrite(4, HIGH); digitalWrite(5, LOW); lcd.print("COOLING"); } if(comand==1){ //heating digitalWrite(5, HIGH); digitalWrite(4, LOW); lcd.print("HEATING"); } if(comand==0) { //off digitalWrite(4, HIGH); digitalWrite(5, HIGH); lcd.print("OFF "); } }