Estavilizacion de actuadores

main
Gerardo 2024-09-26 23:13:18 +02:00
parent f1070e030c
commit 0b2a5f1fde
6 changed files with 175 additions and 117 deletions

View File

@ -1,5 +1,5 @@
#ifndef MecanismoPulsoDef
#define MecanismoPulsoDef 1
#ifndef ActuadorDef
#define ActuadorDef 1
#include "defines.h"
//sensor activador envia a topicOut el valor val_send si los activadores cumplen umbral
class Cactivador
@ -9,10 +9,11 @@ class Cactivador
DomoEspSensorReceiver *sen;
float umbral;
char operacion;//< > = val oper umbral
bool onchange;
};
#define MAX_ACTIVADORES 5
class MecanismoPulso: public DomoEspSensorReceiver
class Actuador: public DomoEspSensorReceiver
{
float val;
char topicOut[MAXTOPICVAR];
@ -21,7 +22,7 @@ class MecanismoPulso: public DomoEspSensorReceiver
public:
char id[10];
MecanismoPulso()
Actuador()
{
strcpy(id, "Meca");
topic[0]=0;
@ -36,17 +37,27 @@ class MecanismoPulso: public DomoEspSensorReceiver
strcpy(topic, topic_id);
strcpy(topicOut, topic_id_out);
}
void AddActivador(DomoEspSensorReceiver *sen, char oper, float umbral)
void AddActivador(DomoEspSensorReceiver *sen, char oper, float umbral, bool onchange=false)
{
for(int i=0; i<MAX_ACTIVADORES; i++)
int i=0;
for(; i<MAX_ACTIVADORES; i++)
{
if(!activador[i].sen)
{
activador[i].sen=sen;
activador[i].operacion=oper;
activador[i].umbral=umbral;
activador[i].onchange = onchange;
break;
}
}
if(i>=MAX_ACTIVADORES)
{
#ifdef DEBUG_PS
Serial.print(id);
Serial.println("----------------------ERROR NO ENTRAN MAS ACTUADORES---------------- ");
#endif
}
}
void setValSend(char* _valSend)
{
@ -65,23 +76,32 @@ class MecanismoPulso: public DomoEspSensorReceiver
}
virtual void OnMqtt(IMqttManager * man, char* _topic, char* payload, int tipo)
{
if(strcmp(_topic, topic))
if(!validaTopic(_topic))
return;
if(tipo==Topic::GET)
{
float val_act=atof(payload);
if (val_act!=val)
{
val=val_act;
ejecuta(man);
}
}
else if(tipo==Topic::PUL)
{
ejecuta(man);
}
if(tipo==Topic::GET)
{
val=atof(payload);
ejecuta(man);
}
else if(tipo==Topic::PUL)
ejecuta(man);
}
private:
bool validaTopic(char* _topic)
{
if (!strcmp(_topic, topic))
return true;
for (int i = 0; i < MAX_ACTIVADORES; i++)
{
if (activador[i].sen && activador[i].onchange)
{
if (!strcmp(activador[i].sen->topic, _topic))
return true;
}
}
return false;
}
void ejecuta(IMqttManager * man)
{
if(valida())
@ -98,10 +118,13 @@ class MecanismoPulso: public DomoEspSensorReceiver
}
bool valida()
{
for(int i=0; i<MAX_ACTIVADORES; i++)
{
if(activador[i].sen && !opera(i))
{
return false;
}
}
return true;
}

View File

@ -0,0 +1,102 @@
#ifndef AutomatismosDef
#define AutomatismosDef 1
#include "DomoEspConfig.h"
#include "SensorDout.h"
#include "SensorDHT.h"
#include "SensorDin.h"
#include "SensorPulsante.h"
#include "SensorAin.h"
#include "SensorVD.h"
#include "SensorRF.h"
#include "Actuador.h"
//----------------------------------------------------------------------------------------------------------------------------------------------
class AutomatismoPulsador//automatismo para encender luz con interruptor o pulsador
{
Actuador pulsador;//cambia estado con pulsador
public:
AutomatismoPulsador(){}
void inicia(ISensorManager* man, DomoEspSensorReceiver* tp_pul, DomoEspSensorReceiver* tpOut, DomoEspSensorReceiver* bloqueo=NULL )
{
inicia(man, tp_pul->topic, tpOut->topic, bloqueo);
}
void inicia(ISensorManager* man, char* tp_pul, char* tpOut, DomoEspSensorReceiver* bloqueo=NULL )
{
pulsador.set(tp_pul, tpOut, 0);
pulsador.setValSend("X");
strcpy(pulsador.id, "pulsa");
if(bloqueo)
{
pulsador.AddActivador(bloqueo,'>',0);
}
man->Add(&pulsador);
}
};
//----------------------------------------------------------------------------------------------------------------------------------------------
//automatismo para luz con sensor de presencia y de nivel de luz
class AutomatismoPresencia//automatismo para encender luz con presencia
{
Actuador presenciaOn;
Actuador presenciaOff;
Actuador nivelLuzOff;
float fnivelLuz;
public:
AutomatismoPresencia()
{
fnivelLuz=50;
strcpy(presenciaOn.id, "PresOn");
strcpy(presenciaOff.id, "PresOff");
strcpy(nivelLuzOff.id, "luzOff");
}
void inicia(ISensorManager* man, DomoEspSensorReceiver* presencia, DomoEspSensorReceiver* nivelluz, DomoEspSensorReceiver* out, DomoEspSensorReceiver* bloqueo=NULL )
{
presenciaOn.set(presencia->topic, out->topic, 0);
presenciaOn.setValSend("1");
presenciaOn.AddActivador(nivelluz,'<',fnivelLuz, 1);//nivel de luz bajo
presenciaOn.AddActivador(out,'<',1, 0);//out apagada
presenciaOn.AddActivador(presencia,'>',0, 0);//presencia
if(bloqueo)
{
presenciaOn.AddActivador(bloqueo,'>',0);
}
presenciaOff.set(presencia->topic, out->topic, 0);
presenciaOff.setValSend("0");
presenciaOff.AddActivador(out,'>',0,0);//out encendido
presenciaOff.AddActivador(presencia,'<',1, 0);//no presencia
if(bloqueo)
{
presenciaOff.AddActivador(bloqueo,'>',0);
}
nivelLuzOff.set(nivelluz->topic, out->topic, 0);
nivelLuzOff.setValSend("0");
nivelLuzOff.AddActivador(out,'>',0, 0);//out encendido
nivelLuzOff.AddActivador(nivelluz,'>',fnivelLuz, 0);//no luz
if(bloqueo)
{
nivelLuzOff.AddActivador(bloqueo,'>',0);
}
man->Add(&presenciaOn);
man->Add(&nivelLuzOff);
man->Add(&presenciaOff);
}
};
#endif

View File

@ -150,6 +150,12 @@ void DomoEspManager::Add(DomoEspSensorReceiver* sensor)
if(n<MAXSENS)
{
sensores[n]=sensor;
n++;
n++;
}
else
{
#ifdef DEBUG_PS
Serial.println("----------------------ERROR NO ENTRAN MAS SENSORES---------------- ");
#endif
}
}

View File

@ -19,7 +19,7 @@ class SensorRF: public DomoEspSensorReceiver
}
virtual float getVal()
{
return (float)val;
return val;
}
virtual void SubscribeMqtt(IMqttManager* man){
//char buffer_t[MAXTOPICVAR];
@ -33,6 +33,12 @@ class SensorRF: public DomoEspSensorReceiver
if(!strcmp(_topic, topic))
{
val=atof(payload);
#ifdef DEBUG_PS
Serial.print(" RF-> ");
Serial.print(topic);
Serial.print(" -> ");
Serial.println(val);
#endif
}
}

View File

@ -1,109 +1,23 @@
#ifndef DomoConfActualDef
#define DomoConfActualDef 1
#include "DomoEspConfig.h"
#include "SensorDout.h"
#include "SensorDHT.h"
#include "SensorDin.h"
#include "SensorPulsante.h"
#include "SensorAin.h"
#include "SensorVD.h"
#include "SensorRF.h"
#include "automatismos.h"
#include "MecanismoPulso.h"
//----------------------------------------------------------------------------------------------------------------------------------------------
class AutomatismoPulsador//automatismo para encender luz con interruptor o pulsador
{
MecanismoPulso pulsador;//cambia estado con pulsador
public:
AutomatismoPulsador(){}
void inicia(ISensorManager* man, DomoEspSensorReceiver* tp_pul, DomoEspSensorReceiver* tpOut, DomoEspSensorReceiver* bloqueo=NULL )
{
inicia(man, tp_pul->topic, tpOut->topic, bloqueo);
}
void inicia(ISensorManager* man, char* tp_pul, char* tpOut, DomoEspSensorReceiver* bloqueo=NULL )
{
pulsador.set(tp_pul, tpOut, 0);
pulsador.setValSend("X");
if(bloqueo)
{
pulsador.AddActivador(bloqueo,'>',0);
}
man->Add(&pulsador);
}
};
class AutomatismoPresencia//automatismo para encender luz con presencia
{
MecanismoPulso presenciaOn;
MecanismoPulso presenciaOff;
MecanismoPulso nivelLuzOff;
float fnivelLuz;
public:
AutomatismoPresencia()
{
fnivelLuz=50;
strcpy(presenciaOn.id, "PresOn");
strcpy(presenciaOff.id, "PresOff");
strcpy(nivelLuzOff.id, "luzOff");
}
void inicia(ISensorManager* man, DomoEspSensorReceiver* presencia, DomoEspSensorReceiver* nivelluz, DomoEspSensorReceiver* out, DomoEspSensorReceiver* bloqueo=NULL )
{
presenciaOn.set(presencia->topic, out->topic, 0);
presenciaOn.setValSend("1");
presenciaOn.AddActivador(nivelluz,'<',fnivelLuz);//nivel de luz bajo
presenciaOn.AddActivador(out,'<',1);//out apagada
presenciaOn.AddActivador(presencia,'>',0);//presencia
if(bloqueo)
{
presenciaOn.AddActivador(bloqueo,'>',0);
}
presenciaOff.set(presencia->topic, out->topic, 0);
presenciaOff.setValSend("0");
presenciaOff.AddActivador(out,'>',0);//out encendido
presenciaOff.AddActivador(presencia,'<',1);//no presencia
if(bloqueo)
{
presenciaOff.AddActivador(bloqueo,'>',0);
}
nivelLuzOff.set(nivelluz->topic, out->topic, 0);
nivelLuzOff.setValSend("0");
nivelLuzOff.AddActivador(out,'>',0);//out encendido
nivelLuzOff.AddActivador(nivelluz,'>',fnivelLuz);//no luz
if(bloqueo)
{
nivelLuzOff.AddActivador(bloqueo,'>',0);
}
man->Add(&presenciaOn);
man->Add(&nivelLuzOff);
man->Add(&presenciaOff);
}
};
//configuraciones-----------------------------------------------------
class Automatismos: public DomoEspConfig
class ConfAutomatismos: public DomoEspConfig
{
SensorRF presencia;
SensorRF nivelLuz;
SensorRF out;
SensorVD bloqueo;
//AutomatismoPulsador pulsadorSalon;
AutomatismoPulsador pulsador;
AutomatismoPresencia Apresen;
public:
Automatismos()
ConfAutomatismos()
{
strcpy(ssidWifi,"IdhunAux");//nombre wifi
strcpy(ideEsp,"Esp8266_auto");//idenitificador del esp (sera único)
@ -123,7 +37,8 @@ class Automatismos: public DomoEspConfig
man->Add(&nivelLuz);
man->Add(&out);
man->Add(&bloqueo);
Apresen.inicia(man,&presencia,&nivelLuz,&out,&bloqueo);
Apresen.inicia(man, &presencia, &nivelLuz,&out, &bloqueo);
pulsador.inicia(man,"casa/pruebas/pul", "casa/pruebas/luz");
//pulsadorSalon.inicia(man,"casa/pruebas/pul", "casa/pruebas/luz");
}
@ -170,6 +85,6 @@ class ConfActual: public DomoEspConfig
};
Automatismos ConfiguracionActual;
ConfAutomatismos ConfiguracionActual;
#endif

View File

@ -11,10 +11,16 @@
#define MAXSTR 2024//maximo de caracteres para str
//sens--------------------
#define MAXSENS 16
#define MAXSENS 16 //maximo de sensores totales
#define MAX_ACTIVADORES 5//maximo de activadores por actuador
#define MAXINTERRUP 8
#ifndef DO
#define D0 16
#endif