Nuevo sensor Buzzer

master
Gerardo 2022-01-25 00:50:29 +01:00
parent c07b299e21
commit 78d3cb851a
7 changed files with 249 additions and 5 deletions

View File

@ -6,6 +6,7 @@ DomoEspManager::DomoEspManager()
//vars.AddListenner(&sens); //vars.AddListenner(&sens);
//vars.AddListenner(&des); //vars.AddListenner(&des);
sens.Config(&vars); sens.Config(&vars);
sens.buzz=&buzz;
suscrito=false; suscrito=false;
} }

View File

@ -89,6 +89,9 @@ class DomoEspManager: public MqttReceiver
MqttManager mqtt; MqttManager mqtt;
MqttDesencadenadorManager des; MqttDesencadenadorManager des;
SonidoBuzzer buzz;
LcdMQTTViewer lcdm; LcdMQTTViewer lcdm;
bool suscrito; bool suscrito;

View File

@ -124,6 +124,23 @@ void MqttSensManager::AddDout(int pin, char* topic, bool defautlValor)
pinMode(s.pin, OUTPUT); pinMode(s.pin, OUTPUT);
digitalWrite(s.pin, defautlValor); digitalWrite(s.pin, defautlValor);
} }
void MqttSensManager::AddBuzz(int pin, char* topic)
{
MqttSensor s;
s.tipo=(int)MqttSensor::SENS_BUZZ_OUT;
s.pin=pin;
s.ivar=vars->AddVar((byte)(MqttVar::IN_VAR|MqttVar::OUT_VAR|MqttVar::ACCION_VAR),topic);
sens.Add(&s);
pinMode(s.pin, OUTPUT);
}
void MqttSensManager::AddMelodia(char* m)
{
if(buzz)
{
buzz->Add(m);
}
}
void MqttSensManager::AddDin(int pin, char* topic) void MqttSensManager::AddDin(int pin, char* topic)
{ {
MqttSensor s; MqttSensor s;
@ -296,6 +313,20 @@ void MqttSensManager::OnVarChange(int ivar)
digitalWrite( s->pin, v->val.i); digitalWrite( s->pin, v->val.i);
break; break;
} }
case((int)MqttSensor::SENS_BUZZ_OUT):
{
#ifdef DEBUG_PS
Serial.println("Sens::OnVarChangeSensor buz cambiado");
#endif
if(v->val.i>0 && buzz)
{
buzz->Toca( s->pin, v->val.i-1);
v->val.i=0;
vars->OnChange(ivar, true);
}
break;
}
default: default:
break; break;
} }

View File

@ -26,7 +26,7 @@
*/ */
#include "MqttDefines.h" #include "MqttDefines.h"
#include <PubSubClient.h> #include <PubSubClient.h>
class SonidoBuzzer;
//class PubSubClient; //class PubSubClient;
class MqttVarManager; class MqttVarManager;
#include <SimpleDHT.h> #include <SimpleDHT.h>
@ -63,7 +63,8 @@ class MqttSensor
SENS_ANALOG_IN,//sensor analogico in SENS_ANALOG_IN,//sensor analogico in
SENS_DIGI_IN,//sensor digital in (algo con 2 estados) SENS_DIGI_IN,//sensor digital in (algo con 2 estados)
SENS_DIGI_OUT,//sensor digital out SENS_DIGI_OUT,//sensor digital out
SENS_DIGI_IN_PULSANTE//pensado para pulsadores (Publicara un put) SENS_DIGI_IN_PULSANTE,//pensado para pulsadores (Publicara un put)
SENS_BUZZ_OUT,//sensor digital out con buzzer conectado
//SENS_DIGI_IN_OUT//sensor doble de entrada y salida (dos pines que tienen que tener el mismo valor) //SENS_DIGI_IN_OUT//sensor doble de entrada y salida (dos pines que tienen que tener el mismo valor)
}; };
@ -131,7 +132,7 @@ class MqttSensManager: public MqttOnVarChangeListenner
SimpleDHT22 cdht;//clase para leer de dht SimpleDHT22 cdht;//clase para leer de dht
Adafruit_BMP085 bmp;//clase bmp Adafruit_BMP085 bmp;//clase bmp
SonidoBuzzer *buzz;
bool bloqueo_sens;//bloquea todos los sensores (para poder editarlos) bool bloqueo_sens;//bloquea todos los sensores (para poder editarlos)
int ind_interrup[MAXINTERRUP]; int ind_interrup[MAXINTERRUP];
@ -166,7 +167,8 @@ class MqttSensManager: public MqttOnVarChangeListenner
//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 ...
void AddBuzz(int pin, char* topic);
void AddMelodia(char* m);
//funciones auxiliares------------ //funciones auxiliares------------
MqttSensor* Get(int i); MqttSensor* Get(int i);

View File

@ -179,3 +179,91 @@ void Ceprom_manager::cursor(int pos)
{ {
nb=pos; nb=pos;
} }
//**************************************************************************************************************************************************
MelodiaBuzzer::MelodiaBuzzer()
{
melodia[0]=0;
}
int MelodiaBuzzer::st2nota(char st)
{
switch(st)
{
case 'd':
return 262;
case 'r':
return 294;
case 'm':
return 330;
case 'f':
return 349;
case 's':
return 392;
case 'l':
return 440;
case 'i':
return 494;
case 'D':
return 277;
case 'R':
return 311;
case 'M':
return 345;
case 'F':
return 350;
case 'S':
return 415;
case 'L':
return 466;
case 'I':
return 554,36;
default:
return 0;
}
}
int MelodiaBuzzer::str2t(char* st, int *t)
{
char buf[8];
int n=0;
int i;
while(st[i]<='9' && st[i]>='0')
{
buf[n++]=st[i++];
}
buf[n]=0;
(*t)=atoi(buf);
return i;
}
void MelodiaBuzzer::Toca(int pin)
{
int i=0;
int h=0, t=0;
while (melodia[i])
{
h=st2nota(melodia[i]);
i++;
t=0;
i+=str2t(&melodia[i], &t);
if(h>0)
tone(pin, h);
else
noTone(pin);
delay(t);
}
}
//*************************************************
SonidoBuzzer::SonidoBuzzer()
{
n=0;
}
void SonidoBuzzer::Toca(int pin, int imel)
{
mel[imel].Toca(pin);
}
int SonidoBuzzer::Add(char* melo)
{
strcpy(mel[n].melodia, melo);
return n++;
}

View File

@ -130,4 +130,25 @@ class Ceprom_manager
}; };
}; };
class MelodiaBuzzer
{
public:
//melodia se compone de notas (primera letra y tiempo de duracion) silecio es #
char melodia[64];
MelodiaBuzzer();
int st2nota(char st);
int str2t(char* st, int *t);
void Toca(int pin);
};
class SonidoBuzzer
{
public:
MelodiaBuzzer mel[4];
int n;
SonidoBuzzer();
void Toca(int pin, int melodia);
int Add(char* melodia);
};
#endif #endif

View File

@ -2,6 +2,104 @@
#define DEBUG_PS 1//Descomentar para debug #define DEBUG_PS 1//Descomentar para debug
#define CON_LCD 1 #define CON_LCD 1
//va por 16 //va por 16
class ActDomoConfig: public DomoConfig
{
public:
ActDomoConfig()
{
velocidadPortSerie=115200;
strcpy(ssidWifi,"Idhun");//nombre wifi
strcpy(keyWifi,"Ardileorca1234.");//key wifi
strcpy(ideEsp,"Esp8266_016");//idenitificador del esp (sera único)
strcpy(hostMQTT,"192.168.2.50");//servidor mqttBroker
portMQTT=1883;//puerto del servidor mqtt Broker
refresTimeVars=30;//tiempo de refresco en segundos de las variables
refresTimeSens=15;//tiempo de refresco en segundos de los sensores
//config lcd--------------------
lcd.colum=16;//columnas lcd
lcd.lines=2;//lineas
//pines lcd
lcd.rs=D5;
lcd.en=D6;//eneable
lcd.d0=D3;
lcd.d1=D2;
lcd.d2=D1;
lcd.d3=D0;
}
//configuracion de sensores, variables, lcd---------------------------------
virtual void ConfigGen(MqttSensManager* sens, MqttVarManager* vars, LcdMQTTViewer *lcd, MqttDesencadenadorManager *des)
{
//sensores--------------------------------------------------------
/*
sens->AddHDT22(int pin, char* topic);
//tempe y presion varometrica
sens->AddBMP180(int sda,int scl, char* topic);
//entradas digitales
sens->AddDin(int pin, char* topic);//añade variable digital que se actualiza de manera instantanea (interruptores sensor presencia ..)
sens->AddDinAccion(int pin, char* topic);//añade variable que solo publica en el cambio (pulsadores, ...)
//salida digital
sens->AddDout(int pin, char* topic, bool defautlValor);//variable que solo publica en el cambio (pulsadores, ...)
Sensor analogico
sens->AddAnalogIn(int pin, char* topic, bool ValNegado);//nivel de luz, nivel de lluvia ...
sens->AddBuzz(int pin, char* topic);
*/
//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
int ivar= vars->AddInternalVarFloat( char*topic);//variable privada
int ivar= vars->AddInternalVarInt( char*topic);//variable privada
* /
int lamb= vars->AddInternalVarInt( "casa/Salon/LAmb");
int lchim= vars->AddInternalVarInt( "casa/Salon/LChime");
int lent= vars->AddInternalVarInt( "casa/Salon/LEnt");
int pul1= vars->AddInternalVarInt( "casa/Salon/pul1");
int pul2= vars->AddInternalVarInt( "casa/Salon/pul2");
int pul3= vars->AddInternalVarInt( "casa/Salon/pul3");
int pulIall= vars->AddInternalVarInt( "casa/Salon/intAll");
int pulAll= vars->AddInternalVarInt( "casa/Salon/pulAll");
//lcd---------------------------------------------------------
//lcd->add(0,"T des: %s",0,0);
//lcd->add(1,"H des: %s",1,0);
//lcd->add(temCoci,"T coci: %s",0,1);
//lcd->add(temDesp,"H coci: %s",1,1);
/*
//sin depender de variable
lcd->add(-1,"Hola",0,0);
lcd->add(-1,"como va",1,0);
lcd->add(-1,"Mi ritmo",0,1);
lcd->add(-1,"bueno pa goza",1,1);* /
//desencadenaores----------
char st[64];
//Efecto Interruptor-----
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
des->AddDes(st);
//Efecto Pulsadores
sprintf(st,"{%d}>0 -> !{%d} ",pulAll,pulIall);//terminar en espacios
des->AddDes(st);
sprintf(st,"{%d}>0 -> !{%d} ",pul1,lamb);//terminar en espacios
des->AddDes(st);
sprintf(st,"{%d}>0 -> !{%d} ",pul2,lchim);//terminar en espacios
des->AddDes(st);
sprintf(st,"{%d}>0 -> !{%d} ",pul3,lent);//terminar en espacios
des->AddDes(st);
/* */
}
};
class AutomatismosDomoConfig: public DomoConfig class AutomatismosDomoConfig: public DomoConfig
{ {
public: public:
@ -307,4 +405,4 @@ class ExteriorDomoConfig: public DomoConfig
//configuracion que se usara-------------------------- //configuracion que se usara--------------------------
DespachoDomoConfig ConfiguracionActual; ActDomoConfig ConfiguracionActual;