hydroponic-controller/src/main.cpp

258 lines
5.8 KiB
C++

#include <Arduino.h>
bool debug=true; //print Serial information
#include "helpfunctions.h"
#include "ADS1X15.h"
ADS1115 ADS(0x48);
// ######## Temperature
#include "temperature.h"
// ######## EC
#include "ec.h"
// ######## Water Level
#include "waterlevel.h"
// ######## Flow Rate
#include "flow.h"
// ######## Soilmoisture
#include "soilmoisture.h"
unsigned long last_check=0;
bool valueError=false;
#define PIN_BUTTON 12
#define PIN_LED 13
void setup() {
pinMode(PIN_BUTTON,INPUT_PULLUP);
pinMode(PIN_LED,OUTPUT);
digitalWrite(PIN_LED,LOW);
Serial.begin(115200);
//init ADS1115
if (!ADS.begin()) {
Serial.println("Error:"); delay(2000); Serial.println("ADS1115 Init Error!");
}
ADS.setGain(0);
Serial.println("Setup EC");
ec_setup();
Serial.println("Setup Waterlevel");
waterlevel_setup();
Serial.println("Setup Temperature");
temperature_setup();
Serial.println("Setup Flow");
flow_setup();
Serial.println("Finished Setup");
delay(200);
//Test adc to ec function output
/*
Serial.println();
for (int i=750;i<14183;i+=100) {
float _ec=ec_getECfromADC(i);
Serial.print(i); Serial.print(","); Serial.print(_ec); Serial.println();
}
delay(100000);
*/
//Serial.println("time,tempReservoir,ECadcCalib,ECadc,ECadcAdjusted,EC,EC25");
//Serial.println("time,tempReservoir,ECadcCalib,ECadc,ECadcAdjusted,sm");
}
void loop() {
unsigned long loopmillis=millis();
ec_loop(loopmillis);
temperature_loop(loopmillis);
waterlevel_loop(loopmillis);
flow_loop(loopmillis);
sm_loop(loopmillis);
if (!digitalRead(PIN_BUTTON)) {
valueError=false;
Serial.println("Reset ValueError flag by user");
digitalWrite(PIN_LED,valueError);
delay(100);
}
if (loopmillis>last_check+2000) { //check values
last_check=loopmillis;
if (tempCmean_air==DEVICE_DISCONNECTED_C || tempCmean_reservoir==DEVICE_DISCONNECTED_C) {
valueError=true;
}
if (waterlevel==WATERLEVEL_UNAVAILABLE) {
valueError=true;
}
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);
Serial.println();
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();
/*
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();
*/
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();
Serial.print("Waterlevel="); Serial.print(waterlevel);
Serial.println();
}
/*
Serial.print(millis()/1000.0,2); Serial.print(",");
Serial.print(getMeanf(tempCmean_reservoir_array,TEMPMEAN_SIZE)); Serial.print(",");
//Serial.print(getMean(sm_mean,SM_SIZE)); Serial.print(",");
Serial.print(ec_calib_adc); Serial.print(",");
Serial.print(ec_adc); Serial.print(",");
Serial.print(ec_adc_adjusted); Serial.print(",");
Serial.print(ec); Serial.print(",");
Serial.print(ec25);
Serial.print(getMean(sm_mean,SM_SIZE));
Serial.println();
if (tempCmean_reservoir!=DEVICE_DISCONNECTED_C){
Serial.print("\t Treservoir="); Serial.print(tempCmean_reservoir); Serial.print("\t Tair="); Serial.print(tempCmean_air);
}else{
Serial.print("\t waiting for temperature");
}
if (isValueArrayOKf(waterlevelMean,WATERLEVELMEAN_SIZE,-1.0)){
float _max=getMaxf(waterlevelMean,WATERLEVELMEAN_SIZE);
float _min=getMinf(waterlevelMean,WATERLEVELMEAN_SIZE);
float _filteredWaterlevel=getFilteredf(waterlevelMean,WATERLEVELMEAN_SIZE,8);
float _meanWaterlevel=getMeanf(waterlevelMean,WATERLEVELMEAN_SIZE);
Serial.print("\t Dist="); Serial.print(_filteredWaterlevel); Serial.print("mm"); Serial.print("(+- "); Serial.print((_max-_min)/2.0); Serial.print(")"); Serial.print(" [mean="); Serial.print(_meanWaterlevel); Serial.print("]");
}else{
Serial.print("\t waiting for distance");
}
Serial.print("\t Flow="); Serial.print(flow,2);
Serial.print("\t Flowsum="); Serial.print(flow_counter_sum);
Serial.println();
*/
}
}
/*
TODO:
- waterlevel nur -1
- waterlevel distance to volume fukntion
- soilmoisture min max calibartion einfügen
*/