se añade sensor buzzer y sensor splitter

main
Gerardo 2024-09-30 12:09:35 +02:00
parent f4102900f2
commit e963db4213
9 changed files with 322 additions and 9 deletions

View File

@ -3,6 +3,6 @@
// Hover to view descriptions of existing attributes. // Hover to view descriptions of existing attributes.
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
] ]
} }

View File

@ -17,7 +17,7 @@ class Actuador: public DomoEspSensorReceiver
{ {
float val; float val;
char topicOut[MAXTOPICVAR]; char topicOut[MAXTOPICVAR];
char valSend[3]; char valSend[MAX_CHAR_ENVIO];
Cactivador activador[MAX_ACTIVADORES]; Cactivador activador[MAX_ACTIVADORES];
public: public:

View File

@ -7,10 +7,12 @@
#include "SensorPulsante.h" #include "SensorPulsante.h"
#include "SensorAin.h" #include "SensorAin.h"
#include "SensorVF.h" #include "SensorVF.h"
#include "SensorRF.h"
#include "SensorTimer.h" #include "SensorTimer.h"
#include "SensorLcd.h" #include "SensorLcd.h"
#include "SensorBuzzer.h"
#include "SensorRF.h"
#include "SensorSplitter.h"
#include "Actuador.h" #include "Actuador.h"
//---------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------

View File

@ -0,0 +1,70 @@
#ifndef SensorBuzzerDef
#define SensorBuzzerDef 1
#include "Utiles.h"
//sensor virtual
class SensorBuzzer: public DomoEspSensorReceiver
{
int val;
SonidoBuzzer buz;
int pin;
public:
SensorBuzzer()
{
val=0;
topic[0]=0;
}
void setMelodia(int i, char* melodia)
{
buz.Set(i, melodia);
}
void set(char* topic_id, int _pin)
{
val=0;
strcpy(topic, topic_id);
pin=_pin;
}
virtual float getVal()
{
return (float)val;
}
virtual void inicia()
{
pinMode(pin, OUTPUT);
digitalWrite(pin, 1);
}
virtual void SubscribeMqtt(IMqttManager* man){
//char buffer_t[MAXTOPICVAR];
sprintf(buffer_t, "%s/set",topic);
man->MqttSubs(buffer_t);
sprintf(buffer_t, "%s/pul",topic);
man->MqttSubs(buffer_t);
}
virtual void OnMqtt(IMqttManager * man, char* _topic, char* payload, int tipo)
{
if((tipo!=Topic::SET) && (tipo!=Topic::PUL))
return;
if(!strcmp(_topic, topic))
{
if(tipo==Topic::PUL)
{
//reproduce melodia
val=atoi(payload);
if(val>=0 && val<MAX_MELODIAS)
buz.Toca(pin, val);
digitalWrite(pin, 1);
}
else if(tipo==Topic::SET)
{
//reproduce melodia
char buf[5];
char*mel=buz.getMelSubSt(payload, '~', 5, buf);
val=atoi(buf);
if(val>=0 && val<MAX_MELODIAS)
buz.Set(val, mel);
}
}
}
};
#endif

View File

@ -0,0 +1,96 @@
#ifndef SensorSplitterDef
#define SensorSplitterDef 1
#include "defines.h"
//sensor virtual
class SplitterSend
{
public:
SplitterSend(){}
DomoEspSensorReceiver *sen;
};
class SensorSplitter: public DomoEspSensorReceiver
{
float val;
SplitterSend sensorSend[MAX_ACTIVADORES];
public:
SensorSplitter()
{
val=0;
topic[0]=0;
for(int i=0; i<MAX_ACTIVADORES; i++)
sensorSend[i].sen=0;
}
void set(char* topic_id, float valdef)
{
val=valdef;
strcpy(topic, topic_id);
}
void AddSens(DomoEspSensorReceiver* sen)
{
for(int i=0; i<MAX_ACTIVADORES; i++)
{
if(sensorSend[i].sen==NULL)
{
sensorSend[i].sen=sen;
return;
}
}
#ifdef DEBUG_PS
Serial.println("----------------------ERROR NO ENTRAN MAS SENSORES EN SPLITTER---------------- ");
#endif
}
virtual float getVal()
{
return (float)val;
}
virtual void SubscribeMqtt(IMqttManager* man){
//char buffer_t[MAXTOPICVAR];
sprintf(buffer_t, "%s/set",topic);
sprintf(buffer_t, "%s/pul",topic);
man->MqttSubs(buffer_t);
}
virtual void OnMqtt(IMqttManager * man, char* _topic, char* payload, int tipo)
{
if(tipo!=Topic::SET || tipo!=Topic::PUL)
return;
if(strcmp(_topic, topic))
return;
if(tipo==Topic::SET )
{
if(payload[0]=='X')
{
if(val==0)
val=1;
else
val=0; }
else
val=atof(payload);
for(int i=0; i<MAX_ACTIVADORES; i++)
{
if(sensorSend[i].sen)
{
sprintf(buffer_t, "%s/set",sensorSend[i].sen->topic);
man->MqttSend(buffer_t, payload);
}
}
}
else if(tipo==Topic::PUL )
{
for(int i=0; i<MAX_ACTIVADORES; i++)
{
if(sensorSend[i].sen)
{
sprintf(buffer_t, "%s/pul",sensorSend[i].sen->topic);
man->MqttSend(buffer_t, payload);
}
}
}
}
};
#endif

View File

@ -47,6 +47,7 @@ void MqttUtiles::resetFunc()
ESP.wdtEnable(1); ESP.wdtEnable(1);
while(1){}; while(1){};
} }
//************************************************************************************************************************************************** //**************************************************************************************************************************************************
WifiManager::WifiManager() WifiManager::WifiManager()
{ {
@ -228,3 +229,116 @@ void MqttManager::OnMqtt(char* topic, byte* payload, unsigned int length)
} }
//************************************************************************************************************************************************** //**************************************************************************************************************************************************
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);
}
}
//*************************************************
char* SonidoBuzzer::getMelSubSt(char* orig, char caracter, int lim, char* bufOut)
{
char* res;
for(int i=0; i<lim; i++)
{
if(orig[i]==caracter || orig[i]==0)
{
bufOut[i]=0;
res=&orig[i];
i=lim;
}
else
{
bufOut[i]=orig[i];
}
}
bufOut[lim-1]=0;
if(*res)
res=&res[1];
return res;
}
SonidoBuzzer::SonidoBuzzer()
{
n=0;
}
void SonidoBuzzer::Toca(int pin, int imel)
{
if (imel<0 || imel>=n)
return;
mel[imel].Toca(pin);
}
void SonidoBuzzer::Set(int i, char* melo)
{
if(i<MAX_MELODIAS)
{
strcpy(mel[i].melodia, melo);
}
}

View File

@ -11,7 +11,6 @@ class MqttUtiles
static void reinicia_incre( unsigned long *tt, unsigned long incre); static void reinicia_incre( unsigned long *tt, unsigned long incre);
static bool pasa_incre( volatile unsigned long *tt, unsigned long incre); static bool pasa_incre( volatile unsigned long *tt, unsigned long incre);
static void resetFunc(); static void resetFunc();
}; };
class MqttOnVarChangeListenner class MqttOnVarChangeListenner
@ -65,4 +64,29 @@ class MqttManager
static void OnMqtt(char* topic, uint8_t * payload, unsigned int length); static void OnMqtt(char* topic, uint8_t * payload, unsigned int length);
void subscribe_mqtt(); void subscribe_mqtt();
}; };
class MelodiaBuzzer
{
public:
//melodia se compone de notas (primera letra y tiempo de duracion) silecio es #
char melodia[MAX_CHAR_MELODIA];
MelodiaBuzzer();
int st2nota(char st);
int str2t(char* st, int *t);
void Toca(int pin);
};
class SonidoBuzzer
{
public:
MelodiaBuzzer mel[MAX_MELODIAS];
int n;
SonidoBuzzer();
void Toca(int pin, int melodia);
void Set(int i, char* melo);
char* getMelSubSt(char* orig, char caracter, int lim, char* bufOut);
};
#endif #endif

View File

@ -55,6 +55,7 @@ class ConfActual: public DomoEspConfig
SensorVF sv; SensorVF sv;
Actuador actTimer; Actuador actTimer;
SensorTimer st; SensorTimer st;
SensorBuzzer buz;
public: public:
ConfActual() ConfActual()
{ {
@ -74,6 +75,9 @@ class ConfActual: public DomoEspConfig
actTimer.set("casa/pruebas/inter", "casa/pruebas/timer", "1"); actTimer.set("casa/pruebas/inter", "casa/pruebas/timer", "1");
actTimer.setId("aTimer"); actTimer.setId("aTimer");
actTimer.AddActivador(&interup, '<', 1); actTimer.AddActivador(&interup, '<', 1);
buz.set("casa/pruebas/buz", D4);
buz.setMelodia(0, "m200#100d200#0");//titu
buz.setMelodia(1, "d200#100d200#100d200#100f200#100l300#0");//titu
} }
virtual void inicia(ISensorManager* man) virtual void inicia(ISensorManager* man)
@ -86,6 +90,8 @@ class ConfActual: public DomoEspConfig
man->Add(&sv); man->Add(&sv);
man->Add(&st); man->Add(&st);
man->Add(&actTimer); man->Add(&actTimer);
man->Add(&buz);
@ -149,6 +155,6 @@ class Confdespacho: public DomoEspConfig
}; };
Confdespacho ConfiguracionActual; ConfActual ConfiguracionActual;
#endif #endif

View File

@ -11,12 +11,13 @@
//sens-------------------- //sens--------------------
#define MAXSENS 16 //maximo de sensores totales #define MAXSENS 16 //maximo de sensores totales
//actuador
#define MAX_ACTIVADORES 5//maximo de activadores por actuador #define MAX_ACTIVADORES 5//maximo de activadores por actuador
#define MAX_CHAR_ENVIO 16
//MELODIA----------------------
#define MAX_CHAR_MELODIA 64
#define MAX_MELODIAS 4
#define MAXINTERRUP 8