hydroponic-controller/include/soilmoisture.h

120 lines
3.0 KiB
C

#ifndef _SOILMOISTURE_H_
#define _SOILMOISTURE_H_
#define SM1_ADS_CHANNEL 1
#define SM2_ADS_CHANNEL 2
#define SM3_ADS_CHANNEL 3
#define READINTERVAL_SM 100
mqttValueTiming timing_soilmoisture_sm1;
mqttValueTiming timing_soilmoisture_sm2;
mqttValueTiming timing_soilmoisture_sm3;
//Calibration values
//high=adc value for sensor in air
//low=adc value for sensor in NaCl solution at 25°C with 12880 uS/cm
float sm1_low=4555;
float sm1_high=11799;
float sm2_low=3235;
float sm2_high=16050;
float sm3_low=0;
float sm3_high=16000;
//sm1 is underwater reservoir soilmoisture sensor (#2)
//sm2 is soilmoisture sensor (#1)
unsigned long last_read_sm=0;
#define SM_SIZE 16
uint8_t sm_mean_pos=0;
uint16_t sm_mean1array[SM_SIZE];
uint16_t sm_mean2array[SM_SIZE];
uint16_t sm_mean3array[SM_SIZE];
#define SM_DISCONNECTED -1
float sm_mean1=SM_DISCONNECTED;
float sm_mean2=SM_DISCONNECTED;
float sm_mean3=SM_DISCONNECTED;
uint8_t sm_readchannel=0;
void sm_setup() {
timing_soilmoisture_sm1.minchange=0.0;
timing_soilmoisture_sm1.maxchange=0.05;
timing_soilmoisture_sm1.mintime=2*1000;
timing_soilmoisture_sm1.maxtime=60*60*1000;
timing_soilmoisture_sm2.minchange=0.0;
timing_soilmoisture_sm2.maxchange=0.05;
timing_soilmoisture_sm2.mintime=2*1000;
timing_soilmoisture_sm2.maxtime=60*60*1000;
timing_soilmoisture_sm3.minchange=0.0;
timing_soilmoisture_sm3.maxchange=0.05;
timing_soilmoisture_sm3.mintime=2*1000;
timing_soilmoisture_sm3.maxtime=60*60*1000;
for (uint16_t i=0;i<SM_SIZE;i++) {
sm_mean1array[i]=SM_DISCONNECTED;
sm_mean2array[i]=SM_DISCONNECTED;
sm_mean3array[i]=SM_DISCONNECTED;
}
}
void sm_loop(unsigned long loopmillis) {
if (loopmillis>=last_read_sm+READINTERVAL_SM) {
switch (sm_readchannel) {
case 0:
sm_mean1array[sm_mean_pos]=ADS.readADC(SM1_ADS_CHANNEL);
sm_readchannel++;
break;
case 1:
sm_mean2array[sm_mean_pos]=ADS.readADC(SM2_ADS_CHANNEL);
sm_readchannel++;
break;
default: //2 and above
sm_mean3array[sm_mean_pos]=ADS.readADC(SM3_ADS_CHANNEL);
sm_readchannel=0;
sm_mean_pos++;
sm_mean_pos%=SM_SIZE;
last_read_sm=loopmillis;
if (isValueArrayOK(sm_mean1array,SM_SIZE,SM_DISCONNECTED)){
float _sm_mean_raw;
_sm_mean_raw=getMean(sm_mean1array,SM_SIZE);
sm_mean1=mapf(_sm_mean_raw,sm1_low,sm1_high,1.0,0.0);
_sm_mean_raw=getMean(sm_mean2array,SM_SIZE);
sm_mean2=mapf(_sm_mean_raw,sm2_low,sm2_high,1.0,0.0);
_sm_mean_raw=getMean(sm_mean3array,SM_SIZE);
sm_mean3=mapf(_sm_mean_raw,sm3_low,sm3_high,1.0,0.0);
}
break;
}
//Serial.print(getMean(sm_mean,SM_SIZE)); Serial.print("\t "); Serial.println(value);
}
}
#endif