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;
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

View File

@ -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);

View File

@ -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

View File

@ -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)
{

View File

@ -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

View File

@ -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;