#include "DHT.h" #include #include #define aref_voltage 5 LiquidCrystal_I2C lcd(0x27, 16, 2); int tempPin = A0; int tempReading; const byte buttonPin = 7; boolean buttonState = LOW; boolean lastButtonState = LOW; boolean stateChanged = false; float lastTemp = 0; float lastHumid = 0; float lasttemperatureC = 0; #define STATE_BEGIN 0 #define STATE_HIBERNATE 1 #define STATE_INCUBATE 2 int state = STATE_BEGIN; char *titles[] = {"Ant hibernation / incubation chamber", "Hibernate", "Incubate"}; #define DHTPIN 2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); analogReference(EXTERNAL); pinMode(4, OUTPUT); pinMode(3, OUTPUT); dht.begin(); lcd.begin(); lcd.print(titles[STATE_BEGIN]); pinMode(buttonPin, INPUT); } void printTemp(void) { float temp = dht.readTemperature(); float humid = dht.readHumidity(); tempReading = analogRead(tempPin); float voltage = tempReading * aref_voltage; voltage /= 1024.0; float temperatureC = (voltage - 0.5) * 100 ; if (temp != lastTemp || humid != lastHumid || lasttemperatureC != temperatureC) { lastTemp = temp; lastHumid = humid; lasttemperatureC = temperatureC; lcd.clear(); lcd.setCursor(0,0); lcd.print("Temp: "); lcd.print(temp); lcd.print(" C"); lcd.setCursor(0,1); lcd.print("Humid: "); lcd.print(humid); lcd.print(" %"); delay(3000); lcd.clear(); if(state == STATE_HIBERNATE){ lcd.setCursor(0,0); lcd.print("ID_Temp: 7 C"); }else if(state == STATE_INCUBATE){ lcd.setCursor(0,0); lcd.print("ID_Temp: 25 C"); } lcd.setCursor(0,1); lcd.print("Re_Temp: "); lcd.print(temperatureC); lcd.print(" C"); } } void printTitle(void) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Lasius Niger "); lcd.setCursor(0,1); lcd.print(titles[state]); } boolean isButtonPressed(void) { buttonState = digitalRead(buttonPin); if (buttonState != lastButtonState) { lastButtonState = buttonState; if (buttonState == HIGH) { return true; } } return false; } void checkState(void) { if (isButtonPressed()) { switch (state) { case STATE_BEGIN: case STATE_INCUBATE: state = STATE_HIBERNATE; break; case STATE_HIBERNATE: state = STATE_INCUBATE; break; } stateChanged = true; lastTemp = 0; lastHumid = 0; } else { stateChanged = false; } } void printToLCD(void) { if (stateChanged) { printTitle(); delay(2000); } switch (state) { case STATE_BEGIN: break; case STATE_HIBERNATE: case STATE_INCUBATE: printTemp(); break; } } void setPeltier(void){ tempReading = analogRead(tempPin); float voltage = tempReading * aref_voltage; voltage /= 1024.0; float temperatureC = (voltage - 0.5) * 100 ; delay(2500); if(state == STATE_HIBERNATE && temperatureC >= 5){ digitalWrite(4, LOW); digitalWrite(3, HIGH); }else if(state == STATE_HIBERNATE && temperatureC < 5) { digitalWrite(4, HIGH); digitalWrite(3, HIGH); }else if(state == STATE_INCUBATE && temperatureC <= 20){ digitalWrite(4, HIGH); digitalWrite(3, LOW); }else if(state == STATE_INCUBATE && temperatureC >= 27){ digitalWrite(4, LOW); digitalWrite(3, HIGH); }else { digitalWrite(4, HIGH); digitalWrite(3, HIGH); } } void loop() { checkState(); printToLCD(); setPeltier(); }