From 8ad766c377b6b5555e894cc8730a00815c5d5751 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sat, 17 May 2025 12:47:59 +0200 Subject: [PATCH] Make sensor initialization and measurement more dynamic by checking which one are declared in config.h --- firmware/atmega/include/config.h | 13 +++------- firmware/atmega/include/moisture.h | 41 ++++++++++++++++++++++++++++-- firmware/atmega/source/moisture.c | 35 +++++++------------------ 3 files changed, 52 insertions(+), 37 deletions(-) diff --git a/firmware/atmega/include/config.h b/firmware/atmega/include/config.h index a9c982a..2e11bcc 100644 --- a/firmware/atmega/include/config.h +++ b/firmware/atmega/include/config.h @@ -1,28 +1,23 @@ #ifndef CONFIG_H #define CONFIG_H -//#define VASE_NUM 0 - #define MOISTURE_SENSOR_A0 PC0 #define MOISTURE_SENSOR_A1 PC1 #define MOISTURE_SENSOR_A2 PC2 #define MOISTURE_SENSOR_A3 PC3 #define MOISTURE_SENSOR_A4 PC4 #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 -// You may just connect the pumps that actually are needed in the vase -// or define only the connected pumps on your system #define PUMP_D3 PD3 #define PUMP_D4 PD4 #define PUMP_D5 PD5 -#define PUMP_D6 PD6 -#define PUMP_D7 PD7 +//#define PUMP_D6 PD6 +//#define PUMP_D7 PD7 +// TODO: write these to eeprom #define SENSOR_READINGS 5 -#define SENSORS_NUM 6 +//#define VASE_NUM 0 #endif diff --git a/firmware/atmega/include/moisture.h b/firmware/atmega/include/moisture.h index 1e11fe0..fc48ca2 100644 --- a/firmware/atmega/include/moisture.h +++ b/firmware/atmega/include/moisture.h @@ -3,12 +3,49 @@ #include #include +#include "config.h" + +static const int8_t sensorPins[] = { + #ifdef MOISTURE_SENSOR_A0 + MOISTURE_SENSOR_A0, + #endif + + #ifdef MOISTURE_SENSOR_A1 + MOISTURE_SENSOR_A1, + #endif + + #ifdef MOISTURE_SENSOR_A2 + MOISTURE_SENSOR_A2, + #endif + + #ifdef MOISTURE_SENSOR_A3 + MOISTURE_SENSOR_A3, + #endif + + #ifdef MOISTURE_SENSOR_A4 + MOISTURE_SENSOR_A4, + #endif + + #ifdef MOISTURE_SENSOR_A5 + MOISTURE_SENSOR_A5, + #endif + + #ifdef MOISTURE_SENSOR_A6 + MOISTURE_SENSOR_A6, + #endif + + #ifdef MOISTURE_SENSOR_A7 + MOISTURE_SENSOR_A7, + #endif + }; + +#define SENSORS_NUM (sizeof(sensorPins) / sizeof(sensorPins[0])) + +extern volatile bool readSensors; void sensorsInit(void); void triggerMoistureRead(void); int16_t moistureAverage(int8_t sensorPin); int16_t moistureRead(void); -extern volatile bool readSensors; - #endif diff --git a/firmware/atmega/source/moisture.c b/firmware/atmega/source/moisture.c index 4b3ae50..505f160 100644 --- a/firmware/atmega/source/moisture.c +++ b/firmware/atmega/source/moisture.c @@ -9,24 +9,12 @@ volatile bool readSensors = false; void sensorsInit(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)); + uint8_t sensorMask = 0; + for (uint8_t i = 0; i < SENSORS_NUM; i++) { + sensorMask |= (1 << sensorPins[i]); + } + DDRC &= ~sensorMask; + PORTC &= ~sensorMask; } void triggerMoistureRead(void) { @@ -45,16 +33,11 @@ int16_t moistureAverage(int8_t sensorPin) { } int16_t moistureRead(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 }; + uint16_t overallSum = 0; - int16_t overallSum = 0; - - for (int i = 0; i < SENSORS_NUM; i++) { + for (int8_t i = 0; i < SENSORS_NUM; i++) { int16_t sensorAverage = moistureAverage(sensorPins[i]); - //TODO: if a sensor gives 0 or 1023, discard that sensor entirely (means it is disconnected or not working) + //TODO: if a sensor gives 0, discard that sensor entirely (means it is disconnected or not working) overallSum += sensorAverage; }