diff --git a/src/atmega/config.h b/src/atmega/config.h index 7aa0986..6041674 100644 --- a/src/atmega/config.h +++ b/src/atmega/config.h @@ -9,10 +9,11 @@ #define MOISTURE_SENSOR_A5 PC5 // NOTE: PC6 PC7 are not accessible by default on Arduino Uno R3 // You need to use the ATMega328p on a custom PCB and use pins 1 and 2 -#define MOISTURE_SENSOR_A6 PC6 -#define MOISTURE_SENSOR_A7 PC7 +//#define MOISTURE_SENSOR_A6 PC6 +//#define MOISTURE_SENSOR_A7 PC7 #define SENSOR_READINGS 5 +#define SENSORS_NUM 6 #endif diff --git a/src/atmega/main.c b/src/atmega/main.c index ac81129..e6c4eb9 100644 --- a/src/atmega/main.c +++ b/src/atmega/main.c @@ -4,9 +4,10 @@ #include #include #include "moisture.h" +#include "adc.h" ISR(WDT_vect) { - readSensors = true; + triggerSensorsRead(); } void watchdogs(void) { @@ -25,7 +26,8 @@ void enterSleep(void) { } void setup(void) { - initMoistureSensor(); + adcInit(); + initMoistureSensors(); watchdogs(); } @@ -33,13 +35,10 @@ int main(void) { setup(); while(true) { - if (readSensors) { int16_t result = readMoisture(); - if (result != -1) { - //Serial.println(result); - readSensors = false; - } + + //TODO: send result to esp32 } enterSleep(); } diff --git a/src/atmega/moisture.c b/src/atmega/moisture.c index 64bf6f1..746d847 100644 --- a/src/atmega/moisture.c +++ b/src/atmega/moisture.c @@ -6,36 +6,57 @@ #include "config.h" #include "adc.h" -static int16_t moistureReadingSum = 0; -static int8_t moistureReadingCount = 0; - volatile bool readSensors = false; -void initMoistureSensor(void) { - DDRC &= ~(1 << MOISTURE_SENSOR_A0); // set as input - PORTC &= ~(1 << MOISTURE_SENSOR_A0); //disable pullup +void initMoistureSensors(void) { + // Set as input + DDRC &= ~((1 << MOISTURE_SENSOR_A0) | + (1 << MOISTURE_SENSOR_A1) | + (1 << MOISTURE_SENSOR_A2) | + (1 << MOISTURE_SENSOR_A3) | + (1 << MOISTURE_SENSOR_A4) | + (1 << MOISTURE_SENSOR_A5)) ; + //(1 << MOISTURE_SENSOR_A6) | + //(1 << MOISTURE_SENSOR_A7)); + // Disable pullup + PORTC &= ~((1 << MOISTURE_SENSOR_A0) | + (1 << MOISTURE_SENSOR_A1) | + (1 << MOISTURE_SENSOR_A2) | + (1 << MOISTURE_SENSOR_A3) | + (1 << MOISTURE_SENSOR_A4) | + (1 << MOISTURE_SENSOR_A5)) ; + //(1 << MOISTURE_SENSOR_A6) | + //(1 << MOISTURE_SENSOR_A7)); } -void triggerSensorRead(void) { +void triggerSensorsRead(void) { readSensors = true; } -int16_t readMoisture(void) { - if (!readSensors) - return -1; - - adcInit(); - moistureReadingSum += adcRead(MOISTURE_SENSOR_A0); - moistureReadingCount++; - - //TODO: implement variance check (if over a certain variance discard measurements for this cicle) - if (moistureReadingCount >= SENSOR_READINGS) { - int16_t average = moistureReadingSum / SENSOR_READINGS; - moistureReadingSum = 0; - moistureReadingCount = 0; - readSensors = false; - return average; - } else readSensors = true; - - return -1; +int16_t moistureSensorsAverage(int8_t sensorPin) { + int16_t sum = 0; + for (int i = 0; i < SENSOR_READINGS; i++) { + sum += adcRead(sensorPin); + //TODO: implement variance check (if over a certain variance discard measurements for this cycle) + //TODO: maybe add a small delay using watchdog here? + //TODO IMPORTANT: if value < 1 or > 1022, discard that measurement + } + return sum / SENSOR_READINGS; +} + +int16_t readMoisture(void) { + uint8_t sensorPins[SENSORS_NUM] = { MOISTURE_SENSOR_A0, MOISTURE_SENSOR_A1, + MOISTURE_SENSOR_A2, MOISTURE_SENSOR_A3, + MOISTURE_SENSOR_A4, MOISTURE_SENSOR_A5 }; + //MOISTURE_SENSOR_A6, MOISTURE_SENSOR_A7 }; + + int16_t overallSum = 0; + + for (int i = 0; i < SENSORS_NUM; i++) { + int16_t sensorAverage = moistureSensorsAverage(sensorPins[i]); + //TODO: if a sensor gives 0 or 1023, discard that sensor entirely (means it is disconnected or not working) + overallSum += sensorAverage; + } + + return overallSum / SENSORS_NUM; } diff --git a/src/atmega/moisture.h b/src/atmega/moisture.h index 1f17008..a5a36d1 100644 --- a/src/atmega/moisture.h +++ b/src/atmega/moisture.h @@ -4,9 +4,10 @@ #include #include -void initMoistureSensor(void); +void initMoistureSensors(void); +void triggerSensorsRead(void); +int16_t moistureSensorsAverage(int8_t sensorPin); int16_t readMoisture(void); -void triggerSensorRead(void); extern volatile bool readSensors;