ESP32 Capacitive Soil Sensor Read Problem

Not quite!

GPIO26 is an ADC2 pin, and shouldn’t be used as an analogue input when using WiFi.

Pete.

Also I tried GPI34 and 35 pins but still reading constant 4095. If I wont connect sensor the value is 0.
When sensor data pin connected to V0, value turns 4095.
My failed sketch with adc1;

#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <WiFiClient.h>
#include <DHT.h>
#define BLYNK_PRINT Serial

#define DHTPIN 27
#define DHTTYPE DHT11
#define Nem 34
int Nemdegeri=0;

char auth[]="";
char ssid[]="";
char pass[]="";

BlynkTimer timer;
DHT dht(DHTPIN,DHTTYPE);

void Sicaklikveri(){
float h=dht.readHumidity();
float t=dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("DHT hatası!");
return;
}
Blynk.virtualWrite(V1,h);
Blynk.virtualWrite(V2,t);
}

void Nemveri(){
Nemdegeri=analogRead(Nem);
if (isnan(Nemdegeri)) {
Serial.println("Toprak sensör hatası!");
return;
}
Blynk.virtualWrite(V0,Nemdegeri);
}

void setup(){
Serial.begin(9600);
Blynk.begin(auth,ssid,pass);
dht.begin();
timer.setInterval(1000L,Sicaklikveri);
timer.setInterval(1000L,Nemveri);
pinMode(27,INPUT);
}

void loop(){
Blynk.run();
timer.run();
}

Can you post a picture of your sensor, and how it is connected?

Pete.

Here my ugly design :sweat_smile:


White regulator output gnd
Blue regulator output +
Green GPI34
and also i tried esp 3,3v pin to sensor vcc and esp gnd pin to sensor gnd.

It’s the soil sensor that I need to see in close-up, with enough detail to see the details of what how each pin is labelled, which may require a photo of both sides of the board.

Pete.

The dark side of the moon :metal:

Don’t read the sensors that often, especially not the DHT. It’s slow as hell and will give you other problems later on! :smiley:

If you try a bare minimum sketch, do you get correct readings from the sensor?

Google gave me some examples, change analogRead() to match your setup:

void setup() {
  Serial.begin(9600); // open serial port, set the baud rate as 9600 bps
}
void loop() {
  int val;
  val = analogRead(A0); //connect sensor to Analog 0
  Serial.println(val); //print the value to serial port
  delay(2000);
}

[/quote]

If you try a bare minimum sketch, do you get correct readings from the sensor?

Google gave me some examples, change analogRead() to match your setup:

void setup() {
  Serial.begin(9600); // open serial port, set the baud rate as 9600 bps
}
void loop() {
  int val;
  val = analogRead(A0); //connect sensor to Analog 0
  Serial.println(val); //print the value to serial port
  delay(2000);
}

[/quote]
Hello distans,
I observed that from serial monitor,
It shows data for a lil time(maybe not but looks like capacitor discharge chars)


And soil sensor close-up
I have 2 piece and same values for both of them.
Now know that is not blynk related and im not sure is it as it’s supposed to be :)) I’m on search.

Actually, I think the “sensor” (combined with a resistor) is acting like a simple voltage divider and are changing the reactance on the square wave generated by the 555 timer, which is the signal you’re trying to measure. I think!

Is the small 8-pin chip labeled NE555, TLC555 or another “555” combination?

I think you’re right! :stuck_out_tongue:

Ehh… Isn’t pinMode() only used for digital I/O? @PeteKnight?

Try deleting that line!

Yes, it’s a NE555 chip on this soil sensor.

I deleted pinmode line and dht still working well :v:

But soil sensor value constant 0 for now.

Crap! :thinking:

Try without the DHT?! Can you post your latest sketch?

Solo capacitive soil sensor result still same constant 0. :thinking:

#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <WiFiClient.h>
#define BLYNK_PRINT Serial

int Nem=34;
int Nemdegeri=0;

char auth[]="";
char ssid[]="";
char pass[]="";

BlynkTimer timer;

void Nemveri(){
Nemdegeri=analogRead(Nem);
if (isnan(Nemdegeri)) {
Serial.println("Toprak sensör hatası!");
return;
}
Blynk.virtualWrite(V0,Nemdegeri);
}

void setup(){
Serial.begin(9600);
Blynk.begin(auth,ssid,pass);  
timer.setInterval(10000L,Nemveri);
}

void loop(){
Blynk.run();
timer.run();
}

I don’t have an ESP32 so I’m only guessing now… According to this pinout GPIO 34 isn’t an analog pin:

The NE555 neads at least 4.5V (max 16).

I don’t have an ESP32 so I’m only guessing now… According to this pinout GPIO 34 isn’t an analog pin:

@PeteKnight reminded me about working on adc channels with wifi when i tried with adc2.
Thats mine;

That’s esp32 priority list shared by Andreas Spiess.
Source youtube link: Which ESP32 pins are safe to use?

I’m trying to supply soil sensor with 3,3V direct connection to esp pins like this;

And I’m following many links about capacitive soil sensor fails, fix, calibration… really confused for now.
Maybe my soil sensors need some modifications. :thinking:

You need more power!

Oh sorry, got it! :v:

Soil sensor input voltage 5V(MP1584EN output) and sensor value is constantly going to 0 to 4095. Its like ekg diagram when sensor stable in water or air. Maybe need to calibration now? :thinking:

There are other more advanced functions to use with the ADC pins that can be useful in other projects.

  • analogReadResolution(resolution): set the sample bits and resolution. It can be a value between 9 (0 – 511) and 12 bits (0 – 4095). Default is 12-bit resolution.
  • analogSetWidth(width): set the sample bits and resolution. It can be a value between 9 (0 – 511) and 12 bits (0 – 4095). Default is 12-bit resolution.
  • analogSetCycles(cycles): set the number of cycles per sample. Default is 8. Range: 1 to 255.
  • analogSetSamples(samples): set the number of samples in the range. Default is 1 sample. It has an effect of increasing sensitivity.
  • analogSetClockDiv(attenuation): set the divider for the ADC clock. Default is 1. Range: 1 to 255.
  • analogSetAttenuation(attenuation): sets the input attenuation for all ADC pins. Default is ADC_11db. Accepted values:
    • ADC_0db: sets no attenuation. ADC can measure up to approximately 800 mV (1V input = ADC reading of 1088).
    • ADC_2_5db: The input voltage of ADC will be attenuated, extending the range of measurement to up to approx. 1100 mV. (1V input = ADC reading of 3722).
    • ADC_6db: The input voltage of ADC will be attenuated, extending the range of measurement to up to approx. 1350 mV. (1V input = ADC reading of 3033).
    • ADC_11db: The input voltage of ADC will be attenuated, extending the range of measurement to up to approx. 2600 mV. (1V input = ADC reading of 1575).
  • analogSetPinAttenuation(pin, attenuation): sets the input attenuation for the specified pin. The default is ADC_11db. Attenuation values are the same from previous function.
  • adcAttachPin(pin): Attach a pin to ADC (also clears any other analog mode that could be on). Returns TRUE or FALSE result.
  • adcStart(pin), adcBusy(pin) and resultadcEnd(pin): starts an ADC convertion on attached pin’s bus. Check if conversion on the pin’s ADC bus is currently running (returns TRUE or FALSE). Get the result of the conversion: returns 16-bit integer.

Maybe you should look at increasing the analogSetCycles() setting to smooth out the readings?

Pete.

Hello guys,
Finally I fixed my adc (capacitive soil sensor) read problem.

Maybe this post helps those looking for solutions;

  1. First of all of course you need to use ADC1 pins if WIFI inuse
  2. ESP32 ADC channels need a voltage divider for reading values bigger than 3V. You can check this video for voltage divider;Tech Note 143 - ESP32 – Voltage Reading (pre-calculated voltage divider) Examples
  3. After all, i prefered to use [Arrays] for averaging adc values.

Now your ESP can read pretty well(as David says; “every ESP needs calibration if want to use ADC well” but divider worked for me".
Now I’m watching my capacitive soil sensors brilliant results, incredible! :metal:

1 Like

Hi There,

I am having a little issue with my Capacitive soil moisture with ESP8266 + Blynk
can you please share the code you used?