Created
May 4, 2024 14:09
-
-
Save Hiutaky/1e0c6e965d32d049c2ae6ea3693689bd to your computer and use it in GitHub Desktop.
Arduino Program to manage a little mushroom farm. Include 1 rele with 4 input, serial log (for backend purpose) and serial write to send commands.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include "DHT.h" //by adafruit (download entire library) | |
| #define UPDATE_INTERVAL 10000 | |
| //temperature pin, type dht11 | |
| #define DHT_P 8 | |
| //relé module | |
| #define LED_P A1//12v, 0.5ah - 6w | |
| #define FAN_P A2//12v, 0.5ah - 6w | |
| #define HUM_P A3//24v, 0.8ah - 20w | |
| //total consume = 32w/a | |
| #define DHTTYPE DHT11 | |
| //humidifier settings | |
| #define HUM_ON_THRESOLD 75 | |
| #define HUM_OFF_THRESOLD 90 | |
| DHT dht(DHT_P, DHTTYPE); | |
| uint32_t HOURS_12 = (uint32_t) 60 * 60 * 12; | |
| //manual controls - Override automatic | |
| bool manualHum = false; | |
| bool manualFan = false; | |
| bool manualLed = false; | |
| //automatic controls | |
| bool ledActive = false; | |
| bool humActive = false; | |
| float ledTimer = 0; | |
| void setup() { | |
| initRele(LED_P); | |
| initRele(FAN_P); | |
| initRele(HUM_P); | |
| Serial.begin(9600); | |
| dht.begin(); | |
| } | |
| void loop() { | |
| float h = dht.readHumidity(); | |
| float t = dht.readTemperature(); | |
| checkHumidifier(h); | |
| checkLed(); | |
| readSerial(); | |
| writeSerial(h, t); | |
| delay(UPDATE_INTERVAL); | |
| } | |
| //set rele pins as output and disabled | |
| void initRele(int pin) { | |
| pinMode(pin, OUTPUT); | |
| digitalWrite(pin, HIGH); | |
| } | |
| void writeSerial(float h, float t) { | |
| String payload = | |
| "temperature:" + String(t) + | |
| ",humidity:" + String(h) + | |
| ",humidifier:" + String(humActive || manualHum) + | |
| ",fan:" + String(humActive || manualFan) + | |
| ",led:" + String(ledActive || manualLed) + | |
| ",ledTimer:"+ String(ledTimer); | |
| Serial.println(payload); | |
| } | |
| void readSerial() { | |
| while(Serial.available()) { | |
| String command = (String) Serial.readString(); | |
| //serial commands dispatcher | |
| if( command == "ON_LED" ) | |
| on_led(); | |
| if( command == "OFF_LED" ) | |
| off_led(); | |
| if( command == "ON_FAN" ) | |
| on_fan(); | |
| if( command == "OFF_FAN" ) | |
| off_fan(); | |
| if( command == "ON_HUM" ) | |
| on_hum(); | |
| if( command == "OFF_HUM" ) | |
| off_hum(); | |
| } | |
| } | |
| //manual actions | |
| void on_led() { | |
| if( ! manualLed ) | |
| manualLed = true; | |
| digitalWrite(LED_P, LOW); | |
| } | |
| void off_led() { | |
| if( manualLed ) | |
| manualLed = false; | |
| digitalWrite(LED_P, HIGH); | |
| } | |
| void on_fan() { | |
| if( ! manualFan ) | |
| manualFan = true; | |
| digitalWrite(FAN_P, LOW); | |
| } | |
| void off_fan() { | |
| if( manualFan ) | |
| manualFan = false; | |
| digitalWrite(FAN_P, HIGH); | |
| } | |
| void on_hum() { | |
| if( ! manualHum ) | |
| manualHum = true; | |
| digitalWrite(HUM_P, LOW); | |
| } | |
| void off_hum() { | |
| if( manualHum ) | |
| manualHum = false; | |
| digitalWrite(HUM_P, HIGH); | |
| } | |
| //automated actions | |
| void checkHumidifier(float humidity) { | |
| //if manual control over LED then skip | |
| if( ! manualHum ) { | |
| //activate humidifier if humidity <= minimum threshold | |
| if( ! humActive && humidity <= HUM_ON_THRESOLD ) { | |
| digitalWrite(FAN_P, LOW); | |
| digitalWrite(HUM_P, LOW); | |
| humActive = true; | |
| } | |
| //deactivate humidifier if humidity >= max threshold | |
| if( humActive && humidity >= HUM_OFF_THRESOLD ) { | |
| digitalWrite(FAN_P, HIGH); | |
| digitalWrite(HUM_P, HIGH); | |
| humActive = false; | |
| } | |
| } | |
| } | |
| void checkLed() { | |
| //12 hours on - 12 hours off | |
| //if manualLed is on (you tanking over of controls) then skip | |
| if( ! manualLed ) { | |
| if( ! ledActive && ledTimer >= HOURS_12 ) { | |
| digitalWrite(LED_P, LOW); | |
| ledActive = true; | |
| ledTimer = 0; | |
| } | |
| if( ledActive && ledTimer >= HOURS_12 ) { | |
| digitalWrite(LED_P, HIGH); | |
| ledActive = false; | |
| ledTimer = 0; | |
| } | |
| ledTimer += UPDATE_INTERVAL / 1000;//in seconds | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment