Sensores Retardados y melodia en texto

master
Gerardo 2022-01-28 09:53:58 +01:00
parent 7ea3debd00
commit c0b83a8055
6 changed files with 151 additions and 75 deletions

View File

@ -48,20 +48,18 @@ void LcdMQTTViewer::envia(int pan)
continue; continue;
if(LcdConf[i].ivar>=0) if(LcdConf[i].ivar>=0)
{ {
MqttVar *v=vars->Get(LcdConf[i].ivar); MqttVar *v=vars->Get(LcdConf[i].ivar);
if(v==NULL) if(v==NULL)
continue; continue;
//pilla valor //pilla valor
if(v->flags & MqttVar::FLOAT_VAR) if(v->flags & MqttVar::FLOAT_VAR)
dtostrf(v->val.f,3, 2, val); dtostrf(v->val.f,3, 2, val);
else else
sprintf(val, "%d", (int)v->val.i); sprintf(val, "%d", (int)v->val.i);
sprintf(buf, LcdConf[i].formatLCD, val); sprintf(buf, LcdConf[i].formatLCD, val);
} }
else else
strcpy( buf, LcdConf[i].formatLCD);
strcpy( buf, LcdConf[i].formatLCD);
envia(buf,0, LcdConf[i].line); envia(buf,0, LcdConf[i].line);
} }
@ -74,11 +72,11 @@ void LcdMQTTViewer::inicia(MqttVarManager *v, LiquidCrystal* lcdEx, int digi, in
lcd =lcdEx; lcd =lcdEx;
nchar = digi; nchar = digi;
lcd->begin(nchar, lines); lcd->begin(nchar, lines);
nlineslcd=lines; nlineslcd=lines;
for(int i=0; i<lines; i++) for(int i=0; i<lines; i++)
{ {
envia("Iniciando",0,i); envia("Iniciando",0,i);
} }
} }
void LcdMQTTViewer::loop() void LcdMQTTViewer::loop()
{ {
@ -112,11 +110,11 @@ int LcdMQTTViewer::OnMqtt(char* top, char* payload)
return -1; return -1;
int i=0; int i=0;
int lin=0; int lin=0;
int n=0; int n=0;
char buf[64]; char buf[64];
char imelod[12]; char imelod[12];
int nmelod; int nmelod=0;
bool melodia=false; bool melodia=false;
while(payload[i]) while(payload[i])
{ {
@ -132,12 +130,12 @@ int LcdMQTTViewer::OnMqtt(char* top, char* payload)
{ {
if(melodia) if(melodia)
{ {
imelod[nmelod]=0; imelod[nmelod]=0;
melodia=false; melodia=false;
MQTTvalor v; MQTTvalor v;
v.i=atoi(imelod); v.i=atoi(imelod);
if(ivarBuzzer>=0)
if(ivarBuzzer>=0 && nmelod>0)
vars->SetVal(ivarBuzzer,v); vars->SetVal(ivarBuzzer,v);
} }
else else

View File

@ -44,7 +44,7 @@ public:
void loop();//publica datos variables void loop();//publica datos variables
int OnMqtt(char* topic, char* payload); int OnMqtt(char* topic, char* payload);
void suscribe(PubSubClient *client_qqtt); void suscribe(PubSubClient *client_qqtt);
//auxiliares---------------------------------------------------------- //auxiliares----------------------------------------------------------
void add(byte ivar, char* formatLCD, int line, int pan); void add(byte ivar, char* formatLCD, int line, int pan);
void setTimer(int seg); void setTimer(int seg);
void envia(char* txt, int pos, int line); void envia(char* txt, int pos, int line);

View File

@ -3,7 +3,7 @@
#define MqttDefinesDef 1 #define MqttDefinesDef 1
//generales //generales
#define DEBUG_PS 1 #define DEBUG_PS 1
#define CON_LCD 1 #define CON_LCD 0
#define MAXTOPICVAR 32//maximo de caracteres de los topic de las variables #define MAXTOPICVAR 32//maximo de caracteres de los topic de las variables

View File

@ -153,6 +153,34 @@ void MqttSensManager::AddDin(int pin, char* topic)
ConfiguraInterrupcion(isen); 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) void MqttSensManager::AddDinAccion(int pin, char* topic)
{ {
MqttSensor s; MqttSensor s;
@ -232,17 +260,6 @@ void MqttSensManager::procesaSensor(int i)
delay(20); delay(20);
continue; 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; v->val.f=t;
vh->val.f=h; vh->val.f=h;
break; break;
@ -264,25 +281,16 @@ void MqttSensManager::procesaSensor(int i)
v->val.f=100.*((float)(1024- analogRead(s->pin)))/1024; v->val.f=100.*((float)(1024- analogRead(s->pin)))/1024;
else else
v->val.f=100.*((float)(analogRead(s->pin)))/1024; 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; break;
} }
case((int)MqttSensor::SENS_DIGI_IN)://pilla temperatura y humedad /* case((int)MqttSensor::SENS_DIGI_IN):
{ {
if(s->flags & MqttSensor::FLAG_NEG) if(s->flags & MqttSensor::FLAG_NEG)
v->val.i=(byte)(1- digitalRead(s->pin)); v->val.i=(byte)(1- digitalRead(s->pin));
else else
v->val.i=(byte)digitalRead(s->pin); v->val.i=(byte)digitalRead(s->pin);
break; break;
} }*/
default: default:
{ {
break; break;
@ -337,28 +345,76 @@ void MqttSensManager::OnVarChange(int ivar)
void MqttSensManager::procesaInterrupciones() void MqttSensManager::procesaInterrupciones()
{ {
if(!MqttChangeInterrup) if(MqttChangeInterrup)
{ {
return; noInterrupts();
MqttChangeInterrup=false;
interrupts();
for(int i=0; i<n_inter; i++)
{
if(!MqttChange_ind_interrup[i])
continue;
noInterrupts();
MqttChange_ind_interrup[i]=false;
interrupts();
MqttSensor* s=sens.Get(ind_interrup[i]);
//if(chg_interrup[i])
{
#ifdef DEBUG_PS
Serial.println("Detectado cambio en interrupcion");
#endif
//lee variable
MqttVar *v=vars->Get(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; i<n_inter; i++) for(int i=0; i<n_inter; i++)
{ {
MqttSensor* s=sens.Get(ind_interrup[i]); MqttSensor* s=sens.Get(ind_interrup[i]);
//if(chg_interrup[i]) if(!(s->flags & (MqttSensor::FLAG_RETARD_OFF | MqttSensor::FLAG_RETARD_ON)))
{ continue;
#ifdef DEBUG_PS MqttVar *v=vars->Get(s->ivar);
if(v->val.i==s->ie.retard.val)
Serial.println("Detectado cambio en interrupcion"); 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 #endif
//lee variable ProcesaSenInterrupciones(ind_interrup[i]);
MqttVar *v=vars->Get(s->ivar); }
byte val=digitalRead(s->pin); }
switch((int)s->tipo) 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): case((int)MqttSensor::SENS_DIGI_IN):
{ {
//lee y llama a cambio si es necesario //lee y llama a cambio si es necesario
@ -386,18 +442,16 @@ void MqttSensManager::procesaInterrupciones()
} }
default: default:
break; break;
} }
}
}
} }
//funciones auxiliares de interrupcion------------------------------- //funciones auxiliares de interrupcion-------------------------------
void MqttSensManager::OnInterrupcion(int i) void MqttSensManager::OnInterrupcion(int i)
{ {
//MqttSensor* s=sens.Get(ind_interrup[i]); //MqttSensor* s=sens.Get(ind_interrup[i]);
MqttChangeInterrup=true; MqttChangeInterrup=true;
MqttChange_ind_interrup[i]=true;
} }
void MqttSensManager::ConfiguraInterrupcion(int isen) void MqttSensManager::ConfiguraInterrupcion(int isen)
{ {
@ -405,7 +459,9 @@ void MqttSensManager::procesaInterrupciones()
Serial.println("Configurando interrupcion"); Serial.println("Configurando interrupcion");
#endif #endif
MqttChange_ind_interrup[n_inter]=false;
ind_interrup[n_inter++]=isen; ind_interrup[n_inter++]=isen;
int pin=sens.Get(isen)->pin; int pin=sens.Get(isen)->pin;
switch(n_inter-1) switch(n_inter-1)
{ {

View File

@ -44,11 +44,18 @@ struct BmpExt
int pinScl; int pinScl;
Adafruit_BMP085 *p; 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 union MqttInfEx//informacion extra segun sensor
{ {
DhtExt dht; DhtExt dht;
BmpExt bmp; BmpExt bmp;
SensRetardado retard;
//DinEx din; //DinEx din;
}; };
class MqttSensor class MqttSensor
@ -71,8 +78,9 @@ class MqttSensor
enum Tipo_flags//indica el tipo de sensor enum Tipo_flags//indica el tipo de sensor
{ {
FLAG_NEG=0x01,//indica que el resultado del sensor hay que negarlo (valor invertido) 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 //entradas digitales
void AddDin(int pin, char* topic);//añade variable digital que se actualiza de manera instantanea (interruptores sensor presencia ..) 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 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 //salida digital
void AddDout(int pin, char* topic, bool defautlValor);//variable que solo publica en el cambio (pulsadores, ...) 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 ... 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 procesaSens();
void procesaInterrupciones(); void procesaInterrupciones();
void procesaSensor(int i); void procesaSensor(int i);
//auxiliares de interrupciones----------- //auxiliares de interrupciones-----------
void ConfiguraInterrupcion(int isen); void ConfiguraInterrupcion(int isen);
void OnInterrupcion(int i); void OnInterrupcion(int i);
void ProcesaSenInterrupciones(int isen);
virtual void OnVarChange(int ivar); virtual void OnVarChange(int ivar);
}; };
#ifndef pMqttSensManagerdef #ifndef pMqttSensManagerdef
#define pMqttSensManagerdef 1 #define pMqttSensManagerdef 1
static volatile bool MqttChange_ind_interrup[MAXINTERRUP];
static volatile bool MqttChangeInterrup=false; static volatile bool MqttChangeInterrup=false;
static MqttSensManager* pMqttSensManager; static MqttSensManager* pMqttSensManager;
#endif #endif

View File

@ -1,6 +1,6 @@
//parametros configurables************************************************* //parametros configurables*************************************************
#define DEBUG_PS 1//Descomentar para debug #define DEBUG_PS 1//Descomentar para debug
#define CON_LCD 1 #define CON_LCD 0
//va por 16 //va por 16
class ActDomoConfig: public DomoConfig class ActDomoConfig: public DomoConfig
{ {
@ -48,10 +48,12 @@ class ActDomoConfig: public DomoConfig
sens->AddBuzz(int pin, char* topic); 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---------------------------------------------------- //variables----------------------------------------------------
/* /*
int ivar= vars->AddVar(byte flags, char*topic);//variable con flags a elegir 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,"Mi ritmo",0,1);
lcd->add(-1,"bueno pa goza",1,1);* / lcd->add(-1,"bueno pa goza",1,1);* /
*/
//desencadenaores---------- //desencadenaores----------
char st[64]; char st[64];
//Efecto Interruptor----- //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 sprintf(st,"{%d}>0 -> {%d}=1 & {%d}=1 & {%d}=1 ",pulIall,lamb,lchim, lent);//terminar en espacios
des->AddDes(st); des->AddDes(st);
sprintf(st,"{%d}<1 -> {%d}=0 & {%d}=0 & {%d}=0 ",pulIall,lamb,lchim, lent);//terminar en espacios 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-------------------------- //configuracion que se usara--------------------------
DespachoDomoConfig ConfiguracionActual; ActDomoConfig ConfiguracionActual;