Forum Navigation
You need to log in to create posts and topics.

Configuración encendidos en alumbrado según estado de apagado

Muy buenas a todos.

Quiero actualizar la iluminación de mi salón y me gustaría pediros opinión sobre mi idea.

Mi salón tiene:

1 lampara de techo, que se controla desde 3 puntos distintos (2 conmutadas y 1 cruzamiento en el salón)

8 focos led en techo, que se controla desde 3 puntos distintos ( 2 conmutadas y 1 cruzamiento en el salón)

El encendido de estos se encienden aplicando a un pin de arduino 5V y se apagan con 0V (cuando actuó sobre los conmutadores del salón)

Los focos actualmente puedo fijar los que se encienden o apagan por medio del md del televisor del salón.

Mi planteamiento es configurarlo para controlarlo con excontrol, app, server y alexa. sin modificar nada la instalación eléctrica de la vivienda.

En el  arduino tendría 2 entradas para el control de encendido y 9 salidas para activar cada foco led y la lampara.

Mi idea seria algo como esto para el encendido y apagado.

Con lampara sin problemas, pero con los focos led me gustaría que si tengo encendido supongamos 1, 3, 5 y 8 cuando los apague y mas tarde vuelva a encenderlos vuelvan a encenderse los mismos que estaban.

Una vez encendidos, con la app, server o alexa , encender mas o menos.

He pensado esto para encender y apagar, no se si sera factible o mejor seria  guardar el estado en la eprom cada vez que apague si ha variado de estado con respecto a lo almacenado.

En principio he pensado hacerlo de esta forma.

GLOBAL VARIABLES ZONE

int control_encendido = 0; // variable para controlar el paso por bucles de circuitos

 

void SwicthStateChange(int NumberInput, int value){

// Control lampara

if (Inputs[0].InState > 0){ // Si el interruptor esta activado

circuits[0].Value = 1; // Enciende lampara

}

else {

circuits[n].Value=0; // Apaga la lampara

}

// Control focos led

if (Inputs[1].InState > 0){ // Si el interruptor esta activado

control_encendido + 1;

if (control_encendido == 1){

for (int n=1;n<Number_Circuit ;n++){ // Recorre los circuitos del 1 al 9

if (circuits[n].OldValue !=0){circuits[n].Value=1;} // Comprueba si el ultimo estado estaba encendido y en caso afirmativo lo enciende

}

}

control_encendido = 2; // Cambia el valor para no volver a recorrer los circuitos

}

 

if (Inputs[1].InState == 0){ // Función que hacemos una vez apagamos

control_encendido - 1;

if (control_encendido == 1){

for (int n=1;n<Number_Circuit - 1;n++){

circuits[n].OldValue = circuits[n].Value;

circuits[n].Value=0;

}

}

control_encendido = 0;

}

No se si sera correcto el codigo que acabo de poner para poder realizar lo que tengo pensado, ademas tendré que controlar tambien el que si no esta activado el pin de encendido no pueda modificar valores desde la app, server y alexa hasta que este activado.

Muchas gracias.

No puedes usar oldvalue para eso... creo que es mejor que uses una variable exclusiva.

Para ver si están encendidos o no simplemente suma los valores... si la suma del valor de todos los circuitos es cero estan apagados... si no alguno esta encendido.

Lo  de la eeprom te ayudara, sin duda.

Muchas gracias por la respuesta.

Creía que esa variable si la podíamos modificar, pero llevas razón mejor una exclusiva.

Como veríais de esta forma, guardando los estados de los circuitos en la memoria, (dirección 101 a la 108 según circuito).

 

USER CODE LIBRARY STAT

#include <EEPROM.h>

 

GLOBAL VARIABLES ZONE

byte Estado_circuits[8];

byte control_encendido = 0; // variable para controlar el paso por bucles de circuitos

 

void UserSetup() { //EQUIVALENT ARDUINO SETUP  FUNCTION

// Cargo el estado que tenian los circuitos de la memoria al iniciar arduino

for (int es = 1; es < 9;es++){

Estado_circuits[es] = EEPROM.read(es + 100);

}

void SwicthStateChange(int NumberInput, int value){

// Control encendido lampara Salon con llave luz

if (Inputs[0].InState > 0){// Si el interruptor esta activado

circuits[0].Value=1; // Enciende lampara

}

else{

circuits[0].Value=0; // Apaga la lampara

}

 

// Control encendido focos led del techo Salon con llave luz

if (Inputs[1].InState > 0){// Si el interruptor esta activado

control_encendido + 1;

if (control_encendido == 1){

for (int n=1;n<Number_Circuit - 1;n++){// Recorre los circuitos del 1 al 9

circuits[n].Value = Estado_circuits[n];

}

control_encendido == 2;

}

if (Inputs[1].InState == 0){// Si el interruptor esta desactivado

control_encendido - 1;

if (control_encendido == 1){

for (int n=1;n<Number_Circuit - 1;n++){

Estado_circuits[n] = circuits[n].Value;

// Si cambia con respecto a su estado anterior actualiza su valor en la memoria

if (Estado_circuits[n] != EEPROM.read(n + 100)){ EEPROM.write((n + 100),Estado_circuits[n]);}

circuits[n].Value=0;

}

}

control_encendido = 0;

}

Muchas gracias

No puedes usar las direcciones de eeprom sin asegurar su disponibilidad.

El sistema ayuda desde el editor de codigo para usar la eeprom sin machacar registros utilizados .

Toma esta imagen como muestra.

El código tiene errores, por ejemplo.

control_encendido + 1;

No seria mas bien esto?

control_encendido =control_encendido + 1;

En general  , el planteamiento del programa nos genera alguna duda.... tal vez interese adquirir una hora de programación de excontrol, como usuario del foro dispones de un gran descuento en el servicio.

Uploaded files:
  • eeprom.fw_.png

Muchas gracias ExControl.

Posiblemente no me explique correctamente y por eso el planteamiento es un poco dudoso.

Creare un esquema de lo que pretendo y lo subo.

Perdonar, no me acordaba de esto.

Como quedara al final.

GLOBAL VARIABLES ZONE

byte N_actuador = 15;
/*
circuito 0 (15) = Focos led salon //Enciende o apaga los led seleccionados
circuito 1 (16) = Led 1 salon
circuito 2 (17) = led 2 salon
circuito 3 (18) = Led 3 salon
circuito 4 (19) = Led 4 salon
circuito 5 (20) = Led 5 salon
circuito 6 (21) = Led 6 salon
circuito 7 (22) = Led 7 salon
circuito 8 (23) = Led 8 salon
circuito 9 (24) = Lampara salon
*/

Control encendidos y apagados utilizando los conmutadores y cruzamientos actuales

void SwicthStateChange(int NumberInput, int value){

// Focos led salon, al apagarlos memoriza el valor y al encenderlos recupera sus valores
if (NumberInput==0){if (circuits[0].Value==1){Memoriza_valor();}else{Lee_valor();}}

// Lampara techo salon
if (NumberInput==1){if (circuits[9].Value==1){circuits[9].Value=0;}else{circuits[9].Value=1;}}

//USER FUNCTIONS

void Memoriza_valor(){
for (int n=1;n<Number_Circuit-1;n++){EepromWrite(User_Eeprom + n, circuits[n].Value); circuits[n].Value=0;}
circuits[0].Value=0;
}

void Lee_valor(){
for (int n=1;n<Number_Circuit-1;n++){ circuits[n].Value = EepromRead(User_Eeprom + n );}
circuits[0].Value=1;
}

Para poder controlar los encendidos globales o unitarios desde app, web y alexa

En parte recepción bus RS485

if (strncmp(frame, "AJ-CIR", 6)==0){
int circuito = (frame[6] - 48) * 10 + (frame[7] - 48);
for (int n = 0; n < Number_Circuit; n++) {
if (N_actuador + n == circuito){
int valor = (frame[11] - 48) * 100 + (frame[12] - 48) * 10 + (frame[13] - 48);
SetCircuits(n,valor);
// Control circuito focos salon
if (n == 0){
if (valor > 0){ for (int c=1;c<Number_Circuit-1;c++){ circuits[c].Value = EepromRead(User_Eeprom + c );}}else{for (int c=1;c<Number_Circuit-1;c++){EepromWrite(User_Eeprom + c, circuits[c].Value); circuits[c].Value=0;}}
}
}
}
}

 

Uploaded files:
  • Iluminacion-Salon.png

Vaya trabajazo!!! tiene una pinta espectacular

Estado = Overload.