Valores del sensor capacitivo de humedad del suelo

Buenas... tengo un sensor capacitivo de esos que se clavan al suelo para ver la humedad de la tierra, cuando está en seco "al aire" me marca un valor... cuando lo sumerjo en agua me da otro valor, pero quiero saber cuales son sus valores máximos y mínimos para poder hacer una función map() y que me muestre un porcentaje, pensé que al tenerlo al aire sería su valor máximo de seco y al meterlo en un vaso lleno de agua sería su valor máximo de humedad, pero después de meterlo en una maceta y regarla creo que me estoy equivocando ya que alcanza un mayor valor de humedad en una maceta recién regada que en un vaso lleno de agua...

El sensor es este:

Estoy buscando por internet el datasheet para ver si me muestra los valores máximos y mínimos pero no lo encuentro.... pensé que al ser analógico "conectado al A0" tendría que ser 1023 lo más seco y 0 lo más húmedo pero tampoco estoy seguro...

¿alguna idea??

1 Like

Vale ya estoy viendo de que todos los sensores analógicos varían del 0 al 1023, pero entonces...pero me surge una duda... tengo dos sensores de humedad... uno que es el capacitivo que os he mostrado en el post anterior, y otro que es un poco más barato y no es capacitivo... he leído que es más propenso a la corrosión el más barato que os muestr ahora:

sensor humedad.jpg

Entonces....

Si saco el que no es capacitivo de la maceta y le dejo al aire, me llega al valor máximo de 1023 "que es lo más seco", pero si saco el capacitivo de la maceta y le dejo al aire, me llega a un valor máximo de 664, por lo que le quedan muchos valores hasta llegar al 1023 que es lo más seco... ¿porqué puede ser??

Y al contrario... si meto el sensor que NO es capacitivo dentro de un vaso de agua me llega a un valor de 287, por lo que queda lejos del valor de humedad total que sería 0, mientras que el sensor capacitivo al meterlo dentro del vaso lleno de agua me llega a un valor de 376, también quedando muy lejos del valor de humedad absoluto que sería 0.

En resumen... el sensor NO capacitivo me capta el valor más seco 1023 al dejarlo al aire "como debería de ser ya que está al aire" pero el sensor capacitivo no... se queda muy lejos. Pero cuando les meto dentro de un vaso de agua ninguno de los dos llega al valor 0, quedándose muy lejos de mostrarme un 100% de humedad hecha la función map()

Alguna idea de porqué si los sensores captan del valor 0 lo más húmedo al 1023 lo más seco "en teoría" pero nunca llegan a esos valores?????

GRACIAS!

sensor humedad.jpg

Hi,
Adjunto la data de un sensor de humedad que se parece al tuyo y el manual da las espcificaciones de la lectura del sensor. Creo que se parece mucho al tuyo.

SEN0114_Web.pdf (169 KB)

El aire tiene humedad de modo que una prueba al aire no es indicativa de humedad 0.
Las pruebas deben hacerse en el medio para el cual fue diseñado el sensor, asi que pones el sensor en tierra y lo saturas de agua.. dejas que el agua se estacione unos minutos y mides la humedad, ese valor será tu máximo.

Luego dejas sin humedecer por días y compruebas al pasar varios días su valor y eso será lo mas próximo a 0% y no digo que llegue a 0.

Ahi tendrás los dos valores.
Prueba con ambos sensores a la vez para poder comparar datos.

En el caso del sensor del post#1 te aconsejo que no este alimentado siempre. La idea que permite que no se degrade es no alimentarlo hasta que vayas a medir. Entonces la medición sobre ese sensor requiere que lo alimentes con un pin de arduino que vas a poner en HIGH, le des un tiempo para estabalizar la lectura y luego mides y entonces lo apagas.
La secuencia de medición no cambia con velocidad asi que con lecturas cada 1 hora será mas que suficiente.

Gracias tauro0221 me sirvió bastante ya que indican entre qué parámetros de los valores lo consideran como seco, húmedo o en agua... y muchas gracias surbyte ya que como tú me dices es la forma correcta de tomar los valores máximos y mínimos, en su medio y no al aire ya que pueden medir la humedad ambiente... pero me llamaba la atención que unos sensores analógicos que varían entre 0 y 1023 y casi es imposible lograr esos valores.... hay que estar a hacer pruebas para saber sus límites en vez de dejarnos guiar por los que se supone que serán los límites de fábrica.

P.D había leído lo de no dejar la tensión puesta al sensor de humedad para que no haya corrosión tan rápido, pero está conectado a un LCD que muestra en todo momento la humedad de la tierra por lo que necesito que esté siempre ON. Por lo que cambiaré al sensor capacitivo para poder dejarlo con tensión y que no le haga tanto efecto la corrosión.

Gracias!

Hi,
Puedes usar el Arduino para que lo prendeas/apagues a determinado tiempo usando un interface y un reloj.

Bien ahora veo la relación de esto con tu presentación nueva en Proyectos. En lo personal me gustaría que estas cosas quedaran todas resumidas a un solo hilo. Una y otra vez, tengo que hacer este llamado de atención a cada forero. Es muy importante ver como un proyecto va evolucionando desde sus cosas mas simples.

Entonces vamos a considerar la forma de promediar las lecturas del sensor de humedad capacitivo para lograr lecturas mas estables.
Te parece?

Si estaría genial... adjunto el fichero del scketch ya que son más de 9000 caracteres y no puedo ponerlo en el post directamente!

Voy a intentar que haga una lectura más o menos cada 5 minutos, porque cuando el sistema está el riego apagado da un poco igual que no sea exacto o actualizado el dato. Pero cuando está regando sí que tiene que medirlo cada poco tiempo para que cuando llegue al valor de riego deseado pare de regar.

Gracias.!

sistema_riego_finalizado.ino (39.7 KB)

Bueno he implementado un promedio móvil sujeto a las condiciones de uso tuyas.

Si vas a usarlo como hasta ahora, es una buena idea.
Si lo vas a usar con lecturas cada X minutos no es buena idea, en ese caso debes cambiar por promedio simple y tomar varias lecturas usando un for()

Ahora estas leyendo la humedad en todo momento... y el promedio mobil te permite suavizar y valerte de no perder tiempo y conoces la historia. Pero si los valores se estiran en el tiempo ya no es representativo.

Esta basado en Promedio móvil de Luis llamas y su librería

Acá puede verse como trabaja Median Filter

sistema_riego_finalizado.ino (42.3 KB)

Ok surbyte! voy a probarlo a ver que tal funciona... aunque tengo el problema de que lo tengo en una finca donde está el invernadero, y desmontarlo todo para traerlo a casa y probar el sketch me es muy complicado, por lo que he comprado un par de cosas que necesitaba para volver a reproducirlo todo a la perfección "el hardware" y así probar el scketch...pero las piezas que me faltan tardarán en llegarme unos dias... cuando me lleguen lo monto según el esquema que hice de fritzing y pruebo!

Comentar que ahora "una vez puesto el sistema de riego en la huerta y con días de funcionamiento" empiezo a ver cosas que no me gusta cómo funcionan y no sé muy bien cómo arreglarlo....

1º Promedio de lecturas del sensor de humedad: Esto quizás con lo que me has modificado en el sketch lo tenga solucionado, tendré que probarlo cuando me lleguen las piezas que me faltan. No obstante he leído que con un sensor que sea capacitivo en vez del que yo tengo puesto que es resistivo en la huerta, evita la corrosión, por lo que quizás con solo cambiar de sensor estaría solucionado... probaré cuando me lleguen las cositas...

2º El sistema de riego tiene un reloj "Tiny I2C RTC DS1307 AT24C32 AVR ARM 51" el caso es que dependiendo de la hora, riega o no riega el sistema... y la hora va adelantándose dos o tres minutos diarios, por lo que ahora ya está 20 minutos adelantado... lo que he pensado es bajar el portatil cada 15 días y ponerlo en hora, aunque sería más apropiado saber porqué se adelanta... el reloj venía ya con la pila incluída y es una pila RS2032 creo recordar, abrí un post en Hardware pero sigo sin resolver este problema....

3º Y lo más importante... cuando enciendo el sistema de riego y conecto la alimentación del arduino me aparece en la pantalla principal los caractéres tal que así "que es la manera correcta":

DSC_0308_opt.jpg

Y cuando entro a algún submenú, la pantalla aparece tal que así "que es la manera correcta":

DSC_0307_opt.jpg

Ahora os muestro los errores, como podréis observar los caracteres que están más a la derecha se mueven y aparecen los primeros por la izquierda, haciendo que se pierda el formato...

La pantalla principal queda tal que así:

DSC_0305_opt.jpg

Y la pantalla del submenú queda tal que así.

DSC_0306_opt.jpg

Por lo que yo voy al invernadero y veo que los caractéres se han movido... siempre empiezan a moverse de izquierda a derecha y me rompen la estética del LCD, y cuantos más días pasan más caractéres se van moviendo... primero sólo uno como muestro en las fotos, pero luego dos... luego tres... y cuantos más días pasan más se mueven.... Pero lo apago... lo enciendo... y vuelve a estar bien.

¿¿Alguna idea??

Muchas gracias!!!

DSC_0305_opt.jpg

DSC_0306_opt.jpg

DSC_0307_opt.jpg

DSC_0308_opt.jpg

1º Promedio de lecturas del sensor de humedad: Esto quizás con lo que me has modificado en el sketch lo tenga solucionado, tendré que probarlo cuando me lleguen las piezas que me faltan. No obstante he leído que con un sensor que sea capacitivo en vez del que yo tengo puesto que es resistivo en la huerta, evita la corrosión, por lo que quizás con solo cambiar de sensor estaría solucionado... probaré cuando me lleguen las cositas...

Son dos cosas distintas. El capactivo tal vez (no lo se) evite el problema a largo plazo de la corrosión.
La forma en que fluctúan las lecturas dependerá del sensor. No se que tan estable es el capacitivo.

2º El sistema de riego tiene un reloj "Tiny I2C RTC DS1307 AT24C32 AVR ARM 51" el caso es que dependiendo de la hora, riega o no riega el sistema... y la hora va adelantándose dos o tres minutos diarios,

El DS1307 es un mal RTC. Hay formas de mejorarlo pero vale la pena reemplazarlo por el DS3231 sin embargo muchos de nosotros venimos experimentando problemas con este RTC y se debe a que viene habitualmente sin la bateria y lo primero que todos hacemos es ponerle una CR2032 y usa una LIR2032 (tal vez equivoque el código). La LIR es recargable y la otra no. Entonces si usas una CR el RTC falla.
Ah tener muy en cuenta al momento de la compra.

3º Y lo más importante... cuando enciendo el sistema de riego y conecto la alimentación del arduino me aparece en la pantalla principal los caractéres tal que así "que es la manera correcta":

Tu código tiene mucho trabajo de depuración. He visto un sin número de cosas repetidas pero fundamentalmente al trabajar con LCD se debe ser muy cuidadoso.

Te recomiendo que uses esta función y siempre imprimas con un buffer.

creas un buffer del tamaÑo del largo de caracteres a imprimir.
Ejemplo

char buffer[20]; // tu LCD es 4x20

Luego al momento de imprimir usas esto
Supongamos tu linea
Estos son 20 caracteres de acuerdo a sus posiciones
01234567890123456789
HUMEDAD: XXX HT 69%

Si imprimes asi

sprintf(buffer,"HUMEDAD: %03d HT %02d%", humedad, humedadHT);
lcd.print(buffer);

nunca se te desplazará nada.

Lo mismo con las demas impresiones de lineas

Ok surbyte muchas gracias... cuando me llegue el hardware necesario para reproducir el sistema de riego sin tener que desmontarlo todo del invernadero, lo montaré aquí en casa y probaré a cambiar el código para que sea cual sea el sensor de humedad "ya sea capacitivo o resistivo" me haga las lecturas con menos fluctuación....

El DS1307 es un mal RTC. Hay formas de mejorarlo pero vale la pena reemplazarlo por el DS3231 sin embargo muchos de nosotros venimos experimentando problemas con este RTC y se debe a que viene habitualmente sin la bateria y lo primero que todos hacemos es ponerle una CR2032 y usa una LIR2032 (tal vez equivoque el código). La LIR es recargable y la otra no. Entonces si usas una CR el RTC falla.
Ah tener muy en cuenta al momento de la compra.

¿¿Donde dices eso de que muchos de nosotros venimos experimentando problemas con este RTC, te refieres al DS1307 o al DS3231?? he comprado un DS3231 y ahora voy a comprar la pila... para el DS3231 es necesario que sea una pila LIR en vez de una CR ¿verdad?

Y sé que mi código tiene mucho trabajo de depuración... ahora que ya está el sistema de riego funcionando aunque con estos inconvenientes, al montar el nuevo hardware intentaré depurarlo lo mejor posible dentro de mis posibilidades...

Donde dices:

char buffer[20]; // tu LCD es 4x20

Luego al momento de imprimir usas esto
Supongamos tu linea
Estos son 20 caracteres de acuerdo a sus posiciones
01234567890123456789
HUMEDAD: XXX HT 69%

Si imprimes asi

sprintf(buffer,"HUMEDAD: %03d HT %02d%", humedad, humedadHT);
lcd.print(buffer);

Creo entender que tengo que crear una variable de tipo char que contena un array, lo que no entiendo es qué significa %03d y %02d%, a parte que la varaible huemdadHT yo no la tengo creada....

GRACIAS por vuestra paciencia.... :wink:

¿¿Donde dices eso de que muchos de nosotros venimos experimentando problemas con este RTC, te refieres al DS1307 o al DS3231?? he comprado un DS3231 y ahora voy a comprar la pila... para el DS3231 es necesario que sea una pila LIR en vez de una CR ¿verdad?

No se que pila le corresponde a tu módulo y ese es el problema.

No tienes que crear nada.. .lo hice genérico esperando lo comprendieras pero intentaré ser mas claro
Lo que pasa es que tomo una rutina tuya y tiene tantas lineas que no entiendo... como funciona jajaja
Demasiadas líneas aunque tal vez sean necesarias.

Esto es pantallaprincipal() de 789 hasta 980 o sea 200 lineas. Dime como es posible que necesitas 200 lineas para una rutina?
En fin... ya veremos como hago

En esta parte del código lees el ad y luego lo conviertes a humedad

int median = medianFilter.AddValue(analogRead(sensorPin));
    // llamamos a la función humedadporcentaje, pasándole el valorHumedad en porcentaje, para que valore si está por debajo del 10, que mueva los caracteres en el LCD para una correcta visualización    
  	int valorHumedad = map(median, 0, 1023, 100, 0);

	// Cogemos la información del sensor de humedad por segunda vez.
	int humedad2 = analogRead(sensorPin);

	// Mostrar el reloj en el monitor serial
	Serial.print("Hora: ");
	digitalClockDisplay();

	// Imprimimos por pantalla los valores de humedad y su porcentaje tanto en LCD como en Serial Monitor.
	Serial.print("Humedad en porcentaje: ");
	Serial.print(valorHumedad);
	Serial.println("%  ");

	Serial.print("Humedad en valor: ");
	Serial.println(humedad2);

	lcd.setCursor(0,0);
	lcd.write("Hora: ");

	lcd.setCursor(0,1);
	lcd.write("Regando: ");
	lcd.setCursor(0,2);
	lcd.write("Humedad: ");

	lcd.setCursor(9,2);
	lcd.print(humedad2);
	lcd.setCursor(12,2);
	lcd.print("   ");

En lugar de presentarlo asi

lo haces asi

	lcd.setCursor(0,0);
	lcd.write("Hora: ");

	lcd.setCursor(0,1);
	lcd.write("Regando: ");

	lcd.setCursor(0,2);
        //                   01234567890123456789
        sprintf(buffer, "Humedad: %03d             ", humedad2); 
	lcd.print(buffer);

Pero no lo haces con 1 lo haces con cada linea del LCD entonces siempre se imprimirán correctamente en 20 espacios disponibles.

Hola,
Tengo un Higrow, que mide temperatura y humedad del aire, y lo que mas me interesa es el sensor capacitivo que tiene para medir la humedad del suelo.
Soy iniciante, asi que algunos terminos no estaran tecnicamente bien definidos, pido disculpas de antemano. El codigo que tengo hace la lectura del sensor capacitivo "AnalogRead(32)" percibi que las lecturas van de 3278 (para cuando esta en el ambiente) y hasta 1577 (cuando esta en el agua). En el codigo del arduino coloque para hacer la lectura del maximo valor y del minimo valor; y a partir de ahi hice algunas condicionales para que pueda entregar la lectura de humedad del suelo en porcentaje (%). La cuestión es que me preste un sensor comercial de humedad del suelo (Falker) y compare con las lecturas que tengo, pues no estan coincidiendo.

Tienen alguna recomendacion?

Muchas gracias

Hi,
Aqui el problema pueder ser que las tolerancias de ambos sensores son diferentes. Compara las tolerancias de ambos sensores para ver si hay alguna diferencia.