Hola compañeros!
Tengo un hidropónico para verduras que va todo con luz solar, todo a 12 v bombas y demás útiles.
Dispongo de un Arduino UNO, 3 módulos sensores de detección de voltaje para Arduino DC0-25V, 2 relés de un canal, 2 controladores de carga y un led rgb para controlar la batería de la pila.
Con Arduino estoy controlando dos baterías de 12v que se cargan con un panel solar, las cuales quiero que a la que una batería este agotándose, pase seguido a la siguiente y así en continuo,
todo el tema es sencillo, pero hay algo en la programación que me esta volviendo loco.
En si puse esto:
if(valueA>=12.0) {
digitalWrite(releA, LOW); // salida NC relé
digitalWrite(releB, LOW); // salida NC relé
}
if(valueA<11.8) {
digitalWrite(releA, HIGH); // salida NO relé
digitalWrite(releB, HIGH); // salida NO relé
delay(180000000);
entiendo aquí que si el valor de la batería es menos a 11,8 v dejaría en High durante 5 horas, cambiando el estado del relé y cogiendo de la otra.
la cosa es que no espera las 5 horas, pasado alrededor de un minuto salta y se empieza a volver loco abriendo y cerrando los relés cada vez mas rápido...
primero lo tenia con millis, me pensé que era eso y lo a cambie a delay, obteniendo el mismo resultado : P
parece que pasa esto cuando detecta que ValueA esta a 12 otra vez, de hecho el delay debería bloquear cualquier paso de la programación hasta que pasen las 5 horas, no?
seguramente será alguna tontería que se me escapa, pero ahora no caigo, a ver si alguien me ilumina o me orienta, en lo que pueda estar errado, de hecho voy ajustado valores para que se adapten a los voltajes reales, según voy midiendo.
copio todo el código:
const int sensorPinA = A0; // seleccionar la entrada para el sensor
const int sensorPinB= A2; // seleccionar la entrada para el sensor
const int sensorrgb= A3; // seleccionar la entrada para el sensor
int sensorValueA; // variable que almacena el valor raw (0 a 1023)
int sensorValueB; // variable que almacena el valor raw (0 a 1023)
int sensorValuer1; // variable que almacena el valor raw (0 a 1023)
float valueA; // variable que almacena el voltaje (0.0 a 25.0)
int releA=8; //salida 8
float valueB; // variable que almacena el voltaje (0.0 a 25.0)
int releB=7; //salida 7
float valueR1; // variable que almacena el voltaje (0.0 a 25.0)
int rojo=6; //salida 6
int verde=5; //salida 5
int azul=3; //salida 3
unsigned long timbat1off = 0;
void setup() {
Serial.begin(9600);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(rojo, OUTPUT);
pinMode(verde, OUTPUT);
pinMode(azul, OUTPUT);
}
void loop(){
//led control pila
sensorValuer1 = analogRead(sensorrgb); // realizar la lectura
valueR1 = fmap(sensorValuer1, 0, 1023, 0.0, 25.0); // cambiar escala a 0.0 - 25.0
Serial.print("Valuer1: ");
Serial.println(valueR1); // mostrar el valor por serial
delay(1100);
if(valueR1<=5.0 ) {
analogWrite(rojo,255);
analogWrite(azul,0);
analogWrite(verde,0);
}
sensorValuer1 = analogRead(sensorrgb); // realizar la lectura
valueR1 = fmap(sensorValuer1, 0, 1023, 0.0, 25.0); // cambiar escala a 0.0 - 25.0
if(valueR1>=6.0) {
analogWrite(rojo,255);
analogWrite(azul,0);
analogWrite(verde,90);
}
sensorValuer1 = analogRead(sensorrgb); // realizar la lectura
valueR1 = fmap(sensorValuer1, 0, 1023, 0.0, 25.0); // cambiar escala a 0.0 - 25.0
if(valueR1>=8.0 ) {
analogWrite(rojo,0);
analogWrite(azul,0);
analogWrite(verde,255);
}
{
sensorValueA = analogRead(sensorPinA); // realizar la lectura
valueA = fmap(sensorValueA, 0, 1023, 0.0, 25.0); // cambiar escala a 0.0 - 25.0
Serial.print("ValueA: ");
Serial.println(valueA); // mostrar el valor por serial
delay(1000);
sensorValueB = analogRead(sensorPinB); // realizar la lectura
valueB = fmap(sensorValueB, 0, 1023, 0.0, 25.0); // cambiar escala a 0.0 - 25.0
Serial.print("ValueB: ");
Serial.println(valueB); // mostrar el valor por serial
delay(2000);
if(valueA>=12.0) {
digitalWrite(releA, LOW); // salida NC relé
digitalWrite(releB, LOW); // salida NC relé
}
if(valueA<11.8) {
digitalWrite(releA, HIGH); // salida NO relé
digitalWrite(releB, HIGH); // salida NO relé
delay(180000000);
//timbat1off = millis(); // timer on
//if (millis()- timbat1off> 3600000); //
}
}
}
// cambio de escala entre floats
float fmap(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
saludos y gracias por vuestro tiempo de antemano.