DomoEsp_v2.0/DomoEspSensor/Utiles.cpp

367 lines
7.6 KiB
C++

#include <Arduino.h>
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#elif defined(ESP32) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(ESP32C3)
#include <WiFi.h>
#else
#error "Placa no soportada"
#endif
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <PubSubClient.h>
#include <SPI.h>
#include "Utiles.h"
//**************************************************************************************************************************************************
void MqttUtiles::resetFunc()
{
#if defined(ESP32) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(ESP32C3)
ESP.restart();
#elif defined(ESP8266)
ESP.wdtEnable(1);
#else
#error "Placa no soportada"
#endif
while(1){};
}
//**************************************************************************************************************************************************
Ctimer::Ctimer()
{
t=0;
}
void Ctimer::set(int incremento_seg)
{
incre=1000*incremento_seg;
}
void Ctimer::setmilis(int milis)
{
incre=milis;
}
void Ctimer::inicia()
{
t=millis();
}
bool Ctimer::onTimer()
{
unsigned long ta=millis();
if(ta<t)
return true;
if((t+incre)>=ta)
return false;
return true;
}
bool Ctimer::onTimerReset()
{
unsigned long ta=millis();
if(ta<t)
{
t=ta;
return true;
}
if((t+incre)>=ta)
return false;
t=ta;
return true;
}
//**************************************************************************************************************************************************
WifiManager::WifiManager()
{
}
void WifiManager::inicia( WiFiClient *espclient,char *ssid, char* key, char *idArdu)
{
espClient= espclient;
strcpy(nred, ssid);
strcpy(pass, key);
strcpy(idArduino,idArdu);
conecta();
//return WiFi.status() == WL_CONNECTED;
}
bool WifiManager::conecta()
{
#ifdef DEBUG_PS
Serial.println("Conectando wifi");
Serial.println(nred);
Serial.println(pass);
#endif
WiFi.mode(WIFI_STA);
WiFi.begin(nred, pass);
for(int i=0; i<100 && WiFi.status() != WL_CONNECTED; i++)
{
delay(500);
#ifdef DEBUG_PS
Serial.print(".");
#endif
}
#ifdef DEBUG_PS
Serial.println("");
if(WiFi.status() == WL_CONNECTED)
Serial.println("Wifi Conectado");
else
{
Serial.println("No se pudo conectar");
}
#endif
if(WiFi.status() != WL_CONNECTED)
return false;
//ota----------------------------------
// Port defaults to 8266
// ArduinoOTA.setPort(8266);
// Hostname defaults to esp8266-[ChipID]
ArduinoOTA.setHostname(idArduino);
// No authentication by default
// ArduinoOTA.setPassword("admin");
// Password can be set with it's md5 value as well
// MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
// ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_FS
type = "filesystem";
}
#ifdef DEBUG_PS
// NOTE: if updating FS this would be the place to unmount FS using FS.end()
Serial.println("Start updating " + type);
#endif
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
#ifdef DEBUG_PS
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
#endif
});
ArduinoOTA.onError([](ota_error_t error) {
#ifdef DEBUG_PS
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) {
Serial.println("Auth Failed");
} else if (error == OTA_BEGIN_ERROR) {
Serial.println("Begin Failed");
} else if (error == OTA_CONNECT_ERROR) {
Serial.println("Connect Failed");
} else if (error == OTA_RECEIVE_ERROR) {
Serial.println("Receive Failed");
} else if (error == OTA_END_ERROR) {
Serial.println("End Failed");
}
#endif
});
ArduinoOTA.begin();
#ifdef DEBUG_PS
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
#endif
return true;
}
bool WifiManager::loop()
{
if((WiFi.status() == WL_CONNECTED))
{
ArduinoOTA.handle();
return true;
}
#ifdef DEBUG_PS
Serial.println("Fallo de conexion wifi");
#endif
//ESP.reset();
return false;
}
//**************************************************************************************************************************************************
MqttManager::MqttManager()
{
}
void MqttManager::inicia(PubSubClient *mqttClient,char *ideEsp, char *host, int port, MqttReceiver* classReceiver)
{
strcpy(idEsp,ideEsp);
Mqttlistener=classReceiver;
client_mqtt=mqttClient;
client_mqtt->setServer(host, port);
client_mqtt->setCallback(MqttManager::OnMqtt);
}
bool MqttManager::loop()
{
if(client_mqtt->loop())
return true;
#ifdef DEBUG_PS
if(WiFi.status() == WL_CONNECTED)
Serial.println("Conectando a broker");
#endif
if(client_mqtt->connect(idEsp))
{
#ifdef DEBUG_PS
if(WiFi.status() == WL_CONNECTED)
Serial.println("Conectado a broker");
#endif
subscribe_mqtt();
return true;
}
#ifdef DEBUG_PS
Serial.println("Fallo de conexion a mqtt broker");
#endif
//ESP.reset();
return false;
}
void MqttManager::subscribe_mqtt()
{
if(Mqttlistener==NULL)
return;
Mqttlistener->SubscribeMqtt(client_mqtt);
}
//auxiliar------------------
void MqttManager::OnMqtt(char* topic, byte* payload, unsigned int length)
{
if(Mqttlistener==NULL)
return;
int i;
char buf[MAXTOPICVAR];
i= MAXTOPICVAR-1;
if(i>length)
i=length;
memcpy(buf, payload, i);
buf[i]=0;
Mqttlistener->OnMqtt(topic, buf);
}
//**************************************************************************************************************************************************
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, const char* melo)
{
if(i<MAX_MELODIAS)
{
strcpy(mel[i].melodia, melo);
}
}