Moist sensor 1.2 "schwingt sich auf"

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

Magst du uns denn auch mitteilen, was das für ein Sensor ist ?
Bitte einen Link posten.

Ups , stimmt das hab ich vergessen

Ich tippe mal, das die Spannung zusammenbricht und der Regler zu wenig Reserve zum ausregeln hat.

Ich weiß nicht wie der ADC beim ESP8266 gegenüber den ATmega ist, ob da paralellen bezüglich Imprdanz der Spannungsquelle bestehen..
Ich würde mal probeweise die Analoge Spannung 2 mal leer auslesen und dann erst das 3. Meßegebnis verwenden.

Grüße Uwe