Control de relé en funcion del voltaje de la bateria (instalacion solar)

Hola!

Tengo una instalacion solar con baterias y mi intencion es que cuando las baterias esten cargadas, es decir por encima de 13,5 voltios, se encienda el congelador durante una hora y media, despues lo desconecte y conecte otro rele que controla un calentador electrico. Todo esto mientras el voltaje no baje de 13 voltios, en caso de que baje de ese voltaje se pare.
Tambien me gustaria incluir un boton que al accionarlo pause todo el programa durante una hora y media para poder usar la lavadora, y pasado ese rato continue.
Tengo un arduino UNO y una placa de 4 reles.

Como podria programarlo?alguna idea plis?

Gracias!

Vicman

Yo veo dos opciones:

1.-Aprender a programar Arduino. Si yo pude, tu también podrás.

2.-Contratar a un profesional (pagando sus honorarios)

Hay un subforo en este foro que se llama documentación, hay gran cantidad de tutoriales.
Te compras un libro, de arduino y lo lees completo.
Cuando lo termines sabras encararlo con seguridad.
También te compras otro libro de electricidad porque tu pregunta demuestra que desconoces cuestiones básicas.

Con ambos libros podras encarar tu proyecto sin problemas.

A ver, gracias por la respuesta, pero ya llevo dias estudiandome un poco el tema y estoy aprendiendo. Y de electricidad pues no soy un profesional pero desde luego tengo algo de idea, lo que pasa es que estaba intentando abrir un poco el tema y a partir de ahi mirar el que sin tener que demostrar mis conocimientos.

Ya se hacer cuatro cosas con arduino, simplemente mi pregunta es como hacer para que durante la orden "while" tenga en cuenta la variable del voltaje sin tener que esperar a llegar a ejecutar toda la orden, es decir;

while (voltaje>13.5) {

pinMode(2,HIGH); (rele 1)
pinMode(3,LOW); (rele 2)
delay (5400000);

pinMode(2,LOW); (rele 1)
pinMode(3,HIGH); (rele 2)
delay (5400000);
}

Si empieza a ejecutar la orden porque el voltaje es el correcto y mientras esta ejecutandose baja el voltaje, hay alguna orden para que continuamente este pendiente de la variable?o hay que definir un tipo de variable?

gracias

No te ofendas pero esto que muestras es una barbaridad

while (voltaje>13.5) {

  pinMode(2,HIGH);  (rele 1)
  pinMode(3,LOW);  (rele 2)
  delay (5400000);

  pinMode(2,LOW);  (rele 1)
  pinMode(3,HIGH);  (rele 2)
  delay (5400000);
}

5400 x 1000 mseg = 5400 segundos = 90 min

90 min que el arduino no hará nada de nada.
Me imagino que te darás cuenta que eso no va.

Te recomiendo veas el ejemplo de Blink sin delay, que usa millis()
Intenta modificar lo que has mostrado usando millis() eso permitirá que el Arduino siga funcionando aun cuando se cumpla tu condición y deba esperar 90 min

hola gente!

Sigo intentando programar el arduino para lo que comenté mas arriba, he estado mirando lo del tiempo y teniais razón en que era una burrada jeje, ahora estoy en esta fase;

#include <Metro.h>
#include <Wire.h>
Metro serialMetro = Metro(2000); 
int rele = 2;
int rele2 = 6;
int val;
int ledState = LOW;
int valor;

void setup() {
 
 pinMode(rele, OUTPUT);
 pinMode(rele2, OUTPUT);
 pinMode(3,INPUT);
 
}

void loop() {
   
 val = analogRead(3);
 float valor = val * (5.0 / 1023.0);
 
 if (serialMetro.check() == 1) {
     if (ledState == LOW) {
     ledState = HIGH;} 
     else {
     ledState = LOW;}
     }

if(valor > 2.15){
 
 digitalWrite(rele, ledState);
 digitalWrite(rele2, !ledState);} 

else if(valor <= 2.15){
 
 digitalWrite(rele, LOW);
 digitalWrite(rele2, LOW);}
}

Como deberia estructurar mejor todo esto para que funcione, porque no se ver donde esta el problema de que se lie el arduino. Porque al leerme el voltaje cuando es mayor de 2.15 se enciende un rele y se apaga el otro pero cuando baja de 2.15 en vez de apagarse los dos, se encienden.

Una ayudita plis??
:smiley:

Hola.
Muchos módulos de relés funcionan con lógica inversa (se encienden con low y se apagan con high).
Revisa a ver si puede ser tu caso.
Saludos.

Hola vicman2012, intenta usar tags para insertar códigos. Edita el post anterior donde justamente posteaste tu codigo.
Que es o de donde sacaste la librería <Metro.h>

Pasa por este enlace y lee las normas del foro por favor. Mira el punto 7 Como insertar códigos

if(valor > 2.15){
  digitalWrite(rele, ledState);
  digitalWrite(rele2, !ledState);}

else if(valor <= 2.15){
  digitalWrite(rele, LOW);
  digitalWrite(rele2, LOW);}
}

cuando es mayor a 2.15 actuas con el estado de ledstate y luego los pones en LOW?
Debe ser asi

if(valor > 2.15){
  digitalWrite(rele, HIGH);
  digitalWrite(rele2, HIGH);}

else if(valor <= 2.15){
  digitalWrite(rele, LOW);
  digitalWrite(rele2, LOW);}
}

Lo que no puedes hacer es poner condiciones tan estrictas porque el AD no es tan bueno y siempre existe ruido asi que los reles oscilarán alrededor de 2.15 y 2.16.
Normalmente se establece una histéresis que es una ventana para que justamente no esten conmutando de un estado al otro.

Gracias por las respuestas!

Pasa por este enlace y lee las normas del foro por favor. Mira el punto 7 Como insertar códigos

siento lo del codigo, ya esta arreglado!

Muchos módulos de relés funcionan con lógica inversa (se encienden con low y se apagan con high).

Ostras! pues si que el problema era que se encienden con low y se apagan con high :sweat_smile:

Que es o de donde sacaste la librería <Metro.h>

Pues la he encontrado por internet, es para controlar los tiempos, es que con el millis este no me aclaraba

cuando es mayor a 2.15 actuas con el estado de ledstate y luego los pones en LOW?

Porque la idea es que cuando baja de cierto voltaje se apague todo si o si

Bueno, he retocado un poco el codigo;

#include <Metro.h>
#include <Wire.h>
Metro serialMetro = Metro(2000); 
int rele = 2;
int rele2 = 6;
int estadorele = LOW;
int valor;

float voltage;

float readBattery(){
  voltage = analogRead(3);
  return voltage;
}
  
void setup() {
  
  pinMode(rele, OUTPUT);
  pinMode(rele2, OUTPUT);
  pinMode(3,INPUT);
  Serial.begin(9600);
 
}

void loop() {

Serial.println (voltage);
delay(300);

if (readBattery() > 400){
  
    if (serialMetro.check() == 1) {
      if (estadorele == LOW) {
      estadorele = HIGH;} 
      else {
      estadorele = LOW;}
      }
  
  digitalWrite(rele, estadorele);
  digitalWrite(rele2, !estadorele);

  }
  
else{
  digitalWrite(rele, HIGH);
  digitalWrite(rele2, HIGH);
  
}

}

ahora mirare esto de la histeresis esta a ver, tambien estoy intentando averiguar como hacer para que me diga en la pantalla lcd quien esta en marcha, si el rele 1 o el 2. Se visualizar en el lcd lo que quiera mas o menos pero estoy intentando ver en que parte del codigo ponerlo.

Victor

POr lo visto yo lo entendí mal.
La histéresis es básicamente una diferencia que debe superarse para que un rele o contactor no oscile.
supongamos que tomas una histeresis de 10.
Tu ahora estas controlando contra 400

if (readBattery() > 400){

Entonces aplicada la histeris tendrias cambios en 405 y en 395.
Algo que supere 405 activa los reles y algo que queda por debajo de 395 los desactiva.
Entonces una lectura con ruido no generará oscilaciones.