Sensores Retardados y melodia en texto
parent
7ea3debd00
commit
c0b83a8055
|
|
@ -48,20 +48,18 @@ 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<lines; i++)
|
||||
{
|
||||
nlineslcd=lines;
|
||||
for(int i=0; i<lines; i++)
|
||||
{
|
||||
envia("Iniciando",0,i);
|
||||
}
|
||||
}
|
||||
}
|
||||
void LcdMQTTViewer::loop()
|
||||
{
|
||||
|
|
@ -112,11 +110,11 @@ int LcdMQTTViewer::OnMqtt(char* top, char* payload)
|
|||
return -1;
|
||||
|
||||
int i=0;
|
||||
int lin=0;
|
||||
int lin=0;
|
||||
int n=0;
|
||||
char buf[64];
|
||||
char imelod[12];
|
||||
int nmelod;
|
||||
int nmelod=0;
|
||||
bool melodia=false;
|
||||
while(payload[i])
|
||||
{
|
||||
|
|
@ -132,12 +130,12 @@ int LcdMQTTViewer::OnMqtt(char* top, char* payload)
|
|||
{
|
||||
if(melodia)
|
||||
{
|
||||
|
||||
imelod[nmelod]=0;
|
||||
melodia=false;
|
||||
MQTTvalor v;
|
||||
v.i=atoi(imelod);
|
||||
if(ivarBuzzer>=0)
|
||||
|
||||
if(ivarBuzzer>=0 && nmelod>0)
|
||||
vars->SetVal(ivarBuzzer,v);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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; 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++)
|
||||
{
|
||||
MqttSensor* s=sens.Get(ind_interrup[i]);
|
||||
//if(chg_interrup[i])
|
||||
{
|
||||
#ifdef DEBUG_PS
|
||||
|
||||
Serial.println("Detectado cambio en interrupcion");
|
||||
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
|
||||
//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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue