Grüße,
ich habe ein kleines Problem mit meinem Moist Sensor. ich hatte diesen zu testzwecken an einem Wemos D1 mini betrieben und er hat gemacht was er sollte, zyklisch im 15 min tackt Bodenfeuchte messen. Die gemessenen werte waren auch über Wochen den Erwartungen entsprechend mit kleinen Ausreißern.
Nun habe ich Selbigen Sensor in einem Batteriebetriebenen Konzept untergebracht. Das Problem ist, anfangs sind die Werte die der sensor ausspuckt erwartungsgemäß, im Verlauf der zeit steigen diese aber immer weiter an und verharren im oberen Grenzwert.
Es scheint das der Sensor sich nicht richtig entladen kann. Er kann sich aber (theoretisch) über den Widerstand R7 entladen auch wenn der ADC dicht macht.
Hat jemand einen Ansatz was der Fehler in meinem Aufbau ist?
Schaltplan.pdf (94.2 KB)
#include "ESP8266WiFi.h"
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#include <Wire.h>
#include <SPI.h>
#include <BME280I2C.h>
#include <ESP_EEPROM.h>
#include <SoftwareSerial.h>
#define MUX_INPUT A0 //A0
#define WAKE 16 //D0
#define SCL 5 //D1
#define SDA 4 //D2
#define MUX_SELECT 12 //D3
#define RX 2 //D4
#define TX 0 //D6
#define PROG 14 //D5
#define PWR_PIN 13 //D7 GPIO13
///////////////
//RECEVEDATA///
///////////////
const byte numChars = 5;
char receivedChars[numChars];
bool newData = false;
int numBytes = 0;
int ADCMoist = 0;
int ADCLight = 0;
uint32_t previousMillis = 0;
uint32_t WiFiMillis = 0;
int wait = 0;
SoftwareSerial mySerial(RX, TX);
//////////////
//Programmer//
//////////////
int PoM = 0;
int value = 0;
////////////////
//SensorValues//
////////////////
BME280I2C bme;
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
BME280::PresUnit presUnit(BME280::PresUnit_Pa);
float temperature =0;
float pressure =0;
float humidity =0;
byte moist, light, IDB, IDC,IDS, min_moist, max_moist, min_hum, max_hum, hum;
////////////////////////////
//WLAN und SQL SERVERDATEN//
////////////////////////////
IPAddress server_addr(192, 168, 4, 10);
char user[] = "Sensor";
char password[] = "ESP8266";
///////////////////
//NETWORKSETTINGS//
///////////////////
char ssid[] = "GA_MK23";
char pass[] = "1234567890";
/////////
//QUERY//
/////////
char INSERT_SQL[] = "INSERT INTO GA_MK23.Measurement (IDB,IDC,IDS,MoistMin,Moist,MoistMax,HumMin,Humidity,HumMax,Airpressure,Temperature,Light) VALUES (%d,%d,%d,%d,%d,%d,%d,%.2f,%d,%.2f,%.2f,%d)";
char query[128];
WiFiClient client;
MySQL_Connection conn(&client);
MySQL_Cursor* cursor;
////////
//MAIN//
////////
void setup() {
//SetUp ESP PINS
pinMode(TX, OUTPUT);
pinMode(RX, INPUT_PULLUP);
pinMode(PROG, INPUT);
pinMode(MUX_SELECT, OUTPUT);
pinMode(MUX_INPUT, INPUT);
pinMode(PWR_PIN, OUTPUT);
//INIT Serial, SorftwareSerial, I2C, EEPROM//
Serial.begin(9600);
mySerial.begin(9600);
Wire.begin();
EEPROM.begin(512);
Seril.println();
Serial.println("Start ESP");
Serial.println(ESP.getResetReason());
//get Data EEPROM
IDB = EEPROM.read(0);
IDC = EEPROM.read(1);
max_moist = EEPROM.read(2);
min_moist = EEPROM.read(3);
max_hum = EEPROM.read(4);
min_hum = EEPROM.read(5);
IDS = EEPROM.read(6);
//Print EEPROM DATA
/*
Serial.print("IDB: "); Serial.println(IDB);
Serial.print("IDC: "); Serial.println(IDC);
Serial.print("IDS: "); Serial.println(IDS);
Serial.print("MAX HUM: "); Serial.println(max_hum);
Serial.print("MIN HUM: "); Serial.println(min_hum);
Serial.print("MAX MOIST: ");Serial.println(max_moist);
Serial.print("MIN MOIST: ");Serial.println(min_moist);
// check for Programmer is conected
Serial.print("PROG ");Serial.println(digitalRead(PROG));
*/
if (!digitalRead(PROG)) {
//Connect to WiFi
Serial.printf("\nConnecting to %s", ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED && wait < 20) {
fwait( 1000);
}//While WIFI
if (wait >= 20) {
//digitalWrite(ErrorLED, LOW);
ESP.restart();
}//if wait>=20
wait = 0;
// print out info about the connection:
Serial.println("\nConnected to network");
Serial.print("My IP address is: ");
Serial.println(WiFi.localIP());
//Test SQL ServerConnection
Serial.print("Connecting to SQL... ");
if(conn.connect(server_addr, 3306, user, password)){
Serial.print("OK.");
}//if SQL Connection
else {
Serial.print("FAILED");
ESP.restart();
}//else NO SQL Connetion
//initialize BME280 Sensor
bme.begin();
//Flush SoftwareSerial Buffer
mySerial.flush();
}//if No PRogrammer
} //Setup
void loop() {
while (!digitalRead(PROG)) {
//Measure//
//LIGHT//
digitalWrite(MUX_SELECT, HIGH);
ADCLight = analogRead(A0);
light = (ADCLight * 100 / 1024); //////////Doublecheck//////////////
//MOIST//
digitalWrite(MUX_SELECT, LOW);
//delay(1000);
//Serial.print("ADC-Read MOIST: ");Serial.println(analogRead(A0));
ADCMoist = (analogRead(A0));
//Serial.print("ADCMoist VAR: ");Serial.println(ADCMoist);
int ADCMoistClamp=clamp(ADCMoist,380, 700);
//Serial.print("ADCMoistClamp: ");Serial.println(ADCMoistClamp);
int ADCMoistMap=map(ADCMoistClamp,380,700,99,0);
// Serial.print("ADCMoistMap: ");Serial.println(ADCMoistMap);
//PRES;TEMP;HUM//
bme.read(pressure, temperature, humidity, tempUnit, presUnit);
bme.read(pressure, temperature, humidity, tempUnit, presUnit);
pressure = (pressure / 1000);
Serial.print("pressure= ");
Serial.println(pressure);
Serial.print("temperature= ");
Serial.println(temperature);
Serial.print("humidity= ");
Serial.println(humidity);
if (conn.connected()) {
//Create SQL Cursor
MySQL_Cursor* cur_mem = new MySQL_Cursor(&conn);
// Create Query
sprintf(query, INSERT_SQL, IDB, IDC, IDS, min_moist, ADCMoistMap, max_moist, min_hum, humidity, max_hum, pressure, temperature, light);
/*
Serial.print("Send Data: ");
Serial.println(query);
*/
//Send querry
int res = cur_mem->execute(query);
if (res) {
Serial.println("Execute ok");
delete cur_mem;
}//if SUCCESS
else {
Serial.println("Execute Error");
delete cur_mem;
}//else ERROR
conn.close();
}//if Connected
//Serial.println("PWR PIN HIGH");
WiFi.disconnect();
digitalWrite(PWR_PIN, HIGH);
delay(1000);
}//while no programmer
//WHILE PROGRAMMER
recvWithEndMarker();
ActAndReturn();
}//LOOP
////////////////
//SUBFUNKTIONS//
////////////////
void fwait(int interval) {
uint32_t currentMillis = millis();
if(currentMillis - previousMillis >= interval){
previousMillis = currentMillis;
wait++;
}//if >=Interval
else{
Serial.print(".");
}//else<intervall
}//void fwait
void recvWithEndMarker() {
delay(20);
static byte ndx = 0;
char endMarker = '\n';
char rc;
while (mySerial.available() > 0 && newData == false) {
rc = mySerial.read();
if (rc != endMarker) {
Serial.print("RC: ");
Serial.println(rc);
receivedChars[ndx] = rc;
ndx++;
if(ndx >= numChars) {
ndx = numChars - 1;
} //if ndx>=arraysize
}//If char != endmarker
else {
receivedChars[ndx] = '\n'; // terminate the string
/*
Serial.print("RC: ");
Serial.println(rc);
Serial.print(receivedChars);
*/
ndx = 0;
newData = true;
}//else ==endmarker
}//while SerialDataAvailable
}//VOIDrecvWithendmarker
void ActAndReturn() {
if (newData == true) {
Serial.print(" 0=");Serial.print(receivedChars[0]);
Serial.print(" 1=");Serial.print(receivedChars[1]);
Serial.print(" 2=");Serial.print(receivedChars[2]);
Serial.print(" 3=");Serial.print(receivedChars[3]);
Serial.print(" 4=");Serial.print(receivedChars[4]);
Serial.println(" ");
PoM = ((int)receivedChars[0] - 48);
/*
Serial.print("RC2 as Int= ");
Serial.println((((int)receivedChars[2] - 48) * 10));
Serial.print("RC3 as Int= ");
Serial.println((((int)receivedChars[3] - 48) * 1));
*/
value = ((((int)receivedChars[2] - 48) * 10) + (((int)receivedChars[3] - 48) * 1));
/*
Serial.print("PoM= ");Serial.println(receivedChars[0]);
Serial.print("val= ");Serial.print(receivedChars[2]);
Serial.println(receivedChars[3]);Serial.print("VALUE= ");
Serial.println(value);
*/
switch (receivedChars[1]) {
case 'G': {
Serial.println("Send My Data to Programmer");
char Buffer[2]{ 0, 0 };
switch (PoM) {
case 1:
Serial.print("IDS ");
Serial.println(IDS);
sprintf(Buffer, "%02d", IDS);
mySerial.print(Buffer);
mySerial.print('\n');
break;
case 2:
Serial.print("IDB ");
Serial.println(IDB);
sprintf(Buffer, "%02d", IDB);
mySerial.print(Buffer);
mySerial.print('\n');
break;
case 3:
Serial.print("IDC ");
Serial.println(IDC);
sprintf(Buffer, "%02d", IDC);
mySerial.print(Buffer);
mySerial.print('\n');
break;
case 4:
Serial.print("Hum ");
Serial.println(hum);
sprintf(Buffer, "%02d", hum);
mySerial.print(Buffer);
mySerial.print('\n');
break;
case 5:
Serial.print("HumMax ");
Serial.println(max_hum);
sprintf(Buffer, "%02d", max_hum);
mySerial.print(Buffer);
mySerial.print('\n');
break;
case 6:
Serial.print("HumMin ");
Serial.println(min_hum);
sprintf(Buffer, "%02d", min_hum);
mySerial.print(Buffer);
mySerial.print('\n');
break;
case 7:
Serial.print("Moist ");
Serial.println(moist);
sprintf(Buffer, "%02d", moist);
mySerial.print(Buffer);
mySerial.print('\n');
break;
case 8:
Serial.print("MoistMax ");
Serial.println(max_moist);
sprintf(Buffer, "%02d", max_moist);
mySerial.print(Buffer);
mySerial.print('\n');
break;
case 9:
Serial.print("MoistMin ");
Serial.println(min_moist);
sprintf(Buffer, "%02d", min_moist);
mySerial.print(Buffer);
mySerial.print('\n');
break;
} //switch
} //case G
break;
case 'S': {
Serial.println("Get new Data from Programmer");
switch (PoM) {
case 1:
Serial.println("IDS");
IDS = value;
EEPROM.write(6, IDS);
EEPROM.commit();
break;
case 2:
Serial.println("IDB");
IDB = value;
EEPROM.write(0, IDB);
EEPROM.commit();
break;
case 3:
Serial.println("IDC");
IDC = value;
EEPROM.write(1, IDC);
EEPROM.commit();
break;
case 4:
Serial.println("Hum");
break;
case 5:
Serial.println("HumMax");
max_hum = value;
EEPROM.write(4, max_hum);
EEPROM.commit();
break;
case 6:
Serial.println("HumMin");
min_hum = value;
EEPROM.write(5, min_hum);
EEPROM.commit();
break;
case 7:
Serial.println("Moist");
break;
case 8:
Serial.println("MoistMax");
max_moist = value;
EEPROM.write(2, max_moist);
EEPROM.commit();
break;
case 9:
Serial.println("MoistMin");
min_moist = value;
EEPROM.write(3, min_moist);
EEPROM.commit();
break;
} //switch
}//case S
break;
case 'M': {
Serial.println("Send Current Moist");
char Buffer[2]{ 0, 0 };
digitalWrite(MUX_SELECT, LOW);
delay(1000);
Serial.print("ADC-Read MOIST: ");Serial.println(analogRead(A0));
ADCMoist = (analogRead(A0));
Serial.print("ADCMoist VAR: ");Serial.println(ADCMoist);
int ADCMoistClamp=clamp(ADCMoist,380, 700);
Serial.print("ADCMoistClamp: ");Serial.println(ADCMoistClamp);
int ADCMoistMap=map(ADCMoistClamp,380,700,99,0);
Serial.print("ADCMoistMap: ");Serial.println(ADCMoistMap);
Serial.print("MOIST%= ");
Serial.println(ADCMoistMap);
Serial.print("MOIST= ");
Serial.println(analogRead(A0));
sprintf(Buffer, "%02d", ADCMoistMap);
mySerial.print(Buffer);
mySerial.print('M');
mySerial.print('\n');
Serial.print("Buffer= ");
Serial.println(Buffer);
}
break;
case 'H': {
Serial.println("Send Crrent Humidity");
char Buffer[2]{ 0, 0 };
bme.begin();
bme.read(pressure, temperature, humidity, tempUnit, presUnit);
bme.read(pressure, temperature, humidity, tempUnit, presUnit);
Serial.print("humidity= ");
Serial.println(humidity);
humidity = std::round(humidity);
int a = int(humidity);
Serial.print("humidity= ");
Serial.println(a);
sprintf(Buffer, "%02d", a);
mySerial.print(Buffer);
mySerial.print('H');
mySerial.print('\n');
}
break;
} //switch
newData = false;
Serial.print("PROG PIN State: ");
Serial.println(digitalRead(PROG));
Serial.print("IDB: ");
Serial.println(IDB);
Serial.print("IDC: ");
Serial.println(IDC);
Serial.print("MAX HUM: ");
Serial.println(max_hum);
Serial.print("MIN HUM: ");
Serial.println(min_hum);
Serial.print("MAX MOIST: ");
Serial.println(max_moist);
Serial.print("MIN MOIST: ");
Serial.println(min_moist);
Serial.println("Programmer connected");
} //if new Data
}//void ActAndReturn
int clamp(int input,int min, int max) {
int output=input;
if (input < min) output = min;
if (input > max) output = max;
return output;
}//void clamp