Skip to content

Instantly share code, notes, and snippets.

@Hiutaky
Created May 4, 2024 14:09
Show Gist options
  • Select an option

  • Save Hiutaky/1e0c6e965d32d049c2ae6ea3693689bd to your computer and use it in GitHub Desktop.

Select an option

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.
#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