#include dht DHT; #define __debug #define PROGRAM_VERSION "0.4.0" #define DHT11_PIN 2 #define RelayPin 3 #define LEDCount 6 #define LED1Pin 4 #define LED2Pin 5 #define LED3Pin 6 #define LED4Pin 7 #define LED5Pin 8 #define LED6Pin 9 #define ButtonPin 13 #define TEMPERATURE_SAMPLES 10 int leds[LEDCount]; double Setpoint; int SetpointMode; boolean relayState; double temperaturaQueAchava; double temperaturaMedia[TEMPERATURE_SAMPLES]; int temperaturaMediaIndex; boolean tempSensorOK; //unsigned long elapsed; void setup() { Serial.begin(115200); Serial.println("Greenhouse - for beer fermentation"); Serial.print("PROGRAM VERSION: "); Serial.println(PROGRAM_VERSION); Serial.print("\tDHT LIBRARY VERSION: "); Serial.println(DHT_LIB_VERSION); Serial.println(); Serial.println("Temp Sensor,\tSensor Status,\temperaturaAlvo (C),\temperaturaQueDiz (C),\ttempetaturaQueEuAcho (C),\tRelay State (ON\\OFF)"); leds[0] = LED1Pin; leds[1] = LED2Pin; leds[2] = LED3Pin; leds[3] = LED4Pin; leds[4] = LED5Pin; leds[5] = LED6Pin; Setpoint = 18.0; SetpointMode = 18; temperaturaQueAchava = 200.0; // Relay relayState = false; pinMode(RelayPin, OUTPUT); digitalWrite(RelayPin, HIGH); // LEDs pinMode(LED1Pin, OUTPUT); pinMode(LED2Pin, OUTPUT); pinMode(LED3Pin, OUTPUT); pinMode(LED4Pin, OUTPUT); pinMode(LED5Pin, OUTPUT); pinMode(LED6Pin, OUTPUT); digitalWrite(LED1Pin, LOW); digitalWrite(LED2Pin, LOW); digitalWrite(LED3Pin, LOW); digitalWrite(LED4Pin, LOW); digitalWrite(LED5Pin, LOW); digitalWrite(LED6Pin, LOW); // Button pinMode(ButtonPin, INPUT); for( temperaturaMediaIndex = 0; temperaturaMediaIndex < TEMPERATURE_SAMPLES; temperaturaMediaIndex++ ) { temperaturaMedia[temperaturaMediaIndex] = Setpoint; } setLEDs(SetpointMode); tempSensorOK = false; //elapsed = millis(); } void loop() { /*if ( millis() - 4000 > elapsed ) { Serial.println("Temp Sensor,\tSensor Status,\temperaturaAlvo (C),\temperaturaQueDiz (C),\ttempetaturaQueEuAcho (C),\tRelay State (ON\\OFF)"); elapsed = millis(); }*/ 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 { // set manual temperatures Setpoint = SetpointMode; } } // Read data off of the DHT11 sensor int chk = DHT.read11(DHT11_PIN); // debug received data tempSensorOK = debugDHT(chk); if(tempSensorOK) { double temperaturaQueDiz = DHT.temperature; if (temperaturaQueAchava == 200.0) { temperaturaQueAchava = temperaturaQueDiz; } // Calcular a temperatura de processamento temperaturaMediaIndex++; if ( temperaturaMediaIndex >= TEMPERATURE_SAMPLES ) { 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; } } 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(""); 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 ); } else { if ( tempetaturaQueEuAcho <= (Setpoint - 0.0) ) { // turn off compressor to stop cooling relayState = false; digitalWrite( RelayPin, HIGH ); } } #ifdef __debug if (relayState) { Serial.println( "ON" ); } else { Serial.println( "OFF" ); } #endif temperaturaQueAchava = tempetaturaQueEuAcho; delay(50); //delay(100); } } void setLEDs( int number ) { int calcNumber = number; for ( int i = (LEDCount - 1); i >= 0; i-- ) { boolean zero = ((calcNumber % 2) == 0) ? true : false; calcNumber /= 2; if (zero) { digitalWrite(leds[i], LOW); } else { digitalWrite(leds[i], HIGH); } } } boolean hasBtnPressed() { if ( digitalRead(ButtonPin) == HIGH ) { while ( digitalRead(ButtonPin) ) { delay(20); } // debounce delay(20); return true; } else { return false; } } boolean debugDHT( int chk ) { boolean ret = false; #ifdef __debug //Serial.print("DHT11, "); #endif switch (chk) { case DHTLIB_OK: ret = true; #ifdef __debug Serial.print("DHT11, "); Serial.print("OK, "); #endif break; case DHTLIB_ERROR_CHECKSUM: Serial.print("Checksum error, "); break; case DHTLIB_ERROR_TIMEOUT: Serial.print("Time out error, "); break; case DHTLIB_ERROR_CONNECT: //Serial.print("Connect error, "); /* relayState = false; digitalWrite( RelayPin, HIGH ); setLEDs(63); while(true) Serial.println("ERROR, SAFEMODE ON!!!!"); */ break; case DHTLIB_ERROR_ACK_L: Serial.print("Ack Low error, "); break; case DHTLIB_ERROR_ACK_H: Serial.print("Ack High error, "); break; default: Serial.print("Unknown error, "); break; } #ifdef __debug //Serial.print(DHT.humidity, 1); //Serial.print(", "); #endif return ret; }