Sensores Retardados y melodia en texto
parent
7ea3debd00
commit
c0b83a8055
|
|
@ -59,10 +59,8 @@ void LcdMQTTViewer::envia(int pan)
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -116,7 +114,7 @@ int LcdMQTTViewer::OnMqtt(char* top, char* payload)
|
||||||
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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,25 +345,73 @@ void MqttSensManager::OnVarChange(int ivar)
|
||||||
|
|
||||||
void MqttSensManager::procesaInterrupciones()
|
void MqttSensManager::procesaInterrupciones()
|
||||||
{
|
{
|
||||||
if(!MqttChangeInterrup)
|
if(MqttChangeInterrup)
|
||||||
{
|
{
|
||||||
return;
|
|
||||||
}
|
|
||||||
noInterrupts();
|
noInterrupts();
|
||||||
MqttChangeInterrup=false;
|
MqttChangeInterrup=false;
|
||||||
interrupts();
|
interrupts();
|
||||||
|
|
||||||
for(int i=0; i<n_inter; i++)
|
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]);
|
MqttSensor* s=sens.Get(ind_interrup[i]);
|
||||||
//if(chg_interrup[i])
|
//if(chg_interrup[i])
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_PS
|
#ifdef DEBUG_PS
|
||||||
|
|
||||||
Serial.println("Detectado cambio en interrupcion");
|
Serial.println("Detectado cambio en interrupcion");
|
||||||
#endif
|
#endif
|
||||||
//lee variable
|
//lee variable
|
||||||
MqttVar *v=vars->Get(s->ivar);
|
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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//comprueba sensores retrasados
|
||||||
|
for(int i=0; i<n_inter; i++)
|
||||||
|
{
|
||||||
|
MqttSensor* s=sens.Get(ind_interrup[i]);
|
||||||
|
if(!(s->flags & (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
|
||||||
|
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);
|
byte val=digitalRead(s->pin);
|
||||||
switch((int)s->tipo)
|
switch((int)s->tipo)
|
||||||
{
|
{
|
||||||
|
|
@ -387,17 +443,15 @@ 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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue