Regulador de carga Fotovoltaico

Hola buenas. Lo primero dar gracias a este foro tan instructivo. De aquí saque varias ideas para mi invernadero y comedero automático de animales.
Vivo en una casa con paneles solares. Mi regulador de carga se averió y la verdad es bastante viejo y malo, no merece la pena repararlo.
Como tengo un Arduino Mega (que ya utilizo para otros servicios) y me sobran pines, quiero incorporar un Regulador de carga de las baterías (plomo-ácido). Imagino que no sera muy complicado, pero mi torpeza y novato que soy, me obliga a pedir ayuda o consejos.
Mi instalación fotovoltaica es a 12 voltios, varios paneles solares que siempre voy ampliando cuando puedo. Actualmente la carga máxima son 25 Ah, espero aumentarla. 6 vasos de 2v a 660 Ah en C10 (tiempo de descarga 10h). Esta carga me obliga a utilizar un rele. El rele que tengo de 100A es este http://www.hongfa.com/pro/pdf/HFE28_en.pdf. Es un rele con enclava-miento mecánico, solo necesita un impulso para cambiar de estado a dos contactos. Aquí tengo mi problema. Ademas el positivo del rele, es el común, atraves de las masas gobernamos hacia NO o NC. En resumen para gobernar rele tiene tres contactos, positivo (comun entre bobinas), un contacto que poniendo masa lo lleva al NO y otro igual pero que lo lleva a NC.
Busque voltimetros, reguladores y demás … pero siempre me falla que a el rele lo excitan constantemente, Yo solo quiero un impulso y deje de dar tensión a la bobina, ya que recuerda la posición el rele y no quiero quemarlo.
Para medir el voltaje en baterías, utilizo un divisor de tensión de tres resistencias (1k 1/4w), Despues multiplico por tres y arreglado. Esto me funciona bien. Pero con led de prueba o un rele normal, entre que el mio utiliza la masa y se enclava … uff liada que llevo.
esta es la parte de el regulador … lo de el comedero e invernadero me lo salto.

#include <LiquidCrystal.h> // Libreria para lcd
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);//pines lcd
float lectura;//variable lectura analogica
float voltaje=0;//variable conversion lectura a voltios
int rele1= 22;//pin para salida NO
int rele2=24;//pin para salida NC
void setup() { 
  lcd.begin(16, 2);//inicio lcd
  lcd.setCursor(3,0);
  lcd.print("INICIANDO ");
  lcd.setCursor(3,1);
  lcd.print("REGULADOR");
  Serial.begin(9600);
  delay(1000);
  lcd.clear();
  pinMode (rele1,OUTPUT);//declaro salidas.. 
  pinMode (rele2,OUTPUT);
  
}

void loop() {
   lectura_voltios(1,2);//llamo funcion de lectura
   lcd.setCursor(0,0);
   lcd.print("Voltaje medido:");
   lcd.setCursor(8, 1);
   lcd.print("Voltios");
   Serial.println((voltaje)*3);//multiplico por tres al haber un divisor de tension
   if (voltaje*3>=13.40)digitalWrite (rele1,HIGH);
   if (voltaje*3<13.40)digitalWrite(rele1, LOW);
   
   if (voltaje*3>13.40)digitalWrite (rele2,LOW);
   if (voltaje*3<13.00)digitalWrite (rele2,HIGH);
   delay(200);
} 

void lectura_voltios(float unidad, int decimales)
{                              // funcion leer el divisor de tension
  lectura=analogRead(A1);
  voltaje = ((5*float(lectura))/1023);
  lcd.setCursor(0, 1);
  lcd.print(float(voltaje)*3*unidad,decimales);
  delay(200);
}

Si alguien quiere echarme una mano, recuerde el rele se excita por la masa y tiene enclavamiento, solo necesita un impulso en determinado voltaje para variar su estado.
También seria bueno para la carga correcta de las baterías, el hacer una equalizacion cada mes, para eso tengo pedido un modulo RTC.
Con los menús también llevo mi lió personal, pero hay bastante info por aquí en el foro.
Un saludo, gracias por todo y haber como resuelvo esto.

Olvide decir, que el rele tendré que gobernarlo con otro rele y la alimentacion sera externa, es demasiada intensidad para arduino, eso me quita el problema de la polaridad del rele, pero sigo con mi problema de un solo impulso… cachis
Tambien podria alimentarl el rele con un trasistor? imagino que si…

Bueno...... pues no veo manera de hacerlo con mi fantástico rele reciclado de un contador Enel. Seguire probando me gusta reciclar. Lo usare para equalizar las baterías manualmente. Pero encontré esto, muy interesante para hacer un regulador MPPT, me permite seriar placas solares de cualquier voltaje y cargar a 12 voltios, máxima eficiencia . Dejo el link http://www.timnolan.com/index.php?page=arduino-ppt-solar-charger También vi otro interesante que hace un regulador hibrido (solar-eolico), hace unos aerogeneradores realmente chulos, con los mios siempre tuve problemas....jejeje chapuzas que soy. http://www.mdpub.com/Wind_Turbine/index.html me gusto mucho su manera de trabajar, recicla y hace simples muchas cosas que yo liaba. Seguire con mi menu de mi ardu-huerto que me esta liando.... saludos

Para enviar un pulso tienes que poner el pin en un estado, luego tener un delay y volver a cambiar de estado el pin.

Modifique según tu consejo. de momento y funciona, tengo que afinarlo mucho mas, las baterías es algo muy importante que mimar en una instalación solar.
Muchas gracias amigo.
asi voy

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
float lectura;
float voltaje=0;
int rele1= 22;
int rele2=24;
void setup() { 
  lcd.begin(16, 2);
  lcd.setCursor(3,0);
  lcd.print("INICIANDO ");
  lcd.setCursor(3,1);
  lcd.print("REGULADOR");
  Serial.begin(9600);
  delay(2500);
  lcd.clear();
  pinMode (rele1,OUTPUT);
  pinMode (rele2,OUTPUT);
  
}

void loop() {
   lectura_voltios(1,2);
   lcd.setCursor(0,0);
   lcd.print("Voltaje medido:");
   lcd.setCursor(8, 1);
   lcd.print("Voltios");
   Serial.println((voltaje)*3);
   if (voltaje*3>=13.50)
   {
     digitalWrite (rele1,HIGH);//rele1 que excita la bobina N.C del 100amp
     delay (200);//delay sugerido por el compañero
     digitalWrite (rele1,LOW);//vuelvo a su estado bajo
    
   }
   if (voltaje*3<13.30)
   {
     digitalWrite(rele2, HIGH);//rele2 que excita la bobina del N.O del 100amp
   delay (200);
   digitalWrite (rele2,LOW);//vuelvo a su estado bajo
   }
   delay(200);
} 

void lectura_voltios(float unidad, int decimales)
{
  lectura=analogRead(A1);
  voltaje = ((5*float(lectura))/1023);
  lcd.setCursor(0, 1);
  lcd.print(float(voltaje)*3*unidad,decimales);
  delay(200);
}

saludos y gracias… pulire esto mas cuando me deje tiempo el huerto.

Pues asi se me queda en intermitencia. lo probe con fuente regulable y led para simular los reles
algo hago mal…jeje

El datasheet dice que el pulso debe ser de 100ms, y el que estás poniendo es de 200ms. No sé si eso puede ser la causa. No entiendo por qué usas dos If...con la estructura como está, si el voltaje es 13.4 no entra a ninguno. Tienes un esquema del circuito que estás usando? Veo que haces varios castings con los float, reconozco que no soy un experto en ese tema, pero si se que eso me ha dado muchos dolores de cabeza. Yo manejaría el voltaje siempre como un entero, y solo lo convertiría a float para mostrarlo. Cual es el modelo exacto del relé que estás usando? Si le envías dos pulsos seguidos al mismo contacto, cambia o no cambia?

Claro que puedo poner esquema............ http://i60.tinypic.com/30kbouf.jpg Creo que parpadea, cuando esta en la zona critica del if. Cuando deja de estar deja de parpadear. Estoy pensando en contar impulsos y cuando tenga el contador valor de uno dejar de parpadear. Es una idea. No me corre prisa, en casa gastamos mas electricidad que producimos y la equalizacion, la hacemos con generador de gasolina. Pero me gustaría mucho entender esto. Gracias de nuevo amigo.

No es problema del pulso de 200milis. El rele se clava . Hice pruebas. Necesita minimos 100milis pero sin quemarse aguanta varios segundos, para cambiar de estado N.O a N.C necesita siempre una excitación por el otro bobinado.
Con un circuito eléctrico lo resuelvo, pero me gustaría por programación. Es un reto y me gustan estas cosas… así mientras pienso en esto no discuto con la suegra jejej

Cambie las resistencias por 4 de 10k, modifique el rango de los cortes, también quite el lió que me llevaba con los float, estoy añadiendo dos contadores de pulsos y con esto evitar el parpadeo de reles. Lo veo poco exacto en la medida, vi que hay integrados específicos como el ADE7753 http://www.analog.com/static/imported-files/data_sheets/ADE7753.pdf, el rele este en cuestion lleva un shunt integrado,igual intento sacar de allí el amperaje. Queda funcional, ahora añadiré amperimetro de entrada y la opción de dar orden al generador si están las baterías menos de 11,80v, Ya recibí la ethernet y el rtc, también acoplare eso para saber desde el móvil como va el huerto, las baterías , la comida del perro y demás. Un saludo y gracias

El que este relé "latching" se active con pulsos, y esos pulsos los controles con otros relés, es complicado. Y si pruebas con unos transistores (grandes)? Unos TIP31 por ejemplo. Saludos

Hola pgmartin. La cosa era utilizar el rele de 100Ap para poder aumentar las placas cuando quisiera o pudiera y de paso reciclar tecnología que tengo mucha.
Entre tu sugerencia y dos contadores que le puse, funciona perfectamente.
El circuito lo volví a modificar, tres resistencias de 10k, 1/4w , 1% tolerancia, ahora hasta es muy fiable la medida un + - 10 mvol… aceptable para las baterías.
Ahora se trata de otro impulso para encender generador cuando el voltaje baje de 11,8v (lleve un tiempo con esa medida), tambien quiero poner amperimetro de carga y mas cosas.
Así , si funciona correctamente.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
float voltios_por_analog = 0.004887586; //Valor en voltios de uno de los niveles de la entrada analógica (1-1023)
float valor_analog, voltios;
int rele1= 22;
int rele2=24;
int entrada=4;
int conta1=0;
int conta2=0;
void setup() { 
  lcd.begin(16, 2);
  lcd.setCursor(3,0);
  lcd.print("INICIANDO ");
  lcd.setCursor(3,1);
  lcd.print("REGULADOR");
  delay(2500);
  lcd.clear();
  pinMode (rele1,OUTPUT);
  pinMode (rele2,OUTPUT);
  pinMode (entrada, INPUT);
  
}

void loop() {
  valor_analog = analogRead (entrada); //Damos a valor_analogo
  voltios = valor_analog*voltios_por_analog*3; //Se hace el cálculo del voltaje.10k 3 resistencias
   
   lcd.setCursor(0,0);
   lcd.print("Monitor Baterias:");
   lcd.setCursor(0, 1);
   lcd.print(voltios);
   lcd.setCursor(8, 1);
   lcd.print("Voltios");
  cont1();
  cont2();

   
   if (voltios<12.50)
    {
      if (conta2==0){
     digitalWrite (rele2,HIGH);
     delay(200);
;     digitalWrite (rele2,LOW);//pone rele
     conta2++;
     conta1=0;
    }
    }
    
       if (voltios>13.40 and voltios<15.10)
   {
     if (conta1==0){
     digitalWrite (rele1,HIGH);
     delay(200);
     digitalWrite (rele1,LOW);//corta rele  
     conta1++;
     conta2=0;
   }
   }
        delay(800);
} 
   
   void cont1(){ 
        if(conta1>=1){
        digitalWrite (rele1,LOW);
       
        }
        }
   void cont2(){   
        if(conta2>=1){
        digitalWrite (rele2,LOW);
        conta1=0;
        }
        }

Un saludo y cuando tenga todo mi proyecto funcional, lo pondré por aki… si mi suegra no me mata a disgustos jeje

Al final cambie los reles (encargados de manejar al GRAN rele) por dos transistores BC337 , baratos y hacen la misma función..... !bendita electrónica¡ Para la medición de corriente entrante por placas, el shunt que incorpora es de 0,00028 Ohm, luego si la corriente puede ser de hasta 100A, la caída de tensión que medirá dicho shunt sera ínfima. Necesito un convertidor de voltajes.... este creo que funcionara. http://www.stanford.edu/class/ee122/Parts_Info/datasheets/Max1017-ICL7660.pdf . Barato también que de eso se trata. Por otro lado, estoy pensando en separar circuitos de placas para poder poner en flotacion las baterias cuando esten llenas..... jejej Saludos y gracias por la info que encontré por aquí en el foro sobre estas cosas o parecidas.

Bueno .... estoy probando ya un pequeño acercamiento al resultado que quiero. Dejo de momento lo que llevo probado de domotizar un huerto e invernadero controlado por web con arduino, tengo que seguir puliendo el código e implementar un jacascript para asegurar la entrada al servidor. esta es la dirección de prueba. http://otomoto.uk.to/ Como subo mi codigo aqui para compartir?......... son 400 lineas....

Hola. En la parte inferior del editor-> aditional options, y adjunta tu archivo .ino. Saludos.

noter:
Hola.
En la parte inferior del editor-> aditional options, y adjunta tu archivo .ino.
Saludos.

Gracias , no lo había visto.
Dejo mi pequeño jardin , invernadero y comedero. Las horas programadas no son reales, solo lo pruebo de momento.
Quiero ampliar la entrada al servidor con pass, grabar datos de alarmas y mejor función de carga en baterías.
Saludos

arduweb.ino (28.5 KB)

Muy buenas,

Me guardo este hilo en favoritos, cuando tenga un rato me lo mirare bien mirado por que lo del regulador de carga con Arduino me interesa bastante.

Muchas gracias por el aporte,

Saludos

Hola Dabauza. Me alegro de que te interese el tema solar como a mi. Ojo con este regulador, es todo o nada, como los antiguos que se usaban, creo que no es la mejor manera de tratar unas baterías de plomo-acido, necesitan su tensión de flotación cuando están llenas y equalizacion de vez en cuando (si se usan bastante cada mes). Recuerda también que utilizo un rele "poco común". Ire puliendo esquema y código poco a poco, ahora entre la temporada del huerto y unas clases de C y Java tengo lio. Un saludo y gracias por echar un ojo por aki.

Muchas gracias a ti por compartir tu proyecto con todo el mundo.

Me quedare por aquí para ver como evoluciona.

Saludos