Delay con baterías 12 v

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.

Modifica esta primer parte de este modo

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  && valueR1 < 6)
  {
    analogWrite(rojo, 255);
    analogWrite(azul, 0);
    analogWrite(verde, 0);
  }
  if (valueR1 >= 6.0 && valueR1 < 8)
  {
    analogWrite(rojo, 255);
    analogWrite(azul, 0);
    analogWrite(verde, 90);
  }
  if (valueR1 >= 8.0)
  {
    analogWrite(rojo, 0);
    analogWrite(azul, 0);
    analogWrite(verde, 255);
  }

Efectivamente.
Aunque se mejore el código como ha hecho @Surbyte , lo unico que es capaz de sacar al MCU de un delay es una interrupcion externa o una interna, y como no se usan externas ni internas con ese código la unica que te puede sacar de ese delay es el brown-out-reset, (reset por fallo en la alimentación). Pienso que algo falla en el conexionado fisico o en el concepto de dicho conexionado. Sube un esquema a ver si viene de eso.
saludos.

Aca he modificado gran parte del código para que trabaje diferente, lo hice rápido asi que puede que tenga alguna falla.

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;
unsigned long timeStart;
bool disparado = false;     // flag en NO disparo

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
  if (millis() - timeStart > 1000UL) { // Solo mido cada 1000 mseg
      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

      if (valueR1 <= 5.0  && valueR1 < 6)   {
        analogWrite(rojo, 255);
        analogWrite(azul, 0);
        analogWrite(verde, 0);
      }
      if (valueR1 >= 6.0 && valueR1 < 8)   {
        analogWrite(rojo, 255);
        analogWrite(azul, 0);
        analogWrite(verde, 90);
      }
      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
 
  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
 

  if (valueA >= 12.0)   {
      digitalWrite(releA, LOW); // salida NC relé
      digitalWrite(releB, LOW); // salida NC relé
  } 
  if (valueA < 11.8)   {
      if (!disparado) {
          digitalWrite(releA, HIGH); // salida NO relé
          digitalWrite(releB, HIGH); // salida NO relé
          disparado = true;          // solo lo disparo 1 vez
          timbat1off = millis();     // comienzo a contar el tiempo
      } 
      if (millis()- timbat1off> 3600000UL) { // cuando se cumpla el tiempo habilito el flag para prerparlo de nuevo
          disparado = false;
      }
  }
}

// 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;
}

Hola buenos días!
muchísimas gracias por vuestras respuestas!!!
como se ve es mi primera programación, faltaba el pulido, gracias @Surbyte
voy a probar el código a ver si es eso, si no revisare conexionado como comenta @gonpezzi .
ya iré comentando
saludos y muchas gracias!!!

Vuelve a pasar lo mismo, si que se nota un reset por fallo de alimentación, se ve como se apaga y se enciende y a partir de hay se vuelve absolutamente loco entrando en un bucle de abrir y cerrar los relés, he cambiado la pila, el cable de alimentación e incluso el UNO tengo varias placas y sigue igual.

Seguiré investigando porque pasa esto :slight_smile: , debe ser cosa de algún conexionado, por tema de programación ya veo que no es
ya os cuento lo que vea
muchas gracias a todos

Ok solucionado!!!
El problema es la pila de 9v, supongo que al pasarla por una plaquita de detección de voltaje y visionarla por un led rgb daba algún bajón de tensión que hacia que la placa entrase en conflicto justo al minuto.
al alimentarla por usb todo funciona perfectamente, como los controladores de carga disponen de salidas usb de carga lo dejare así.
Gracias por vuestro tiempo compañeros!!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.