Go Down

Topic: Valores del sensor capacitivo de humedad del suelo (Read 530 times) previous topic - next topic

cotarejo

May 26, 2018, 05:50 pm Last Edit: May 26, 2018, 06:00 pm by cotarejo
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??




cotarejo

#1
May 26, 2018, 06:08 pm Last Edit: May 26, 2018, 06:19 pm by cotarejo
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:



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!

tauro0221

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.

surbyte

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.

cotarejo

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!

tauro0221

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

surbyte

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?

cotarejo

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.!

surbyte

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


cotarejo

#9
May 29, 2018, 04:24 pm Last Edit: May 29, 2018, 04:33 pm by cotarejo
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":



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



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í:



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



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!!!

surbyte

Quote
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.


Quote
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.

Quote
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

Code: [Select]
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
Code: [Select]
sprintf(buffer,"HUMEDAD: %03d HT %02d%", humedad, humedadHT);
lcd.print(buffer);


nunca se te desplazará nada.

Lo mismo con las demas impresiones de lineas

cotarejo

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....

Quote
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:

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

Quote
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 
Code: [Select]
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.... ;)


surbyte

Quote
¿¿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

Code: [Select]
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
Code: [Select]
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.

Go Up