diff --git a/greenhouse.ino b/greenhouse.ino index e83615bfecf13441db42c34e3cbb4372fd6508ca..df8601a01a7ec968a4965fabeab4329ed655ab23 100644 --- a/greenhouse.ino +++ b/greenhouse.ino @@ -1,9 +1,10 @@ - +#include #include dht DHT; -#define __debug +//#define __debug +#define __info #define PROGRAM_VERSION "0.4.0" @@ -18,6 +19,22 @@ dht DHT; #define LED6Pin 9 #define ButtonPin 13 #define TEMPERATURE_SAMPLES 10 +#define TEMPERATURE_SAMPLES_TC 30 +#define MINIMUM_TIME_OFF 480000 // 8 min +#define TC_TEMP_OFFSET 0.0 + + +// ############## +int thermoDO = A2; +int thermoCS = A1; +int thermoCLK = A0; +int thermoUnits = 1; +MAX6675 thermocouple(thermoCS, thermoDO, thermoCLK, thermoUnits); +//MAX6675 thermocouple(thermoCS,thermoDO,thermoCLK,units); +double temperaturaQueAchavaTC; +double temperaturaMediaTC[TEMPERATURE_SAMPLES_TC]; +int temperaturaMediaIndexTC; +// ############## int leds[LEDCount]; double Setpoint; @@ -29,6 +46,11 @@ int temperaturaMediaIndex; boolean tempSensorOK; //unsigned long elapsed; +unsigned long currentTime; +unsigned long tcReadTime; +unsigned long dhtReadTime; +unsigned long lastTurnOff; + void setup() { Serial.begin(115200); @@ -39,6 +61,10 @@ void setup() Serial.println(DHT_LIB_VERSION); Serial.println(); Serial.println("Temp Sensor,\tSensor Status,\temperaturaAlvo (C),\temperaturaQueDiz (C),\ttempetaturaQueEuAcho (C),\tRelay State (ON\\OFF)"); + + // ############## + temperaturaQueAchavaTC = 200.0; + // ############## leds[0] = LED1Pin; leds[1] = LED2Pin; @@ -46,9 +72,15 @@ void setup() leds[3] = LED4Pin; leds[4] = LED5Pin; leds[5] = LED6Pin; - Setpoint = 18.0; - SetpointMode = 18; + Setpoint = 0.0; + SetpointMode = 0; temperaturaQueAchava = 200.0; + + // Read Timmers + currentTime = millis(); + tcReadTime = millis(); + dhtReadTime = millis(); + lastTurnOff = 0; // Relay relayState = false; @@ -75,6 +107,9 @@ void setup() for( temperaturaMediaIndex = 0; temperaturaMediaIndex < TEMPERATURE_SAMPLES; temperaturaMediaIndex++ ) { temperaturaMedia[temperaturaMediaIndex] = Setpoint; } + for( temperaturaMediaIndexTC = 0; temperaturaMediaIndexTC < TEMPERATURE_SAMPLES_TC; temperaturaMediaIndexTC++ ) { + temperaturaMediaTC[temperaturaMediaIndexTC] = Setpoint; + } setLEDs(SetpointMode); @@ -84,49 +119,96 @@ void setup() void loop() { - /*if ( millis() - 4000 > elapsed ) { - Serial.println("Temp Sensor,\tSensor Status,\temperaturaAlvo (C),\temperaturaQueDiz (C),\ttempetaturaQueEuAcho (C),\tRelay State (ON\\OFF)"); - elapsed = millis(); - }*/ + processBtnPress(); - if ( hasBtnPressed() ) { + double temperaturaQueDizTC = 0; + currentTime = millis(); + if (currentTime > (tcReadTime + 50)) { + tcReadTime = millis(); + temperaturaQueDizTC = thermocouple.read_temp() + TC_TEMP_OFFSET; + } + + if(temperaturaQueDizTC != 0) { - // increase mode - SetpointMode++; + if (temperaturaQueAchavaTC == 200.0) { + temperaturaQueAchavaTC = temperaturaQueDizTC; - // reset mode back to 0 - if ( SetpointMode > 63 ) { - SetpointMode = 0; + if(millis() < 1000) { + for( temperaturaMediaIndexTC = 0; temperaturaMediaIndexTC < TEMPERATURE_SAMPLES_TC; temperaturaMediaIndexTC++ ) { + temperaturaMediaTC[temperaturaMediaIndexTC] = temperaturaQueAchavaTC; + } + } + } + + // Calcular a temperatura de processamento + temperaturaMediaIndexTC++; + if ( temperaturaMediaIndexTC >= TEMPERATURE_SAMPLES_TC ) { + temperaturaMediaIndexTC = 0; } - // change leds - setLEDs(SetpointMode); - - - if ( SetpointMode > 31 ) { - - ///TODO set automatic fermentation temperatures - Setpoint = SetpointMode - 32 + 0.5; + if (temperaturaQueDizTC > (temperaturaQueAchavaTC + 0)) { + //Serial.print("+0.1, "); + temperaturaMediaTC[temperaturaMediaIndexTC] = (temperaturaQueAchavaTC + 0.2); } else { + if (temperaturaQueDizTC < (temperaturaQueAchavaTC - 0.1)) { + //Serial.print("-0.1, "); + temperaturaMediaTC[temperaturaMediaIndexTC] = (temperaturaQueAchavaTC - 1.0); + } + else { + //Serial.print(", "); + temperaturaMediaTC[temperaturaMediaIndexTC] = temperaturaQueDizTC; + } + } - // set manual temperatures - Setpoint = SetpointMode; + // Calcula a média + double tempetaturaQueEuAchoTC = 0.0; + for ( int i = 0; i < TEMPERATURE_SAMPLES_TC; i++ ) { + tempetaturaQueEuAchoTC += temperaturaMediaTC[i]; } - } + tempetaturaQueEuAchoTC /= TEMPERATURE_SAMPLES_TC; + + // Grava o valor aual para o proximo ciclo + temperaturaQueAchavaTC = tempetaturaQueEuAchoTC; - // Read data off of the DHT11 sensor - int chk = DHT.read11(DHT11_PIN); +#ifdef __debug + Serial.print(millis()); + Serial.print(", ThermoCouple, "); + Serial.print(Setpoint, 2); + Serial.print(", "); + Serial.print(temperaturaQueDizTC, 2); + Serial.print(", "); + Serial.println(tempetaturaQueEuAchoTC, 2); +#endif + } - // debug received data - tempSensorOK = debugDHT(chk); + currentTime = millis(); + if (currentTime > (dhtReadTime + 200)) { + + // Read data off of the DHT11 sensor + int chk = DHT.read11(DHT11_PIN); + // debug received data + tempSensorOK = debugDHT(chk); + + dhtReadTime = millis(); + } + else { + tempSensorOK = false; + } + if(tempSensorOK) { double temperaturaQueDiz = DHT.temperature; if (temperaturaQueAchava == 200.0) { temperaturaQueAchava = temperaturaQueDiz; + + if(millis() < 1000) { + for( temperaturaMediaIndex = 0; temperaturaMediaIndex < TEMPERATURE_SAMPLES; temperaturaMediaIndex++ ) { + temperaturaMedia[temperaturaMediaIndex] = temperaturaQueAchava; + } + } } // Calcular a temperatura de processamento @@ -135,84 +217,131 @@ void loop() temperaturaMediaIndex = 0; } - /*Serial.print("t["); - Serial.print(temperaturaMediaIndex); - Serial.print("]="); - Serial.print(temperaturaQueAchava);*/ if (temperaturaQueDiz > (temperaturaQueAchava + 0)) { - //Serial.print("+0.1, "); temperaturaMedia[temperaturaMediaIndex] = (temperaturaQueAchava + 0.2); } else { if (temperaturaQueDiz < (temperaturaQueAchava - 0.1)) { - //Serial.print("-0.1, "); temperaturaMedia[temperaturaMediaIndex] = (temperaturaQueAchava - 1.0); } else { - //Serial.print(", "); temperaturaMedia[temperaturaMediaIndex] = temperaturaQueDiz; } } + // Calcula a média double tempetaturaQueEuAcho = 0.0; for ( int i = 0; i < TEMPERATURE_SAMPLES; i++ ) { - /*Serial.print(temperaturaMedia[i]); - Serial.print(" ");*/ tempetaturaQueEuAcho += temperaturaMedia[i]; } tempetaturaQueEuAcho /= TEMPERATURE_SAMPLES; - //Serial.print(", "); - - /* - - if (temperaturaQueAchava > temperaturaQueDiz) - tempetaturaQueEuAcho = temperaturaQueAchava - 0.25; - else if (temperaturaQueAchava < temperaturaQueDiz) - tempetaturaQueEuAcho = temperaturaQueAchava + 0.25; - else - tempetaturaQueEuAcho = temperaturaQueAchava; - - //tempetaturaQueEuAcho = temperaturaQueDiz; - */ - #ifdef __debug - Serial.print(""); + // Grava o valor aual para o proximo ciclo + temperaturaQueAchava = tempetaturaQueEuAcho; + +#ifdef __debug + Serial.print(millis()); + Serial.print(", DHT, "); Serial.print(Setpoint, 2); Serial.print(", "); Serial.print(temperaturaQueDiz, 2); Serial.print(", "); - Serial.print(tempetaturaQueEuAcho, 2); - Serial.print(", "); - #endif - - if ( tempetaturaQueEuAcho >= (Setpoint + 1.0) ) { - - // turn on compressor to start cooling - relayState = true; - digitalWrite( RelayPin, LOW ); + Serial.println(tempetaturaQueEuAcho, 2); +#endif + + executeCompressorControl( tempetaturaQueEuAcho, Setpoint ); + } + + #ifdef __info + Serial.print(millis()); + Serial.print(", "); + Serial.print(Setpoint, 2); + Serial.print(", "); + Serial.print(temperaturaQueAchava, 2); + Serial.print(", "); + Serial.print(temperaturaQueAchavaTC, 2); + Serial.print(", "); + Serial.println(relayState?"1":"0"); +#endif +} + +void processBtnPress() { + if ( hasBtnPressed() ) { + + // increase mode + SetpointMode++; + + // reset mode back to 0 + if ( SetpointMode > 63 ) { + SetpointMode = 0; + } + + // change leds + setLEDs(SetpointMode); + + if ( SetpointMode > 31 ) { + + ///TODO set automatic fermentation temperatures + Setpoint = SetpointMode - 32 + 0.5; } else { - if ( tempetaturaQueEuAcho <= (Setpoint - 0.0) ) { - - // turn off compressor to stop cooling - relayState = false; - digitalWrite( RelayPin, HIGH ); - } + + // set manual temperatures + Setpoint = SetpointMode; } - - #ifdef __debug - if (relayState) { - Serial.println( "ON" ); + } +} + +void executeCompressorControl( double tempetaturaAtual, double temperaturaTarget ) { + if ( tempetaturaAtual >= (temperaturaTarget + 1.0) ) { + setCompressor(true); + } + else { + if ( tempetaturaAtual <= (temperaturaTarget - 0.0) ) { + setCompressor(false); + } + } +} + +void setCompressor( boolean turnIt ) { + currentTime = millis(); + + if(relayState) { + if(turnIt) { + // Nothing to do, it is on, will stay on } else { - Serial.println( "OFF" ); + // turn off compressor to stop cooling + lastTurnOff = currentTime; + relayState = false; + digitalWrite( RelayPin, HIGH ); + } + } + else { + if(turnIt) { + if( currentTime >= (lastTurnOff + MINIMUM_TIME_OFF)) { + // turn on compressor to start cooling + relayState = true; + digitalWrite( RelayPin, LOW ); + } + } + else { + // Nothing to do, it is off, will stay off } - #endif - - temperaturaQueAchava = tempetaturaQueEuAcho; - delay(50); - //delay(100); } + +#ifdef __debug + Serial.print(millis()); + Serial.print(", Compressor, "); + Serial.print(Setpoint, 2); + Serial.print(", "); + if (relayState) { + Serial.println( "ON" ); + } + else { + Serial.println( "OFF" ); + } +#endif } void setLEDs( int number ) { @@ -258,10 +387,10 @@ boolean debugDHT( int chk ) { { case DHTLIB_OK: ret = true; -#ifdef __debug +/*#ifdef __debug Serial.print("DHT11, "); Serial.print("OK, "); -#endif +#endif*/ break; case DHTLIB_ERROR_CHECKSUM: Serial.print("Checksum error, ");