DomoEsp_v1/DomoEsp_v01_/sens_domo_mqtt.h

220 lines
6.9 KiB
C++

/*#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif*/
//clase sensor mqtt------------------------------------
#define DEBUG_PS 1//si 1 se envia log a puerto serie si no 0
#define MAX_SENS_MQTT 32
#define MAX_INTERRUP_SENS_MQTT 12 //ojo si se cambia hay que hacer mas funciones de interrupcion
#define MAX_RF_IN_SENS_MQTT 16
#define VERSION_SENS_MQTT 102
#include <EEPROM.h>
#include <PubSubClient.h>
#include <SimpleDHT.h>
#include <RCSwitch.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
class PubSubClient;
class LiquidCrystal;
void conecta_serie(int veloc);
template <class Carg1>
void envia_serie(Carg1 s)
{
if(DEBUG_PS)
Serial.print(s);
};
template <class Carg2>
void envia_serieln(Carg2 s)
{
if(DEBUG_PS)
Serial.println(s);
};
bool pasa_incre( unsigned long *tt, unsigned long incre);
bool pasa_incre( volatile unsigned long *tt, unsigned long incre);
ICACHE_RAM_ATTR void interrupcion1();
ICACHE_RAM_ATTR void interrupcion2();
ICACHE_RAM_ATTR void interrupcion3();
ICACHE_RAM_ATTR void interrupcion4();
ICACHE_RAM_ATTR void interrupcion5();
ICACHE_RAM_ATTR void interrupcion6();
ICACHE_RAM_ATTR void interrupcion7();
ICACHE_RAM_ATTR void interrupcion8();
ICACHE_RAM_ATTR void interrupcion9();
ICACHE_RAM_ATTR void interrupcion10();
ICACHE_RAM_ATTR void interrupcion11();
ICACHE_RAM_ATTR void interrupcion12();
//**************************************************************************************************************************************************
class Ceprom_manager
{
public:
int nb;
Ceprom_manager();
void leeb(byte *p);//lee un byte y deja en p
void grabab(byte p);//graba en eprom un byte
void graba_st(char *st);
void fin_grabacion();//hace efectivos los cambios en la eprom
void cursor(int pos=0);//mueve cursor a posicion indicada
template <class Cgeneg>
void get(Cgeneg* dout)//lee entero
{
byte *b=(byte)dout;
for(int i=sizeof(Cgeneg); i>0;i--)
leeb(&b[i]);
};
template <class Cgenes>
void set(Cgenes* dout)//lee entero
{
byte *b=(byte*)dout;
for(int i=sizeof(Cgenes); i>0;i--)
grabab(b[i]);
};
};
/*
* calse sensor individual de domotica, esta clase administra sensores particulares
*
* Sensor dht22 (sensor out)
* lectura de temperatura y humedad
* tipo: SENS_DHT22
* val: no usado
* pin: pin digital donde se conecta el sensor
* val_old:no usado
* retard:no usado
* id:no usado
* pun: se almacena el puntero a la clase dht
*
* Sensor bmp180
* lectura de temperatura presion y altitud varimetrica
* tipo: SENS_BMP180
* val: no usado
* pin: pin digital donde se conecta el sensor
* val_old:no usado
* retard:no usado
* id:no usado
* pun: se almacena el puntero de la clase bmp
*
* Sensor de entrada analogico
* lectura de 0 a 100 de sensor analogico
* tipo: SENS_ANALOG_IN
* val: si es 0 es directa si es uno es indirecta (la señal de salida es directa o inversamente proporcional a el valor analogico)
* pin: pin analogico donde se conecta el sensor
* val_old:no usado
* retard:no usado
* id:no usado
* pun: no usado
*
* Sensor de entrada digital
* el sensor de entrada digital funciona por interrucciones, el valor se actualiza inmediatamente
* tipo: SENS_DIGI_IN
* val:valor actual del sensor
* pin: pin digital al que esta conectado
* val_old: guarda el valor anterior
* retard: usado para cambiar automaticamente el valor al anterior
* id:no usado
* pun: no usado
* Sensor de entrada y salida digital (dos pines uno de entrada y otro de salida que tiene que tener el mismo valor)
* el sensor de entrada digital funciona por interrucciones, el valor se actualiza inmediatamente
* tipo: SENS_DIGI_IN_OUT
* val:valor actual del sensor
* pin: pin digital de salida (out)
* val_old:no usado
* retard:no usado
* id:pin digital de entrada (pin digital de entrada)
* pun: no usado
*/
class Csens_mqtt
{
public:
//generales--------------------
byte tipo;//tipo sensor
byte val;//se usa para guradar valor en algunos sensores y flags en otros//byte
int pin;//pin de conexion scl para bmp
char topic[8];//topic de mqtt que se anadira
//-----------------------------
//especificas
byte val_old;//byte
volatile unsigned long t;
unsigned long retard;
long id; //pin sda para bmp
void *pun;
//c y d----------------------
Csens_mqtt();
~Csens_mqtt();
bool envia_mqtt(PubSubClient *client_qqtt, char *top, bool envia);//envia estado del sensor por mqtt
//bool recive_mqtt(PubSubClient *client_qqtt, char *top);//recive estado de sensor por mqtt
//bool inicia();//inicia sensor (previamente ya seteado)
bool set(char *conf);//rellena sensor segun trama de configuracion
bool get(char *conf);//anade a la trama la configuracion correspondiente a este sensor
enum Tipo_sens//indica el tipo de sensor
{
SENS_NO_ASIG=0,//sensor sin asignar
SENS_DHT22,//sensor temperatura y humedad
SENS_BMP180,//sensor presion
SENS_ANALOG_IN,//sensor analogico in
SENS_DIGI_IN,//sensor digital in
SENS_DIGI_OUT,//sensor digital out
SENS_DIGI_IN_OUT,//sensor doble de entrada y salida (dos pines que tienen que tener el mismo valor)
SENS_RF_OUT,//sensor transmisor de rf
SENS_RF_IN,//sensor receptor de rf
SENS_RF_DATA_IN//dato a recivir por rf
};
};
//clase manager de sensores mqtt-----------------------
class Csens_domo_mqtt
{
public:
SimpleDHT22 cdht;//clase para leer de dht
Adafruit_BMP085 bmp;//clase bmp
PubSubClient *client_qqtt;
bool bmppillado;//indica si el bmp esta asignado o no
RCSwitch rf;
bool bloqueo_sens;//bloquea todos los sensores (para poder editarlos)
byte rf_in_pillado;//indica si rf in esta asignado
bool rf_out_pillado;//indica si rf_out esta asignado
byte ind_interrup[MAX_INTERRUP_SENS_MQTT];//array de interrupciones (indices a sensor)
int n,//numero de sensores
n_inter,//numero de interrupciones
flags;
unsigned long t_inter, t_rev_interrup;
byte ind_rf_in[MAX_RF_IN_SENS_MQTT];
int n_rf_in;
char top[16];//topic_id_sensor
Csens_mqtt sen[MAX_SENS_MQTT];
Csens_domo_mqtt();//constructor
//funciones-------------------------------
bool inicia(int i);//inicia el sensor iesimo
bool conf();//configura de eprom
void envia_comunes();//envia por mqtt la info de sensores comunes
void revisa_interrupciones();//revisa sensores con interrupciones
void revisa_rf();//revisa entradas de rf
bool graba_conf();//graba configuracion en eprom
void para_sens();//desconfigura todos los sensores (a nivel de hardware)
void del(int i);//borra el sensor iesimo
void subscribe_mqtt();//pone en suspcripcion de los sensores que sean necesarios
bool on_mqtt(char* topic, char* payload);//recibe traza mqtt
void on_interrupcion(int i);//ejecuta interrupcion iesima
void atachea(int i);//habilita interrupcion iesima
};
#ifndef PCLASE_SENS_DOMO
#define PCLASE_SENS_DOMO
static void *pclase_sens_domo_mq;
#endif