diff --git a/DomoEsp_v02/DomoEspManager.cpp b/DomoEsp_v02/DomoEspManager.cpp index 10f4131..b6c0e67 100644 --- a/DomoEsp_v02/DomoEspManager.cpp +++ b/DomoEsp_v02/DomoEspManager.cpp @@ -6,6 +6,7 @@ DomoEspManager::DomoEspManager() //vars.AddListenner(&sens); //vars.AddListenner(&des); sens.Config(&vars); + sens.buzz=&buzz; suscrito=false; } diff --git a/DomoEsp_v02/DomoEspManager.h b/DomoEsp_v02/DomoEspManager.h index d45d7b7..8bd6bda 100644 --- a/DomoEsp_v02/DomoEspManager.h +++ b/DomoEsp_v02/DomoEspManager.h @@ -89,6 +89,9 @@ class DomoEspManager: public MqttReceiver MqttManager mqtt; MqttDesencadenadorManager des; + + SonidoBuzzer buzz; + LcdMQTTViewer lcdm; bool suscrito; diff --git a/DomoEsp_v02/MqttSensManager.cpp b/DomoEsp_v02/MqttSensManager.cpp index 668fb7f..572c2cf 100644 --- a/DomoEsp_v02/MqttSensManager.cpp +++ b/DomoEsp_v02/MqttSensManager.cpp @@ -124,6 +124,23 @@ void MqttSensManager::AddDout(int pin, char* topic, bool defautlValor) pinMode(s.pin, OUTPUT); 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) { MqttSensor s; @@ -296,6 +313,20 @@ void MqttSensManager::OnVarChange(int ivar) digitalWrite( s->pin, v->val.i); 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: break; } diff --git a/DomoEsp_v02/MqttSensManager.h b/DomoEsp_v02/MqttSensManager.h index dc08a50..d8ded5d 100644 --- a/DomoEsp_v02/MqttSensManager.h +++ b/DomoEsp_v02/MqttSensManager.h @@ -26,7 +26,7 @@ */ #include "MqttDefines.h" #include - +class SonidoBuzzer; //class PubSubClient; class MqttVarManager; #include @@ -63,7 +63,8 @@ class MqttSensor SENS_ANALOG_IN,//sensor analogico in SENS_DIGI_IN,//sensor digital in (algo con 2 estados) 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) }; @@ -131,7 +132,7 @@ class MqttSensManager: public MqttOnVarChangeListenner SimpleDHT22 cdht;//clase para leer de dht Adafruit_BMP085 bmp;//clase bmp - + SonidoBuzzer *buzz; bool bloqueo_sens;//bloquea todos los sensores (para poder editarlos) int ind_interrup[MAXINTERRUP]; @@ -166,7 +167,8 @@ class MqttSensManager: public MqttOnVarChangeListenner //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 ... - + void AddBuzz(int pin, char* topic); + void AddMelodia(char* m); //funciones auxiliares------------ MqttSensor* Get(int i); diff --git a/DomoEsp_v02/MqttUtiles.cpp b/DomoEsp_v02/MqttUtiles.cpp index 1e8f25d..6a1f6b1 100644 --- a/DomoEsp_v02/MqttUtiles.cpp +++ b/DomoEsp_v02/MqttUtiles.cpp @@ -179,3 +179,91 @@ void Ceprom_manager::cursor(int 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++; +} diff --git a/DomoEsp_v02/MqttUtiles.h b/DomoEsp_v02/MqttUtiles.h index 6108a10..59490a4 100644 --- a/DomoEsp_v02/MqttUtiles.h +++ b/DomoEsp_v02/MqttUtiles.h @@ -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 diff --git a/DomoEsp_v02/config_rf.h b/DomoEsp_v02/config_rf.h index 2aaadd8..d7da724 100644 --- a/DomoEsp_v02/config_rf.h +++ b/DomoEsp_v02/config_rf.h @@ -2,6 +2,104 @@ #define DEBUG_PS 1//Descomentar para debug #define CON_LCD 1 //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 { public: @@ -307,4 +405,4 @@ class ExteriorDomoConfig: public DomoConfig //configuracion que se usara-------------------------- -DespachoDomoConfig ConfiguracionActual; +ActDomoConfig ConfiguracionActual;