#include #include "helpers.hpp" #include "config.hpp" typedef struct { PotConfig &config; unsigned long last_watering; // anything changing per pot goes here } Pot; Pot pots[length(POT_CONFIGS)]; void setup() { Serial.begin(9600); pinMode(6, OUTPUT); //Enable pinMode(5, OUTPUT); //Puls pinMode(13, OUTPUT); //Status LED pinMode(4, OUTPUT); //Enable6 halten pinMode(2, OUTPUT); //Puls5- pinMode(3, OUTPUT); //Direction4- // link pots to their config for (unsigned int i = 0; i < length(pots); i++) { pots[i].config = POT_CONFIGS[i]; // TODO maybe set pinMode for valve and sensor pins? } } void loop() { for (unsigned int i = 0; i < length(pots); i++) { per_pot(pots[i]); } delay(LOOP_DELAY_MS); } void per_pot(Pot &pot) { Serial.println(pot.config.name); int sensorVal = analogRead(pot.config.sensor_pin); int percentage = humidity_percentage(sensorVal); Serial.print(sensorVal); Serial.print(F(" -> ")); Serial.print(percentage); Serial.println(F("%")); if (percentage > MAX_HUMIDITY_PERCENT) { Serial.println(F("too wet -> not watering")); } else if (pot.last_watering + MIN_WATERING_INTERVAL_MS > millis()) { Serial.println(F("watered recently -> not watering")); } else if (percentage < MIN_HUMIDITY_PERCENT) { Serial.println(F("too dry -> watering")); water_pot(pot); } else if (pot.last_watering + MAX_WATERING_INTERVAL_MS < millis()){ Serial.println(F("not been watered for a long time -> watering")); water_pot(pot); } else { Serial.println(F("happy plant")); } } void water_pot(Pot &pot) { open_valve(pot.config.valve_pin); start_pump(); delay(WATER_TIME_MS); stop_pump(); close_valve(pot.config.valve_pin); pot.last_watering = millis(); } int humidity_percentage(int sensorValue) { // Sensor has a range of 236 to 520 // We want to translate this to a scale or 0% to 100% // More info: https://www.arduino.cc/reference/en/language/functions/math/map/ return map(sensorValue, SENSOR_CALIBRATION_WET, SENSOR_CALIBRATION_DRY, 100, 0); } void start_pump() { // TODO start pump delay(PUMP_DELAY_MS); } void stop_pump() { // TODO stop pump delay(PUMP_DELAY_MS); } void open_valve(int valve) { // TODO open valve delay(VALVE_DELAY_MS); } void close_valve(int valve) { // TODO close valve delay(VALVE_DELAY_MS); }