Problema con un sensor de humedad

Buenas noches a todos , tengo un problema con un sensor de humedad.

Es una sonda YL-69 con dos terminales separados adecuadamente y un módulo YL-38 que contiene un CI comparador LM393 SMD (de soldado superficial) muy estable, un led de encendido y otro de activación de salida digital
mi problema es el siguiente:
necesito medir la humedad de tierra de una maceta, los valores que necesito son:

99% cuando la tierra esta húmeda y 0% cuando esta seca

no se porque pero me lee lo contrario

o sea:

99% cuando esta seca y 0% cuando esta húmeda

¿como puedo hacer para invertir esos valores?

no se si es un problema en mi código o es el sensor

int humeValue = 0;
int luzValue = 0;
int humedad;
int luz;
int regarPin = 2;
int sensorHumedad = A5;
int sensorLuz = A0;
void setup() {
pinMode(regarPin, OUTPUT);
Serial.begin(9600); 
}
void loop() {
humeValue = analogRead(sensorHumedad);
luzValue = analogRead(sensorLuz);
delay(1500);
// ----------------------------------------------------
// Imprimir valores
// ----------------------------------------------------
int humedad_actual=map(analogRead(5),0,1023,0,100);
humedad = (100.0 * humeValue)  / 1023;
 Serial.print("Humedad:");
Serial.println(humedad);
Serial.println("");
int luz_actual=map(analogRead(0),0, 1023, 100, 0);
luz = (100.0 * luzValue) / 1023;
Serial.print("Luz:");
Serial.print(luz);
Serial.println("%");
Serial.println("=======================================================================");
// ----------------------------------------------------
// Chequeo si debo regar
// ----------------------------------------------------
if( humedad >= 50 & luz < 50 ) {
digitalWrite(regarPin, HIGH);
Serial.println("Debe regar");
}
else{
digitalWrite(regarPin, LOW);
Serial.println("NO debe regar");
}
Serial.println("=======================================================================");
}

https://forum.arduino.cc/index.php?board=32.0

Nunca use ese sensor, pero si "99" es el valor que entrega cuando la tierra esta seca y "0" cuando esta humeda(suponiendo que así es como funciona el sensor, si las mediciones concuerdan con la humedad pero a la inversa) simplemente invertí el mapeo.

int humedad_actual=map(analogRead(5),0,1023,100,0);

Pero espera que alguien que lo haya usado te confirme que así es como realmente funciona.

Saludos!

Es correcto steel_series, el sensor trabaja al revés y tu solución es la que se usa.
De todas formas es un mal sensor. y a los 3 meses lucirá oxidado si lo usas permanentemente.

Debes limitar el uso y ahora me dirijo a puravida. Como haces eso? Pues conecta la alimentación del sensor a un pin que le de 5V y cuando lo hagas lees y luego de hacerlo lo apagas.
En lo personal como estaras en un medio con agua o humedad es posible un corto y que quemes ese pin asi que usa un transitor o un RELE que lo alimente. SI no sabes cómo, consulta que te diremos.

surbyte:
En lo personal como estaras en un medio con agua o humedad es posible un corto y que quemes ese pin asi que usa un transitor o un RELE que lo alimente. SI no sabes cómo, consulta que te diremos.

A mi me funciona muy bien con este Mosfet y si le das al sensor alguna pintura conductiva con algo de grafito, me están aguantando varios meses sin problemas.

Es que accionandolo cuando mides y no de modo continuo y protegiéndolo, el sensor funciona bien y por buen tiempo.

surbyte:
Como haces eso? Pues conecta la alimentación del sensor a un pin que le de 5V y cuando lo hagas lees y luego de hacerlo lo apagas.
En lo personal como estaras en un medio con agua o humedad es posible un corto y que quemes ese pin asi que usa un transitor o un RELE que lo alimente. SI no sabes cómo, consulta que te diremos.

es un proyecto para mi jardín, conecto el sensor a la tierra y cuando la humedad está por debajo de lo programada activa un rele que esta conectado a una bomba de agua, probé con invertir el mapeo pero me parece que lo estoy haciendo mal ya que no se de programacion y eso juega muy en contra

steel_series:
(suponiendo que así es como funciona el sensor, si las mediciones concuerdan con la humedad pero a la inversa) simplemente invertí el mapeo.

si te fijas en el código ya probe invertir el mapeo, mi problema es que no se nada de programación y no se si lo he hecho bien, ¿puedes guiarme?

Tenes algunas cosas mal en tu código.
Hay variables que las tenes definidas como entero y le asignas A5 y A0. (Int solo acepta números enteros)

/*int humeValue = 0;
int luzValue = 0;*/

#define regarPin 2
#define sensorLuz 14        //A0 = 14
#define sensorHumedad 19  // A5 = 19

int humedad;
int luz;
      
void setup() {
pinMode(regarPin, OUTPUT);
Serial.begin(9600); 
}

void loop() {

delay(1500);

// ----------------------------------------------------
// Imprimir valores
// ----------------------------------------------------

humedad=map(analogRead(sensorHumedad),0,1023,100,0);

//humedad = (100.0 * humeValue)  / 1023;// esto no se para que lo haces

Serial.print("Humedad:");
Serial.print(humedad);
Serial.println(" %");
Serial.println("");

luz=map(analogRead(sensorLuz),0, 1023, 100, 0);

//luz = (100.0 * luzValue) / 1023;// esto no se para que lo haces

Serial.print("Luz:");
Serial.print(luz);
Serial.println("%");
Serial.println("=======================================================================");
// ----------------------------------------------------
// Chequeo si debo regar
// ----------------------------------------------------

if( (humedad <= 50) && (luz < 50) ) {
digitalWrite(regarPin, HIGH);
Serial.println("Regando");
}
else{
digitalWrite(regarPin, LOW);
Serial.println("NO debe regar");
}
Serial.println("=======================================================================");
}

Ahí edite y cambie algunas cosas mas, fijate si así te funciona.
Saludos!

1 Like

Mismo código que steel_series, indentado (algo que no se porque no hizo ninguno), A0 y A5 restaurados. Usar 14 y 19 esta bien pero no lo entiende nadie.

El delay(1500) lo pongo al final. No cambia nada pero arrancar con ese delay() que sentido tiene, en cambio si lo tiene al final del ciclo. Basicamente es lo mismo. No merece discusión.

Los parentesis en los if tampoco tienen sentido y no estan mal pero solo aporto otra forma de escribirlo para tu aprendizaje puravida.

El código es muy simple y comprendo que estas en los primeros pasos pero hay que intentar cosas por su cuenta.
Cuando no se sabe, se busca lo que no se entiende. Y si de su lectura tampoco se comprende entonces si se consulta.
Caso map... es una función que básicamente es una regla de tres simple. Pones todos los limites como quieras y la función devuelve lo que le has dicho.

La mejor solución cuando pasa eso es apartarse de tu código principal y probarla aparte y ver como se comporta haciendo cosas diferentes. Eso no modifica tu código y aprendes a usar la función que sea.

Bien, aca dejo tu código con estas pequeñeces que he corregido, para el lector que llegue

#define regarPin 		2
#define sensorLuz 		A0  // A0 = 14
#define sensorHumedad 	A5  // A5 = 19

int humedad;
int luz;
      
void setup() {
	pinMode(regarPin, OUTPUT);
	Serial.begin(9600); 
}

void loop() {
	
	humedad = map(analogRead(sensorHumedad),0,1023,100,0);

	// ----------------------------------------------------
	// Imprimir valores
	// ----------------------------------------------------
	Serial.print("Humedad:");
	Serial.print(humedad);
	Serial.println(" %");
	Serial.println("");

	luz = map(analogRead(sensorLuz),0, 1023, 100, 0);

	Serial.print("Luz:");
	Serial.print(luz);
	Serial.println("%");
	Serial.println("=======================================================================");
	// ----------------------------------------------------
	// Chequeo si debo regar
	// ----------------------------------------------------

	if (humedad <= 50 && luz < 50) {  // baja humedad y poca luz
		digitalWrite(regarPin, HIGH);  // Riego
		Serial.println("Regando");
	}
	else{
		digitalWrite(regarPin, LOW);   // No riego
		Serial.println("NO debe regar");
	}
	Serial.println("=======================================================================");
	delay(1500);
}

Si con digitalWrite(regarPin, HIGH) controlas un RELE te diré que esto no funcionará.
Los reles trabajan invertidos. Los que compramos (módulos celestes) se activan con LOW y desactivan con HIGH

surbyte & steel_series les agradezco de corazón no solo por la ayuda la cual me sirvió para corregir mi problema sino que también por la explicación que me dieron, me va a servir al momento de un próximo proyecto

La ayuda fue de steel. Lo mio solo cosmética.

Es importante que aprendas por tu cuenta a cometer errores y aprender de ellos.
Como te dije, si algo no funciona, lo apartas y lo trabajas por separado hasta encontrarle la vuelta.
Nunca en el mismo código porque solo te confundirá.

Un código simple con el problema o duda que tengas. Lo analizas, usas el monitor serie para saber que hace. Lo miras con delay() si quieres, asi ves los pasos, y de a poco lo entenderas y resolverás. Asi se aprende!!

Me alegra que te hayamos podido ayudar, yo también estoy aprendiendo, y poder compartir lo poco que se, ayuda a reforzar el aprendizaje.

Saludos!