2023-03-30 15:55:45 +00:00
|
|
|
#include <Arduino.h>
|
2023-04-04 05:53:20 +00:00
|
|
|
|
2023-05-10 15:44:21 +00:00
|
|
|
|
|
|
|
|
2023-05-10 20:27:59 +00:00
|
|
|
#include "wifi_functions.h"
|
2023-05-10 15:44:21 +00:00
|
|
|
|
2023-05-09 22:13:29 +00:00
|
|
|
bool debug=true; //print Serial information
|
2023-04-04 05:53:20 +00:00
|
|
|
|
2023-05-10 20:27:59 +00:00
|
|
|
|
|
|
|
|
2023-04-17 19:32:34 +00:00
|
|
|
#include "helpfunctions.h"
|
2023-04-22 01:14:51 +00:00
|
|
|
#include "ADS1X15.h"
|
|
|
|
|
|
|
|
ADS1115 ADS(0x48);
|
2023-04-04 05:53:20 +00:00
|
|
|
|
|
|
|
|
2023-04-17 19:32:34 +00:00
|
|
|
// ######## Temperature
|
|
|
|
#include "temperature.h"
|
2023-04-04 05:53:20 +00:00
|
|
|
|
2023-05-10 20:27:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
// ######## EC
|
|
|
|
#include "ec.h"
|
|
|
|
|
|
|
|
|
2023-04-04 05:53:20 +00:00
|
|
|
|
2023-04-05 07:22:57 +00:00
|
|
|
// ######## Water Level
|
2023-05-10 15:33:52 +00:00
|
|
|
//#include "waterlevel.h"
|
2023-04-04 05:53:20 +00:00
|
|
|
|
|
|
|
|
2023-04-07 16:03:41 +00:00
|
|
|
// ######## Flow Rate
|
2023-04-17 19:32:34 +00:00
|
|
|
#include "flow.h"
|
2023-04-07 16:03:41 +00:00
|
|
|
|
2023-04-22 01:14:51 +00:00
|
|
|
// ######## Soilmoisture
|
|
|
|
#include "soilmoisture.h"
|
2023-04-07 16:03:41 +00:00
|
|
|
|
2023-03-30 15:55:45 +00:00
|
|
|
|
2023-05-10 20:27:59 +00:00
|
|
|
|
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
unsigned long last_check=0;
|
2023-04-04 05:53:20 +00:00
|
|
|
|
2023-04-07 16:03:41 +00:00
|
|
|
|
2023-04-04 05:53:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
bool valueError=false;
|
2023-04-04 05:53:20 +00:00
|
|
|
|
2023-04-22 01:14:51 +00:00
|
|
|
#define PIN_BUTTON 12
|
2023-05-04 22:03:47 +00:00
|
|
|
#define PIN_LED 13
|
2023-04-04 05:53:20 +00:00
|
|
|
|
2023-03-30 15:55:45 +00:00
|
|
|
|
|
|
|
void setup() {
|
2023-04-22 01:14:51 +00:00
|
|
|
pinMode(PIN_BUTTON,INPUT_PULLUP);
|
|
|
|
pinMode(PIN_LED,OUTPUT);
|
|
|
|
digitalWrite(PIN_LED,LOW);
|
2023-03-30 15:55:45 +00:00
|
|
|
Serial.begin(115200);
|
2023-05-10 15:44:21 +00:00
|
|
|
WiFi.begin(ssid, pass);
|
|
|
|
client.begin(mqtt_host, net);
|
|
|
|
client.onMessage(messageReceived);
|
|
|
|
connect();
|
2023-03-30 15:55:45 +00:00
|
|
|
|
2023-04-22 01:14:51 +00:00
|
|
|
//init ADS1115
|
|
|
|
if (!ADS.begin()) {
|
|
|
|
Serial.println("Error:"); delay(2000); Serial.println("ADS1115 Init Error!");
|
|
|
|
}
|
|
|
|
ADS.setGain(0);
|
|
|
|
|
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
Serial.println("Setup EC");
|
2023-04-17 19:32:34 +00:00
|
|
|
ec_setup();
|
2023-04-04 05:53:20 +00:00
|
|
|
|
2023-05-10 15:33:52 +00:00
|
|
|
//Serial.println("Setup Waterlevel");
|
|
|
|
//waterlevel_setup();
|
2023-04-05 07:22:57 +00:00
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
Serial.println("Setup Temperature");
|
2023-04-17 19:32:34 +00:00
|
|
|
temperature_setup();
|
2023-04-04 05:53:20 +00:00
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
Serial.println("Setup Flow");
|
2023-04-17 19:32:34 +00:00
|
|
|
flow_setup();
|
2023-04-07 16:03:41 +00:00
|
|
|
|
2023-05-10 20:27:59 +00:00
|
|
|
Serial.println("Setup Soilmoisture");
|
|
|
|
sm_setup();
|
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
Serial.println("Finished Setup");
|
2023-04-22 01:14:51 +00:00
|
|
|
delay(200);
|
|
|
|
|
2023-04-30 18:20:09 +00:00
|
|
|
//Test adc to ec function output
|
2023-05-02 23:47:42 +00:00
|
|
|
/*
|
2023-04-30 18:20:09 +00:00
|
|
|
Serial.println();
|
2023-05-05 22:53:32 +00:00
|
|
|
for (int i=750;i<14183;i+=100) {
|
2023-04-30 18:20:09 +00:00
|
|
|
float _ec=ec_getECfromADC(i);
|
|
|
|
Serial.print(i); Serial.print(","); Serial.print(_ec); Serial.println();
|
|
|
|
}
|
|
|
|
|
|
|
|
delay(100000);
|
2023-05-02 23:47:42 +00:00
|
|
|
*/
|
|
|
|
|
2023-05-05 22:53:32 +00:00
|
|
|
|
2023-05-02 23:47:42 +00:00
|
|
|
|
2023-04-30 18:20:09 +00:00
|
|
|
|
2023-05-02 23:47:42 +00:00
|
|
|
//Serial.println("time,tempReservoir,ECadcCalib,ECadc,ECadcAdjusted,EC,EC25");
|
2023-05-10 15:33:52 +00:00
|
|
|
//Serial.println("time,tempReservoir,ECadcCalib,ECadc,ECadcAdjusted");
|
2023-04-22 01:14:51 +00:00
|
|
|
|
2023-03-30 15:55:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void loop() {
|
|
|
|
unsigned long loopmillis=millis();
|
2023-05-10 20:27:59 +00:00
|
|
|
enableTiming=true; //reactivate
|
|
|
|
|
2023-05-03 00:55:12 +00:00
|
|
|
|
2023-05-04 22:03:47 +00:00
|
|
|
ec_loop(loopmillis);
|
2023-04-05 07:22:57 +00:00
|
|
|
|
2023-05-04 22:03:47 +00:00
|
|
|
temperature_loop(loopmillis);
|
2023-04-17 19:32:34 +00:00
|
|
|
|
2023-05-10 15:33:52 +00:00
|
|
|
//waterlevel_loop(loopmillis);
|
2023-04-07 16:03:41 +00:00
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
flow_loop(loopmillis);
|
2023-04-22 01:14:51 +00:00
|
|
|
|
2023-05-05 22:08:39 +00:00
|
|
|
sm_loop(loopmillis);
|
2023-04-17 19:32:34 +00:00
|
|
|
|
2023-04-07 16:03:41 +00:00
|
|
|
|
2023-05-09 21:20:47 +00:00
|
|
|
static bool getReading=false;
|
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
if (!digitalRead(PIN_BUTTON)) {
|
|
|
|
valueError=false;
|
2023-05-10 15:33:52 +00:00
|
|
|
Serial.println("Reset ValueError flag by user");
|
|
|
|
digitalWrite(PIN_LED,valueError);
|
2023-05-07 14:20:17 +00:00
|
|
|
delay(100);
|
2023-05-09 21:20:47 +00:00
|
|
|
}
|
|
|
|
|
2023-05-10 15:33:52 +00:00
|
|
|
/*
|
2023-05-09 21:20:47 +00:00
|
|
|
if (ec_flag_measurement_available && getReading) {
|
|
|
|
ec_flag_measurement_available=false;
|
|
|
|
getReading=false;
|
|
|
|
digitalWrite(PIN_LED,LOW);
|
|
|
|
Serial.print(loopmillis); Serial.print(",");
|
|
|
|
Serial.print(tempCmean_reservoir); Serial.print(",");
|
|
|
|
Serial.print(ec_calib_adc); Serial.print(",");
|
|
|
|
Serial.print(ec_adc); Serial.print(",");
|
|
|
|
Serial.print(ec_adc_adjusted);
|
|
|
|
Serial.println();
|
2023-05-10 15:33:52 +00:00
|
|
|
}*/
|
2023-05-03 00:55:12 +00:00
|
|
|
|
2023-05-09 22:13:29 +00:00
|
|
|
if (loopmillis>last_check+2000) { //check values
|
2023-04-05 07:22:57 +00:00
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
last_check=loopmillis;
|
2023-04-22 01:14:51 +00:00
|
|
|
|
2023-04-04 05:53:20 +00:00
|
|
|
|
2023-05-03 00:55:12 +00:00
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
|
2023-05-15 16:00:51 +00:00
|
|
|
if (tempCmean_air==DEVICE_DISCONNECTED_C || tempCmean_reservoir==DEVICE_DISCONNECTED_C || tempCmean_case==DEVICE_DISCONNECTED_C) {
|
2023-05-07 14:20:17 +00:00
|
|
|
valueError=true;
|
|
|
|
}
|
2023-05-10 15:33:52 +00:00
|
|
|
//if (waterlevel==WATERLEVEL_UNAVAILABLE) {
|
|
|
|
// valueError=true;
|
|
|
|
//}
|
2023-05-07 14:20:17 +00:00
|
|
|
if (sm_mean1==SM_DISCONNECTED || sm_mean2==SM_DISCONNECTED) {
|
|
|
|
valueError=true;
|
|
|
|
}
|
|
|
|
if (ec==EC_UNAVAILABLE){
|
|
|
|
valueError=true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
digitalWrite(PIN_LED,valueError);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (debug) {
|
|
|
|
Serial.println("_______________________");
|
|
|
|
Serial.print(millis()/1000.0,2); Serial.println(":");
|
|
|
|
|
|
|
|
Serial.print("temperature reservoir,air = ");
|
|
|
|
Serial.print(tempCmean_reservoir); Serial.print(","); Serial.print(tempCmean_air);
|
2023-04-28 13:07:47 +00:00
|
|
|
Serial.println();
|
2023-04-20 19:51:47 +00:00
|
|
|
|
2023-04-04 05:53:20 +00:00
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
|
|
|
|
Serial.print("sm_mean 1,2,3 = ");
|
|
|
|
Serial.print(sm_mean1); Serial.print(",");
|
|
|
|
Serial.print(sm_mean2); Serial.print(",");
|
|
|
|
Serial.print(sm_mean3);
|
|
|
|
Serial.println();
|
|
|
|
|
2023-04-28 13:07:47 +00:00
|
|
|
/*
|
2023-05-07 14:20:17 +00:00
|
|
|
Serial.print("sm_mean 1,2,3 = ");
|
|
|
|
Serial.print(getMean(sm_mean1array,SM_SIZE)); Serial.print(",");
|
|
|
|
Serial.print(getMean(sm_mean2array,SM_SIZE)); Serial.print(",");
|
|
|
|
Serial.print(getMean(sm_mean3array,SM_SIZE));
|
|
|
|
Serial.println();
|
|
|
|
Serial.print("sm_max 1,2,3 = ");
|
|
|
|
Serial.print(getMax(sm_mean1array,SM_SIZE)); Serial.print(",");
|
|
|
|
Serial.print(getMax(sm_mean2array,SM_SIZE)); Serial.print(",");
|
|
|
|
Serial.print(getMax(sm_mean3array,SM_SIZE));
|
|
|
|
Serial.println();
|
|
|
|
Serial.print("sm_min 1,2,3 = ");
|
|
|
|
Serial.print(getMin(sm_mean1array,SM_SIZE)); Serial.print(",");
|
|
|
|
Serial.print(getMin(sm_mean2array,SM_SIZE)); Serial.print(",");
|
|
|
|
Serial.print(getMin(sm_mean3array,SM_SIZE));
|
|
|
|
Serial.println();
|
|
|
|
//Serial.print(getMax(sm_mean3array,SM_SIZE)); Serial.println();
|
|
|
|
*/
|
2023-04-05 07:22:57 +00:00
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
Serial.print("Flow = "); Serial.print(flow);
|
|
|
|
Serial.println();
|
|
|
|
|
|
|
|
Serial.print("EC ec_calib_adc,ec_adc,ec_adc_adjusted = ");
|
|
|
|
Serial.print(ec_calib_adc); Serial.print(",");
|
|
|
|
Serial.print(ec_adc); Serial.print(",");
|
|
|
|
Serial.print(ec_adc_adjusted);
|
|
|
|
Serial.println();
|
|
|
|
Serial.print("EC ec,ec25 = ");
|
|
|
|
Serial.print(ec); Serial.print(",");
|
|
|
|
Serial.print(ec25);
|
|
|
|
Serial.println();
|
|
|
|
|
2023-05-10 15:33:52 +00:00
|
|
|
/*Serial.print("Waterlevel distance,volume = "); Serial.print(waterlevel); Serial.print(","); Serial.print(watervolume);
|
2023-05-09 21:20:47 +00:00
|
|
|
if (waterlevel_failcounter>0) {
|
|
|
|
Serial.print(" fails="); Serial.print(waterlevel_failcounter);
|
2023-05-10 15:33:52 +00:00
|
|
|
}*/
|
2023-05-10 20:27:59 +00:00
|
|
|
Serial.println();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-05-10 20:27:59 +00:00
|
|
|
|
|
|
|
if (mqtt_loop(loopmillis)) {
|
|
|
|
if (sendallnext_flag) {
|
|
|
|
sendallnext_flag=false;
|
|
|
|
enableTiming=false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tempCmean_reservoir!=DEVICE_DISCONNECTED_C) {
|
|
|
|
publishValueTimed("temperature/reservoir",tempCmean_reservoir,2,timing_temperature_reservoir,loopmillis);
|
|
|
|
}
|
|
|
|
if (tempCmean_air!=DEVICE_DISCONNECTED_C) {
|
|
|
|
publishValueTimed("temperature/air",tempCmean_air,2,timing_temperature_air,loopmillis);
|
|
|
|
}
|
2023-05-15 16:00:51 +00:00
|
|
|
if (tempCmean_case!=DEVICE_DISCONNECTED_C) {
|
|
|
|
publishValueTimed("temperature/case",tempCmean_case,2,timing_temperature_case,loopmillis);
|
|
|
|
}
|
2023-05-10 20:27:59 +00:00
|
|
|
if (sm_mean1!=SM_DISCONNECTED) {
|
|
|
|
publishValueTimed("soilmoisture/sm1",sm_mean1,3,timing_soilmoisture_sm1,loopmillis);
|
|
|
|
}
|
|
|
|
if (sm_mean2!=SM_DISCONNECTED) {
|
|
|
|
publishValueTimed("soilmoisture/sm2",sm_mean2,3,timing_soilmoisture_sm2,loopmillis);
|
|
|
|
}
|
|
|
|
if (sm_mean3!=SM_DISCONNECTED) {
|
|
|
|
publishValueTimed("soilmoisture/sm3",sm_mean3,3,timing_soilmoisture_sm3,loopmillis);
|
|
|
|
}
|
|
|
|
|
|
|
|
publishValueTimed("flow/flow",flow,2,timing_flow,loopmillis);
|
|
|
|
|
|
|
|
|
2023-05-15 16:00:51 +00:00
|
|
|
if (ec_flag_measurement_available){
|
|
|
|
ec_flag_measurement_available=false;
|
|
|
|
if (ec_adc!=0) {
|
|
|
|
publishValue("ec/adc",ec_adc,0);
|
|
|
|
}
|
|
|
|
if (ec_calib_adc!=0) {
|
|
|
|
publishValue("ec/eccalibadc",ec_calib_adc,0);
|
|
|
|
}
|
|
|
|
if (ec_adc_adjusted!=0) {
|
|
|
|
publishValue("ec/adcadjusted",ec_adc_adjusted,0);
|
|
|
|
}
|
|
|
|
if (ec!=EC_UNAVAILABLE){
|
|
|
|
publishValue("ec/ec",ec,0);
|
|
|
|
publishValue("ec/sc",ec25,0);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2023-05-10 20:27:59 +00:00
|
|
|
if (ec_adc!=0) {
|
|
|
|
publishValueTimed("ec/adc",ec_adc,0,timing_ec_adc,loopmillis);
|
|
|
|
}
|
|
|
|
if (ec_calib_adc!=0) {
|
|
|
|
publishValueTimed("ec/eccalibadc",ec_calib_adc,0,timing_ec_calibadc,loopmillis);
|
|
|
|
}
|
|
|
|
if (ec_adc_adjusted!=0) {
|
|
|
|
publishValueTimed("ec/adcadjusted",ec_adc_adjusted,0,timing_ec_adcadjusted,loopmillis);
|
|
|
|
}
|
|
|
|
if (ec!=EC_UNAVAILABLE){
|
|
|
|
publishValueTimed("ec/ec",ec,0,timing_ec_ec,loopmillis);
|
|
|
|
publishValueTimed("ec/sc",ec25,0,timing_ec_sc,loopmillis);
|
2023-05-15 16:00:51 +00:00
|
|
|
}*/
|
2023-05-10 20:27:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-05-07 14:20:17 +00:00
|
|
|
|
|
|
|
|
2023-03-30 15:55:45 +00:00
|
|
|
}
|
|
|
|
|
2023-05-10 15:33:52 +00:00
|
|
|
}
|