diff --git a/WifiControlSensor/GPIOSensor.cpp b/WifiControlSensor/GPIOSensor.cpp new file mode 100644 index 0000000..2c3c4f3 --- /dev/null +++ b/WifiControlSensor/GPIOSensor.cpp @@ -0,0 +1,33 @@ +#include "GPIOSensor.h" + + +GPIOSensor::GPIOSensor(char *sName, char *mName, + uint8_t gpioPin, bool analog, int8_t power): + sensorName(sName), measureName(mName), + gpio(gpioPin), isAnalog(analog), powerGpio(power), lastMeasure(0){ + if(powerGpio >= 0){ + pinMode(powerGpio, OUTPUT); + } + } + +int GPIOSensor::getMeasure(int &level){ + if(powerGpio >= 0){ + digitalWrite(powerGpio, HIGH); + delay(50); + } + if(isAnalog) + level = analogRead(gpio); + else + level = digitalRead(gpio); + if(powerGpio >= 0){ + digitalWrite(powerGpio, LOW); + delay(50); + } + lastMeasure = level; + return 0; +} + + +int GPIOSensor::getLastMeasure(){ + return lastMeasure; +} diff --git a/WifiControlSensor/GPIOSensor.h b/WifiControlSensor/GPIOSensor.h new file mode 100644 index 0000000..59a61f1 --- /dev/null +++ b/WifiControlSensor/GPIOSensor.h @@ -0,0 +1,17 @@ +#pragma once +#include "Arduino.h" + +class GPIOSensor{ +public: + char *sensorName; + char *measureName; + uint8_t gpio; + bool isAnalog; + int8_t powerGpio; + int lastMeasure; + + GPIOSensor(char *sensorName, char *measureName, uint8_t gpio, bool isAnalog=false, int8_t powerGpio = -1); + int getMeasure(int &level); + int getLastMeasure(); + +}; diff --git a/WifiControlSensor/MQTT.h b/WifiControlSensor/MQTT.h index 8a22652..52315b5 100644 --- a/WifiControlSensor/MQTT.h +++ b/WifiControlSensor/MQTT.h @@ -9,12 +9,12 @@ int MqttSetup(char *server, char *user, char *passwd, int port, char * hostname) template int MqttPublish(Adafruit_MQTT_Publish *publisher, T value); int MqttPublishBMP180(double temp, double pressure); int MqttPublishDHT(float temp, float humidity); -int MqttPublishDry(int dry); int MqttPublishIp(const String &ip); void MqttCheckSubscription(); void MqttChangeGpioValue(int gpio, int value); void MqttChangePWMValue(int gpio, int value); bool MqttIsConfigured(); +int MqttPublishGPIO(); #else int MqttConnect(){return 0;} int MqttIsConnected(){return 0;} @@ -22,10 +22,10 @@ int MqttSetup(char *server, char *user, char *passwd, int port, char * hostname) template int MqttPublish(Adafruit_MQTT_Publish *publisher, T value){return 0;} int MqttPublishBMP180(double temp, double pressure){return 0;} int MqttPublishDHT(float temp, float humidity){return 0;} -int MqttPublishDry(int dry){return 0;} int MqttPublishIP(const String &ip){return 0;} void MqttCheckSubscription(){} void MqttChangeGpioValue(int gpio, int value){} void MqttChangePWMValue(int gpio, int value){} bool MqttIsConfigured(){} +int MqttPublishGPIO(){return 0;} #endif diff --git a/WifiControlSensor/MQTT.ino b/WifiControlSensor/MQTT.ino index f3fcb2b..b94d34f 100644 --- a/WifiControlSensor/MQTT.ino +++ b/WifiControlSensor/MQTT.ino @@ -2,25 +2,26 @@ #include #include "utils.h" #include "MQTT.h" +#include "sensors.h" Adafruit_MQTT_Client *mqtt; Adafruit_MQTT_Publish *mqtt_temp; Adafruit_MQTT_Publish *mqtt_pressure; Adafruit_MQTT_Publish *mqtt_dht_temp; Adafruit_MQTT_Publish *mqtt_dht_humidity; -Adafruit_MQTT_Publish *mqtt_dry; Adafruit_MQTT_Publish *mqtt_ip; Adafruit_MQTT_Publish *mqttGpio[MAXSUBSCRIPTIONS] = {}; Adafruit_MQTT_Publish *mqttPwm[MAXSUBSCRIPTIONS] = {}; +Adafruit_MQTT_Publish **gpioSensorsMqtt; #define FEED_MAX_SIZE 96 //FEED have the following formats /feeds/USER/DEVICE_NAME/.... +#define GPIO_FEED_FORMAT "/feeds/%s/%s/%s/%s" #define TEMPERATURE_FEED_FORMAT "/feeds/%s/%s/temperature" #define PRESSURE_FEED_FORMAT "/feeds/%s/%s/pressure" #define TEMPERATURE_DHT_FEED_FORMAT "/feeds/%s/%s/dht/temperature" #define HUMIDITY_DHT_FEED_FORMAT "/feeds/%s/%s/dht/humidity" -#define DRY_FEED_FORMAT "/feeds/%s/%s/dry" #define GPIO_FEED_FORMAT "/feeds/%s/%s/gpio/%d" #define GPIO_SET_FEED_FORMAT "/feeds/%s/%s/gpio/%d/set" #define PWM_FEED_FORMAT "/feeds/%s/%s/gpio/%d" @@ -37,6 +38,14 @@ char *mqttId; bool isMqttConfigured = false; bool useMqtts = false; +void initGpioSensorsMqtt(char *user, char *hostname){ + uint i; + gpioSensorsMqtt = new Adafruit_MQTT_Publish *[NB_ELEMENTS(gpioSensors)]; + for(i = 0; i < NB_ELEMENTS(gpioSensors); i++){ + gpioSensorsMqtt[i] = MqttCreatePublisher(GPIO_FEED_FORMAT, user, hostname, + gpioSensors[i]->sensorName, gpioSensors[i]->measureName); + } +} int MqttSetup(char *server, char *user, char *passwd, int port, char *hostname) { mqttId = hostname; @@ -57,7 +66,6 @@ int MqttSetup(char *server, char *user, char *passwd, int port, char *hostname) mqtt_dht_humidity = MqttCreatePublisher(HUMIDITY_DHT_FEED_FORMAT, user, mqttId); mqtt_temp = MqttCreatePublisher(TEMPERATURE_FEED_FORMAT, user, mqttId); mqtt_pressure = MqttCreatePublisher(PRESSURE_FEED_FORMAT, user, mqttId); - mqtt_dry = MqttCreatePublisher(DRY_FEED_FORMAT, user, mqttId); mqtt_ip = MqttCreatePublisher(IP_FEED_FORMAT, user, mqttId); if( NB_ELEMENTS(gpioWatched) + NB_ELEMENTS(pwmWatched) > MAXSUBSCRIPTIONS){ @@ -75,6 +83,7 @@ int MqttSetup(char *server, char *user, char *passwd, int port, char *hostname) mqtt->subscribe(MqttCreateSubscribe(PWM_SET_FEED_FORMAT, user, mqttId, pwmWatched[i])); mqttPwm[i] = MqttCreatePublisher(PWM_FEED_FORMAT, user, mqttId, pwmWatched[i]); } + initGpioSensorsMqtt(user, hostname); return 0; } @@ -139,10 +148,6 @@ int MqttPublishBMP180(double temp, double pressure) { return MqttPublish(mqtt_temp, temp) + MqttPublish(mqtt_pressure, pressure); } -int MqttPublishDry(int dry) { - return MqttPublish(mqtt_dry, (dry*100)/1024); -} - int MqttPublishIP(const String &ip) { return MqttPublish(mqtt_ip, ip.c_str()); } @@ -151,6 +156,17 @@ int MqttPublishDHT(float temp, float humidity) { return MqttPublish(mqtt_dht_temp, temp) + MqttPublish(mqtt_dht_humidity, humidity); } +int MqttPublishGPIO(){ + if (MqttConnect() == 0){ + uint i; + for (i = 0; i < NB_ELEMENTS(gpioSensors); i++) { + gpioSensorsMqtt[i]->publish(gpioSensors[i]->lastMeasure); + } + return 0; + } + return -1; +} + int getGpioFromSubscription(Adafruit_MQTT_Subscribe *subscription, const char *pattern) { char *temp = strstr(subscription->topic, pattern); if (!temp) diff --git a/WifiControlSensor/WebServer.ino b/WifiControlSensor/WebServer.ino index f9a0335..fd5aca4 100644 --- a/WifiControlSensor/WebServer.ino +++ b/WifiControlSensor/WebServer.ino @@ -5,24 +5,31 @@ const int pwmWebConf[] = CONFIG_CONTROLLED_PWM; String gpioControlHTML = ""; String pwmControlHTML = ""; +void WebBuildGpio(String &desc){ + uint i; + for (i = 0; i < NB_ELEMENTS(gpioSensors); i++){ + desc += "
  • " + String(gpioSensors[i]->sensorName) + ": " + String(gpioSensors[i]->lastMeasure) + "
  • "; + } +} + void WebHandleRoot() { + String gpioDesc = ""; + WebBuildGpio(gpioDesc); server.send(200, "text/html", "" "

    You are connected to " + String(conf.host) + "

    " "
    " - "Sensors" + "Sensors
      " #ifdef CONFIG_ENABLE_BMP180 - "Temperature " + String(temp, 2) + "C
      " + "
    • BMP180
    • Temperature " + String(temp, 2) + "C
      " "Pressure " + String(pressure, 2) + "mB
      " #endif #ifdef CONFIG_ENABLE_DHT - "Temperature DHT " + String(dhtTemp, 0) + "C
      " - "Humidity DHT " + String(dhtHumidity, 0) + "%
      " -#endif -#ifdef CONFIG_ENABLE_DRY_SENSOR - "Dryness " + String((dryness*100)/1024) + "%
      " + "
    • DHT
    • Temperature " + String(dhtTemp, 0) + "C
      " + "Humidity " + String(dhtHumidity, 0) + "%
      " #endif + ""+gpioDesc+"
    " "
    " + gpioControlHTML + pwmControlHTML + "
    " "Settings" "Enter Setup
    " diff --git a/WifiControlSensor/WifiControlSensor.ino b/WifiControlSensor/WifiControlSensor.ino index b8df941..3133099 100644 --- a/WifiControlSensor/WifiControlSensor.ino +++ b/WifiControlSensor/WifiControlSensor.ino @@ -44,11 +44,11 @@ #include "debug_sketch.h" #include "BMP180.h" #include "sensor_DHT.h" -#include "dry_sensor.h" #include "MQTT.h" #include "Adafruit_MQTT.h" #include "Adafruit_MQTT_Client.h" #include "EEPROM.h" +#include "sensors.h" extern "C" { #include @@ -61,7 +61,6 @@ extern "C" { double temp, pressure; float dhtTemp, dhtHumidity; -int dryness; uint8_t mode; productConfig conf = {BOOTMODE_SETUP, "", "", "", "", "", "", 0, 0, 0, 0, 0, 0, 0}; @@ -172,7 +171,7 @@ void OTASetup() { }); ArduinoOTA.begin(); SKETCH_DEBUG_PRINTLN("Ready"); - SKETCH_DEBUG_PRINTF("IP address: "); + SKETCH_DEBUG_PRINT("IP address: "); SKETCH_DEBUG_PRINTLN(WiFi.localIP()); SKETCH_DEBUG_PRINTF("Free Space: %d\n", ESP.getFreeSketchSpace()); #endif @@ -232,9 +231,6 @@ void setup() { if (!DHTSetup(CONFIG_DHT_PIN)){ SKETCH_DEBUG_PRINTLN("DHT init success"); } - if (!DrySetup(CONFIG_DRY_POWER_PIN)){ - SKETCH_DEBUG_PRINTLN("DRY init success"); - } WebSetupServer(mode); } #ifdef CONFIG_ENABLE_POWER_SAVE @@ -257,6 +253,7 @@ void loop() { nbCycle++; if (nbCycle > CONFIG_SAMPLING_PERIODE_MS / CONFIG_WEB_DELAY_MS) { + uint i; if (!BMP180GetTempAndPressure(temp, pressure)) { SKETCH_DEBUG_PRINT("Current T°C "); SKETCH_DEBUG_PRINT(temp); @@ -273,13 +270,13 @@ void loop() { if (mode == BOOTMODE_NORMAL) MqttPublishDHT(dhtTemp, dhtHumidity); } - if (!DryGetMeasure(dryness)){ - SKETCH_DEBUG_PRINT("Current dryness "); - SKETCH_DEBUG_PRINT((dryness*100)/1024); - SKETCH_DEBUG_PRINTLN("%"); - if (mode == BOOTMODE_NORMAL) - MqttPublishDry(dryness); + + for (i = 0; i < NB_ELEMENTS(gpioSensors); i++){ + int val; + gpioSensors[i]->getMeasure(val); } + if (mode == BOOTMODE_NORMAL) + MqttPublishGPIO(); nbCycle = 0; } } diff --git a/WifiControlSensor/dry_sensor.h b/WifiControlSensor/dry_sensor.h deleted file mode 100644 index 76ce708..0000000 --- a/WifiControlSensor/dry_sensor.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#ifdef CONFIG_ENABLE_DRY_SENSOR -int DrySetup(int powerGPIO); -int DryGetMeasure(int &dry); -bool DryIsConnected(){return true;} -#else -int DrySetup(int){return -1;} -int DryGetMeasure(int){return -1;} -bool DryIsConnected(){return false;} -#endif diff --git a/WifiControlSensor/dry_sensor.ino b/WifiControlSensor/dry_sensor.ino deleted file mode 100644 index d7ff47f..0000000 --- a/WifiControlSensor/dry_sensor.ino +++ /dev/null @@ -1,24 +0,0 @@ -#ifdef CONFIG_ENABLE_DRY_SENSOR -#include "dry_sensor.h" -int dryGPIO; - -int DrySetup(int powerGPIO){ - dryGPIO = powerGPIO; - if(dryGPIO >= 0){ - pinMode(dryGPIO, OUTPUT); - } - return 0; -} - -int DryGetMeasure(int &dry){ - if(dryGPIO >= 0){ - digitalWrite(dryGPIO,1); - delay(50); - } - dry = analogRead(A0); - if(dryGPIO >= 0){ - digitalWrite(dryGPIO,0); - } - return 0; -} -#endif