From c0b83a805529ec4f43e9878038dbc591a82957d3 Mon Sep 17 00:00:00 2001 From: Gerardo Date: Fri, 28 Jan 2022 09:53:58 +0100 Subject: [PATCH] Sensores Retardados y melodia en texto --- DomoEsp_v02/LcdMQTTViewer.cpp | 44 +++++----- DomoEsp_v02/LcdMQTTViewer.h | 2 +- DomoEsp_v02/MqttDefines.h | 2 +- DomoEsp_v02/MqttSensManager.cpp | 138 ++++++++++++++++++++++---------- DomoEsp_v02/MqttSensManager.h | 20 ++++- DomoEsp_v02/config_rf.h | 20 +++-- 6 files changed, 151 insertions(+), 75 deletions(-) diff --git a/DomoEsp_v02/LcdMQTTViewer.cpp b/DomoEsp_v02/LcdMQTTViewer.cpp index cb863d7..d0e68de 100644 --- a/DomoEsp_v02/LcdMQTTViewer.cpp +++ b/DomoEsp_v02/LcdMQTTViewer.cpp @@ -48,21 +48,19 @@ void LcdMQTTViewer::envia(int pan) continue; if(LcdConf[i].ivar>=0) { - MqttVar *v=vars->Get(LcdConf[i].ivar); - if(v==NULL) - continue; - //pilla valor - if(v->flags & MqttVar::FLOAT_VAR) - dtostrf(v->val.f,3, 2, val); - else - sprintf(val, "%d", (int)v->val.i); - sprintf(buf, LcdConf[i].formatLCD, val); - } - else - - strcpy( buf, LcdConf[i].formatLCD); - - + MqttVar *v=vars->Get(LcdConf[i].ivar); + if(v==NULL) + continue; + //pilla valor + if(v->flags & MqttVar::FLOAT_VAR) + dtostrf(v->val.f,3, 2, val); + else + sprintf(val, "%d", (int)v->val.i); + sprintf(buf, LcdConf[i].formatLCD, val); + } + else + strcpy( buf, LcdConf[i].formatLCD); + envia(buf,0, LcdConf[i].line); } } @@ -74,11 +72,11 @@ void LcdMQTTViewer::inicia(MqttVarManager *v, LiquidCrystal* lcdEx, int digi, in lcd =lcdEx; nchar = digi; lcd->begin(nchar, lines); - nlineslcd=lines; - for(int i=0; i=0) + + if(ivarBuzzer>=0 && nmelod>0) vars->SetVal(ivarBuzzer,v); } else diff --git a/DomoEsp_v02/LcdMQTTViewer.h b/DomoEsp_v02/LcdMQTTViewer.h index 5b4f7b0..c2c6886 100644 --- a/DomoEsp_v02/LcdMQTTViewer.h +++ b/DomoEsp_v02/LcdMQTTViewer.h @@ -44,7 +44,7 @@ public: void loop();//publica datos variables int OnMqtt(char* topic, char* payload); void suscribe(PubSubClient *client_qqtt); -//auxiliares---------------------------------------------------------- + //auxiliares---------------------------------------------------------- void add(byte ivar, char* formatLCD, int line, int pan); void setTimer(int seg); void envia(char* txt, int pos, int line); diff --git a/DomoEsp_v02/MqttDefines.h b/DomoEsp_v02/MqttDefines.h index 5c7a962..1d858ab 100644 --- a/DomoEsp_v02/MqttDefines.h +++ b/DomoEsp_v02/MqttDefines.h @@ -3,7 +3,7 @@ #define MqttDefinesDef 1 //generales #define DEBUG_PS 1 -#define CON_LCD 1 +#define CON_LCD 0 #define MAXTOPICVAR 32//maximo de caracteres de los topic de las variables diff --git a/DomoEsp_v02/MqttSensManager.cpp b/DomoEsp_v02/MqttSensManager.cpp index 925c6db..87853fe 100644 --- a/DomoEsp_v02/MqttSensManager.cpp +++ b/DomoEsp_v02/MqttSensManager.cpp @@ -153,6 +153,34 @@ void MqttSensManager::AddDin(int pin, char* topic) ConfiguraInterrupcion(isen); } +void MqttSensManager::AddDinRetardOff(int pin, int seg,char* topic) +{ + MqttSensor s; + s.tipo=(int)MqttSensor::SENS_DIGI_IN; + s.pin=pin; + s.flags=MqttSensor::FLAG_RETARD_OFF; + s.ie.retard.r=seg*1000; + s.ivar=vars->AddVar((byte)(MqttVar::IN_VAR|MqttVar::ACCION_VAR),topic); + s.ie.retard.val=vars->Get(s.ivar)->val.i; + int isen=sens.Add(&s); + pinMode(s.pin, INPUT); + + ConfiguraInterrupcion(isen); +} +void MqttSensManager::AddDinRetardOn(int pin, int seg,char* topic) +{ + MqttSensor s; + s.tipo=(int)MqttSensor::SENS_DIGI_IN; + s.pin=pin; + s.flags=MqttSensor::FLAG_RETARD_ON; + s.ie.retard.r=seg*1000; + s.ivar=vars->AddVar((byte)(MqttVar::IN_VAR|MqttVar::ACCION_VAR),topic); + s.ie.retard.val=vars->Get(s.ivar)->val.i; + int isen=sens.Add(&s); + pinMode(s.pin, INPUT); + + ConfiguraInterrupcion(isen); +} void MqttSensManager::AddDinAccion(int pin, char* topic) { MqttSensor s; @@ -232,17 +260,6 @@ void MqttSensManager::procesaSensor(int i) delay(20); continue; } - /*#ifdef DEBUG_PS - char buffer_p[32]; - - Serial.print("LeeDht, t:"); - dtostrf(t,3, 2, buffer_p); - Serial.print(buffer_p); - Serial.print(" h:"); - dtostrf(h,3, 2, buffer_p); - Serial.print(buffer_p); - Serial.println(""); - #endif*/ v->val.f=t; vh->val.f=h; break; @@ -264,25 +281,16 @@ void MqttSensManager::procesaSensor(int i) v->val.f=100.*((float)(1024- analogRead(s->pin)))/1024; else v->val.f=100.*((float)(analogRead(s->pin)))/1024; - /*#ifdef DEBUG_PS - char buffer_p[32]; - - Serial.print("Lee analog:"); - dtostrf( v->val.f,3, 2, buffer_p); - Serial.print(buffer_p); - - Serial.println(""); - #endif*/ break; } - case((int)MqttSensor::SENS_DIGI_IN)://pilla temperatura y humedad + /* case((int)MqttSensor::SENS_DIGI_IN): { if(s->flags & MqttSensor::FLAG_NEG) v->val.i=(byte)(1- digitalRead(s->pin)); else v->val.i=(byte)digitalRead(s->pin); break; - } + }*/ default: { break; @@ -337,28 +345,76 @@ void MqttSensManager::OnVarChange(int ivar) void MqttSensManager::procesaInterrupciones() { - if(!MqttChangeInterrup) + if(MqttChangeInterrup) { - return; + noInterrupts(); + MqttChangeInterrup=false; + interrupts(); + for(int i=0; iGet(s->ivar); + byte val=digitalRead(s->pin); + if(s->flags & MqttSensor::FLAG_RETARD_OFF && v->val.i!=val && val==0) + { + #ifdef DEBUG_PS + Serial.println("Se aplica retardo al off"); + #endif + s->ie.retard.val=val; + s->ie.retard.t=millis(); + } + else if(s->flags & MqttSensor::FLAG_RETARD_ON && v->val.i!=val && val!=0) + { + #ifdef DEBUG_PS + Serial.println("Se aplica retardo al on"); + #endif + s->ie.retard.val=val; + s->ie.retard.t=millis(); + } + else + { + ProcesaSenInterrupciones(ind_interrup[i]); + } + } + } } - noInterrupts(); - MqttChangeInterrup=false; - interrupts(); + + //comprueba sensores retrasados for(int i=0; iflags & (MqttSensor::FLAG_RETARD_OFF | MqttSensor::FLAG_RETARD_ON))) + continue; + MqttVar *v=vars->Get(s->ivar); + if(v->val.i==s->ie.retard.val) + continue; + if(!MqttUtiles::pasa_incre(&s->ie.retard.t, s->ie.retard.r)) + continue; + #ifdef DEBUG_PS + Serial.println("Se detecta cambio en sensor retardado"); #endif - //lee variable - MqttVar *v=vars->Get(s->ivar); - byte val=digitalRead(s->pin); - switch((int)s->tipo) - { + ProcesaSenInterrupciones(ind_interrup[i]); + } +} +void MqttSensManager::ProcesaSenInterrupciones(int isen) +{ + MqttSensor* s=sens.Get(isen); + MqttVar *v=vars->Get(s->ivar); + byte val=digitalRead(s->pin); + switch((int)s->tipo) + { case((int)MqttSensor::SENS_DIGI_IN): { //lee y llama a cambio si es necesario @@ -386,18 +442,16 @@ void MqttSensManager::procesaInterrupciones() } default: break; - } - } - } + } } - //funciones auxiliares de interrupcion------------------------------- void MqttSensManager::OnInterrupcion(int i) { //MqttSensor* s=sens.Get(ind_interrup[i]); MqttChangeInterrup=true; + MqttChange_ind_interrup[i]=true; } void MqttSensManager::ConfiguraInterrupcion(int isen) { @@ -405,7 +459,9 @@ void MqttSensManager::procesaInterrupciones() Serial.println("Configurando interrupcion"); #endif + MqttChange_ind_interrup[n_inter]=false; ind_interrup[n_inter++]=isen; + int pin=sens.Get(isen)->pin; switch(n_inter-1) { diff --git a/DomoEsp_v02/MqttSensManager.h b/DomoEsp_v02/MqttSensManager.h index d8ded5d..21f8415 100644 --- a/DomoEsp_v02/MqttSensManager.h +++ b/DomoEsp_v02/MqttSensManager.h @@ -44,11 +44,18 @@ struct BmpExt int pinScl; Adafruit_BMP085 *p; }; - +struct SensRetardado +{ + unsigned long t;//ultimo tiempo en el que se recivio el cambio + unsigned long r;//retardo + byte val;//valor actual a cambiar +}; union MqttInfEx//informacion extra segun sensor { DhtExt dht; BmpExt bmp; + SensRetardado retard; + //DinEx din; }; class MqttSensor @@ -71,8 +78,9 @@ class MqttSensor enum Tipo_flags//indica el tipo de sensor { FLAG_NEG=0x01,//indica que el resultado del sensor hay que negarlo (valor invertido) - FLAG_INMED=0x02//indica que es un sensor de actualizacion inmediata (interruptores ...) (TODO) - + FLAG_INMED=0x02,//indica que es un sensor de actualizacion inmediata (interruptores ...) (TODO) + FLAG_RETARD_OFF=0X04,//indica que el sensor tiene un off con efecto retardado configurable + FLAG_RETARD_ON=0X08//indica que el sensor tiene un on con efecto retardado configurable }; @@ -164,6 +172,8 @@ class MqttSensManager: public MqttOnVarChangeListenner //entradas digitales void AddDin(int pin, char* topic);//añade variable digital que se actualiza de manera instantanea (interruptores sensor presencia ..) void AddDinAccion(int pin, char* topic);//añade variable que solo publica en el cambio (pulsadores, ...) + void AddDinRetardOff(int pin, int seg, char* topic);//añade variable con retardo al apagado (especial sensores de presencia) + void AddDinRetardOn(int pin, int seg, char* topic);//añade variable con retardo al apagado (especial sensores de presencia) //salida digital void AddDout(int pin, char* topic, bool defautlValor);//variable que solo publica en el cambio (pulsadores, ...) void AddAnalogIn(int pin, char* topic, bool ValNegado);//nivel de luz, nivel de lluvia ... @@ -177,17 +187,21 @@ class MqttSensManager: public MqttOnVarChangeListenner void procesaSens(); void procesaInterrupciones(); + void procesaSensor(int i); //auxiliares de interrupciones----------- void ConfiguraInterrupcion(int isen); void OnInterrupcion(int i); + void ProcesaSenInterrupciones(int isen); + virtual void OnVarChange(int ivar); }; #ifndef pMqttSensManagerdef #define pMqttSensManagerdef 1 +static volatile bool MqttChange_ind_interrup[MAXINTERRUP]; static volatile bool MqttChangeInterrup=false; static MqttSensManager* pMqttSensManager; #endif diff --git a/DomoEsp_v02/config_rf.h b/DomoEsp_v02/config_rf.h index a89f4f0..33f1b28 100644 --- a/DomoEsp_v02/config_rf.h +++ b/DomoEsp_v02/config_rf.h @@ -1,6 +1,6 @@ //parametros configurables************************************************* #define DEBUG_PS 1//Descomentar para debug -#define CON_LCD 1 +#define CON_LCD 0 //va por 16 class ActDomoConfig: public DomoConfig { @@ -48,10 +48,12 @@ class ActDomoConfig: public DomoConfig sens->AddBuzz(int pin, char* topic); */ - //sens->AddHDT22(D4, "casa/desp"); - sens->AddBuzz(D0, "casa/p/buz"); - - sens->AddMelodia("m200#100d200#0"); + + sens->AddDinRetardOn(D1,5,"casa/p/pul"); + sens->AddDout(D5,"casa/p/led", true); + //sens->AddHDT22(D4, "casa/desp"); + //sens->AddBuzz(D0, "casa/p/buz"); + //sens->AddMelodia("m200#100d200#0"); //variables---------------------------------------------------- /* int ivar= vars->AddVar(byte flags, char*topic);//variable con flags a elegir @@ -81,9 +83,15 @@ class ActDomoConfig: public DomoConfig lcd->add(-1,"Mi ritmo",0,1); lcd->add(-1,"bueno pa goza",1,1);* / + */ //desencadenaores---------- char st[64]; //Efecto Interruptor----- + sprintf(st,"{%d}<1 -> !{%d} ",0,1);//terminar en espacios y separar operadores (no puede estar 2 operadores juntos) + des->AddDes(st); + sprintf(st,"{%d}>0 -> !{%d} ",0,1);//terminar en espacios + des->AddDes(st); + /* sprintf(st,"{%d}>0 -> {%d}=1 & {%d}=1 & {%d}=1 ",pulIall,lamb,lchim, lent);//terminar en espacios des->AddDes(st); sprintf(st,"{%d}<1 -> {%d}=0 & {%d}=0 & {%d}=0 ",pulIall,lamb,lchim, lent);//terminar en espacios @@ -410,4 +418,4 @@ class ExteriorDomoConfig: public DomoConfig //configuracion que se usara-------------------------- -DespachoDomoConfig ConfiguracionActual; +ActDomoConfig ConfiguracionActual;