Alarma IOT con ESP32 y Rainmaker
CODIGO ARDUINO - PLACA ESP32 - 38 PINES
/**********************************************************************************
* Preferences--> Aditional boards Manager URLs :
* http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
*
* Download Board ESP32 (2.0.3):
**********************************************************************************/
#include <Wire.h>
#include <LiquidCrystal_I2C.h> //Downlaod the library: http://www.electronoobs.com/eng_arduino_liq_crystal.php
LiquidCrystal_I2C lcd(0x27,16,2);
#include <RTClib.h> // for the RTC
RTC_DS3231 rtc; // crea objeto del tipo RTC_DS3231
char daysOfTheWeek[7][12] = {"Domin", "Lunes", "Mart", "Mierc", "Juev", "Viern", "Sabad"};
#include "RMaker.h"
#include "WiFi.h"
#include "WiFiProv.h"
const char *service_name = "PROV_12345";
const char *pop = "1234567";
//**************************
int EstadoSistema = 1;
int EstadoArmado = 0;
int EstadoDesarmado = 0;
int EstadoSirena = 0;
int EstadoPanicoF = 0;
bool EstadoPanicoFD = false;
float Temperatura = 0;
int estadoRF = 0;
long previousMillis = 0;
long intervalOn = 90000;
int inicio = 0;
//******************************
// define the Device Names
char deviceName_1[] = "ARMADO"; //ARMADO 14
char deviceName_2[] = "DESARMADO"; //DESARMADO 27
char deviceName_3[] = "PinPanico"; //PinPanico 26
char deviceName_4[] = "RF"; //RF 12
char deviceName_5[] = "PinExtra"; //PinExtra 25
// define the GPIO connected with Relays and switches
static uint8_t LedR = 4; //LedR 4 RelayPin1
static uint8_t LedG = 17; //LedG 17 RelayPin2
static uint8_t LedB = 5; //LedB 5 RelayPin3
static uint8_t Rele = 23; //Rele 23 RelayPin4
static uint8_t ARMADO = 14; //D13 ARMADO
static uint8_t DESARMADO = 27; //D12 DESARMADO
static uint8_t PinPanico = 26; //D14 PinPanico
static uint8_t RF = 12; //D27 RF
static uint8_t PinExtra = 25; //D33 PinExtra
static uint8_t wifiLed = 2; //D2
static uint8_t gpio_reset = 0;
/* Variable for reading pin status*/
// Relay State
bool toggleState_1 = HIGH; //Define integer to remember the toggle state for LedR
bool toggleState_2 = LOW; //Define integer to remember the toggle state for LedG
bool toggleState_3 = LOW; //Define integer to remember the toggle state for LedB
bool toggleState_4 = LOW; //Define integer to remember the toggle state for Rele
// Switch State
bool SwitchState_1 = LOW; //ARMADO
bool SwitchState_2 = LOW; //DESARMADO
bool SwitchState_3 = LOW; //PinPanico
bool SwitchState_4 = LOW; //RF
bool SwitchState_5 = LOW; //PinExtra
//The framework provides some standard device types like switch, lightbulb, fan, temperature sensor.
static Switch my_switch1(deviceName_1, &LedR);
//static Switch my_switch2(deviceName_2, &LedG);
static Switch my_switch3(deviceName_3, &LedB);
//static Switch my_switch4(deviceName_4, &Rele);
void sysProvEvent(arduino_event_t *sys_event)
{
switch (sys_event->event_id) {
case ARDUINO_EVENT_PROV_START:
#if CONFIG_IDF_TARGET_ESP32
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on BLE\n", service_name, pop);
printQR(service_name, pop, "ble");
#else
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on SoftAP\n", service_name, pop);
printQR(service_name, pop, "softap");
#endif
break;
case ARDUINO_EVENT_WIFI_STA_CONNECTED:
Serial.printf("\nConnected to Wi-Fi!\n");
digitalWrite(wifiLed, true);
break;
}
}
void write_callback(Device *device, Param *param, const param_val_t val, void *priv_data, write_ctx_t *ctx)
{
const char *device_name = device->getDeviceName();
const char *param_name = param->getParamName();
if(strcmp(device_name, deviceName_1) == 0) {
Serial.printf("Lightbulb = %s\n", val.val.b? "true" : "false");
if(strcmp(param_name, "Power") == 0) {
Serial.printf("Received value = %s for %s - %s\n", val.val.b? "true" : "false", device_name, param_name);
toggleState_1 = val.val.b;
if(toggleState_1 == 1){
EstadoSistema = 1;
EstadoArmado = 1;
EstadoDesarmado = 0;
EstadoPanicoF = 0;
estadoRF = 0;
EstadoSirena = 0;
Serial.print("toggleState_1(ARMADO EN LINEA) = ");
Serial.println(toggleState_1);
}
if(toggleState_1 == 0){
EstadoSistema = 0;
EstadoArmado = 0;
EstadoDesarmado = 1;
EstadoPanicoF = 0;
estadoRF = 0;
EstadoSirena = 0;
Serial.print("toggleState_1(DESARMADO EN LINEA) = ");
Serial.println(toggleState_1);
}
param->updateAndReport(val);
}
/*
} else if(strcmp(device_name, deviceName_2) == 0) {
Serial.printf("Switch value = %s\n", val.val.b? "true" : "false");
if(strcmp(param_name, "Power") == 0) {
Serial.printf("Received value = %s for %s - %s\n", val.val.b? "true" : "false", device_name, param_name);
toggleState_2 = val.val.b;
//(toggleState_2 == false) ? digitalWrite(LedG, HIGH) : digitalWrite(LedG, LOW);
Serial.print("toggleState_2(DESARMADO EN LINEA) = ");
Serial.println(toggleState_2);
param->updateAndReport(val);
}
*/
} else if(strcmp(device_name, deviceName_3) == 0) {
Serial.printf("Switch value = %s\n", val.val.b? "true" : "false");
if(strcmp(param_name, "Power") == 0) {
Serial.printf("Received value = %s for %s - %s\n", val.val.b? "true" : "false", device_name, param_name);
toggleState_3 = val.val.b;
EstadoPanicoF = toggleState_3;
Serial.print("BOTON DE PANICO = ");
Serial.println(EstadoPanicoF);
previousMillis = millis();
if(EstadoPanicoF == 0){
digitalWrite(Rele, LOW);
}
param->updateAndReport(val);
}
} else if(strcmp(device_name, deviceName_4) == 0) {
Serial.printf("Switch value = %s\n", val.val.b? "true" : "false");
if(strcmp(param_name, "Power") == 0) {
Serial.printf("Received value = %s for %s - %s\n", val.val.b? "true" : "false", device_name, param_name);
toggleState_4 = val.val.b;
//(toggleState_4 == false) ? digitalWrite(Rele, HIGH) : digitalWrite(Rele, LOW);
param->updateAndReport(val);
}
}
}
void manual_control()
{
if (digitalRead(ARMADO) == HIGH) {
armado();
toggleState_1 = 1;
SwitchState_1 = HIGH;
my_switch1.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, toggleState_1);
Serial.println("Sistema Armado desde control remoto");
}
if (digitalRead(DESARMADO) == HIGH) {
desarmado();
toggleState_1 = 0;
toggleState_2 = 0;
toggleState_3 = 0;
SwitchState_2 = HIGH;
my_switch1.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, toggleState_1);
my_switch3.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, toggleState_3);
Serial.println("Sistema Desarmado desde control remoto");
}
if (digitalRead(PinPanico) == HIGH) {
toggleState_3 = 1;
SwitchState_3 = HIGH;
EstadoPanicoF = 1;
Serial.print("BOTON DE PANICO = ");
Serial.println(EstadoPanicoF);
previousMillis = millis(); //Solo pasara si en boton esta en HIGH. Si esta en LOW el bucle no hara esta accion.
estadoRF = 0;
my_switch3.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, toggleState_3);
Serial.println("Panico activado desde control remoto");
}
if (digitalRead(RF) == HIGH) {
estadoRF = 1;
toggleState_4 = 1;
SwitchState_4 = HIGH;
}
}
void setup()
{
uint32_t chipId = 0;
Serial.begin(115200);
Wire.begin( ); // GDY200622
lcd.begin();
lcd.backlight();
lcd.print("Iniciando...");
// Set the Relays GPIOs as output mode
pinMode(LedR, OUTPUT);
pinMode(LedG, OUTPUT);
pinMode(LedB, OUTPUT);
pinMode(Rele, OUTPUT);
// Configure the input GPIOs
pinMode(ARMADO, INPUT);
pinMode(DESARMADO, INPUT);
pinMode(PinPanico, INPUT);
pinMode(RF, INPUT);
pinMode(PinExtra, INPUT);
pinMode(gpio_reset, INPUT);
// Write to the GPIOs the default state on booting
digitalWrite(LedR, !toggleState_1);
digitalWrite(LedG, !toggleState_2);
digitalWrite(LedB, !toggleState_3);
digitalWrite(Rele, !toggleState_4);//*****************
digitalWrite(wifiLed, LOW);
Node my_node;
my_node = RMaker.initNode("ALARMA DOMOTICA ESP32");
//Standard switch device
my_switch1.addCb(write_callback);
//my_switch2.addCb(write_callback);
my_switch3.addCb(write_callback);
//my_switch4.addCb(write_callback);
//Add switch device to the node
my_node.addDevice(my_switch1);
//my_node.addDevice(my_switch2);
my_node.addDevice(my_switch3);
//my_node.addDevice(my_switch4);
//This is optional
RMaker.enableOTA(OTA_USING_PARAMS);
//If you want to enable scheduling, set time zone for your region using setTimeZone().
//The list of available values are provided here https://rainmaker.espressif.com/docs/time-service.html
// RMaker.setTimeZone("Asia/Shanghai");
// Alternatively, enable the Timezone service and let the phone apps set the appropriate timezone
RMaker.enableTZService();
RMaker.enableSchedule();
//Service Name
for(int i=0; i<17; i=i+8) {
chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
}
Serial.printf("\nChip ID: %d Service Name: %s\n", chipId, service_name);
Serial.printf("\nStarting ESP-RainMaker\n");
RMaker.start();
WiFi.onEvent(sysProvEvent);
#if CONFIG_IDF_TARGET_ESP32
WiFiProv.beginProvision(WIFI_PROV_SCHEME_BLE, WIFI_PROV_SCHEME_HANDLER_FREE_BTDM, WIFI_PROV_SECURITY_1, pop, service_name);
#else
WiFiProv.beginProvision(WIFI_PROV_SCHEME_SOFTAP, WIFI_PROV_SCHEME_HANDLER_NONE, WIFI_PROV_SECURITY_1, pop, service_name);
#endif
my_switch1.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, false);
//my_switch2.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, false);
my_switch3.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, false);
//my_switch4.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, false);
if(!rtc.begin()) {
//Serial.println(F("Couldn't find RTC"));
while(1);
}
lcd.clear();
}
void loop(){
Fecha_hora();
if(toggleState_1 == 1 && EstadoArmado == 1){
armado();
EstadoArmado = 0;
EstadoDesarmado = 0;
}
if(toggleState_1 == 0 && EstadoDesarmado == 1){
desarmado();
EstadoArmado = 0;
EstadoDesarmado = 0;
}
if(EstadoPanicoF == 1){
digitalWrite (LedR, HIGH);//*******************
digitalWrite (LedG, LOW);
digitalWrite (LedB, LOW);
digitalWrite (Rele, HIGH);
}
if((EstadoSistema == 1) && (estadoRF == 1) && (EstadoPanicoF == 0)){
Serial.println("INTRUSO DETECTADO");
Serial.print("EstadoSistema = ");
Serial.println(EstadoSistema);
Serial.print("EstadoPanicoF = ");
Serial.println(EstadoPanicoF);
Serial.print("EstadoRF = ");
Serial.println(estadoRF);
Serial.print("EstadoSirena = ");
Serial.println(EstadoSirena);
digitalWrite(Rele, HIGH);
digitalWrite (LedR, HIGH);//*******************
digitalWrite (LedG, LOW);
digitalWrite (LedB, LOW);
previousMillis = millis(); //Solo pasara si en boton esta en HIGH. Si esta en LOW el bucle no hara esta accion.
estadoRF = 0;
EstadoSirena = 1;
}
if(millis() - previousMillis >= intervalOn) { // Mientras (estado = 1) millis aumentara con cada pasada del bucle y previusMillis se mantendra
digitalWrite (Rele, LOW);
estadoRF = 0;
EstadoSirena = 0;
EstadoPanicoF = 0;
}
if((EstadoSistema == 1) && (estadoRF == 0) && (EstadoSirena == 0) && (EstadoPanicoF == 0)){
digitalWrite (LedR, LOW);
digitalWrite (LedG, HIGH);//*************
digitalWrite (LedB, LOW);
}
if((EstadoSistema == 0) && (EstadoPanicoF == 0) && (estadoRF == 0) && (EstadoSirena == 0)){
digitalWrite (LedR, LOW);
digitalWrite (LedG, LOW);
digitalWrite (LedB, HIGH);
//digitalWrite (Rele, LOW);
}
// Read GPIO0 (external button to reset device
if(digitalRead(gpio_reset) == LOW) { //Push button pressed
Serial.printf("Reset Button Pressed!\n");
// Key debounce handling
delay(100);
int startTime = millis();
while(digitalRead(gpio_reset) == LOW) delay(50);
int endTime = millis();
if ((endTime - startTime) > 10000) {
// If key pressed for more than 10secs, reset all
Serial.printf("Reset to factory.\n");
RMakerFactoryReset(2);
} else if ((endTime - startTime) > 3000) {
Serial.printf("Reset Wi-Fi.\n");
// If key pressed for more than 3secs, but less than 10, reset Wi-Fi
RMakerWiFiReset(2);
}
}
delay(100);
if (WiFi.status() != WL_CONNECTED)
{
//Serial.println("WiFi Not Connected");
digitalWrite(wifiLed, false);
}
else
{
//Serial.println("WiFi Connected");
digitalWrite(wifiLed, true);
}
manual_control();
if(inicio <= 250){
inicio = inicio + 1;
//Serial.print("Inicio = ");
//Serial.println(inicio);
if(inicio == 245){
Serial.print("ENVIANDO...");
toggleState_1 = 1;
delay(100);
my_switch1.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, toggleState_1);
delay(100);
}
}
}
void Fecha_hora(){
DateTime now = rtc.now(); // funcion que devuelve fecha y horario en formato
if((now.second()==0) || (now.minute()==0) || (now.hour()==0)){
lcd.begin();
//delay(100);
}
lcd.setCursor(0,0); //columna, fila
lcd.print(now.day(), DEC); // funcion que obtiene el dia de la fecha completa
lcd.print("/"); // caracter barra como separador
lcd.print(now.month(), DEC); // funcion que obtiene el mes de la fecha completa
lcd.print("/"); // caracter barra como separador
lcd.print(now.year(), DEC); // funcion que obtiene el año de la fecha completa
lcd.setCursor(0,1);
lcd.print(now.hour(), DEC); // funcion que obtiene la hora de la fecha completa
lcd.print(":"); // caracter dos puntos como separador
lcd.print(now.minute(), DEC); // funcion que obtiene los minutos de la fecha completa
lcd.print(":"); // caracter dos puntos como separador
lcd.print(now.second(), DEC); // funcion que obtiene los segundos de la fecha completa
lcd.setCursor(11,0);
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
lcd.setCursor(9,1);
Temperatura = rtc.getTemperature();
lcd.print(Temperatura);
lcd.setCursor(14,1);
lcd.print(" C");
}
void armado(){
EstadoSistema = 1;
EstadoPanicoF = 0;
estadoRF = 0;
EstadoSirena = 0;
digitalWrite(Rele, HIGH); // RELE QUE ACTIVA LA SIRENA
delay (600);
digitalWrite(Rele, LOW);
delay (5000); //ESPERA 5 SEGUNDOS PARA SALIR Y ARMAR
digitalWrite(Rele, HIGH);
delay (200);
digitalWrite(Rele, LOW);
delay(50);
Serial.println("SISTEMA ARMADO");
Serial.print("EstadoSistema = ");
Serial.println(EstadoSistema);
Serial.print("EstadoPanicoF = ");
Serial.println(EstadoPanicoF);
Serial.print("EstadoRF = ");
Serial.println(estadoRF);
Serial.print("EstadoSirena = ");
Serial.println(EstadoSirena);
delay(300);
}
void desarmado(){
EstadoPanicoF = 0;
EstadoSistema = 0;
estadoRF = 0;
EstadoSirena = 0;
digitalWrite(Rele, HIGH); // RELE QUE ACTIVA LA SIRENA
delay (100);
digitalWrite(Rele, LOW);
delay (100);
digitalWrite(Rele, HIGH); //SIRENA ACTIVADA
delay (100);
digitalWrite(Rele, LOW);
delay (100);
digitalWrite(Rele, HIGH); // SIRENA ACTIVADA
delay (100);
digitalWrite(Rele, LOW);
delay(50);
Serial.println("SISTEMA DESARMADO");
Serial.print("EstadoSistema = ");
Serial.println(EstadoSistema);
Serial.print("EstadoPanicoF = ");
Serial.println(EstadoPanicoF);
Serial.print("EstadoRF = ");
Serial.println(estadoRF);
Serial.print("EstadoSirena = ");
Serial.println(EstadoSirena);
}
ALARMA CON ESP32 - RAINMAKER + WASSAP
/**********************************************************************************
* HERRAMIENTAS / PARTITION SCHEME .... ELEGIR RAINMAKER
Debes obtener la clave API del bot antes de usar la API:
1. Añade el número de teléfono +34 644 81 58 78 en Contactos de Teléfono. (Nómbralo como desees)
2. Envía este mensaje " I allow callmebot to send me messages " al nuevo Contacto creado (usando WhatsApp por supuesto)
3. Espere hasta recibir el mensaje " API activada para su número de teléfono. Su APIKEY es 123123 " del bot.
Nota: Si no recibes la ApiKey en 2 minutos, inténtalo nuevamente después de 24hs.
El mensaje de WhatsApp del bot contendrá la apikey necesaria para enviar mensajes utilizando la API.
Puede enviar mensajes de texto utilizando la API después de recibir la confirmación.
**********************************************************************************/
#include <WiFi.h>
#include <HTTPClient.h>
String apiKey = "4649876";
String phone_number = "+573004380249";
String url;
#include <Wire.h>
#include <LiquidCrystal_I2C.h> //Downlaod the library: http://www.electronoobs.com/eng_arduino_liq_crystal.php
LiquidCrystal_I2C lcd(0x27,16,2);
#include <RTClib.h> // for the RTC
RTC_DS3231 rtc; // crea objeto del tipo RTC_DS3231
char daysOfTheWeek[7][12] = {"Domin", "Lunes", "Mart", "Mierc", "Juev", "Viern", "Sabad"};
#include "RMaker.h"
#include "WiFi.h"
#include "WiFiProv.h"
const char *service_name = "PROV_12345";
const char *pop = "1234567";
//**************************
int EstadoSistema = 1;
int EstadoArmado = 0;
int EstadoDesarmado = 0;
int EstadoSirena = 0;
int EstadoPanicoF = 0;
bool EstadoPanicoFD = false;
float Temperatura = 0;
int estadoRF = 0;
long previousMillis = 0;
long intervalOn = 90000;
int inicio = 0;
//******************************
// define the Device Names
char deviceName_1[] = "ARMADO"; //ARMADO 14
char deviceName_2[] = "DESARMADO"; //DESARMADO 27
char deviceName_3[] = "PinPanico"; //PinPanico 26
char deviceName_4[] = "RF"; //RF 12
char deviceName_5[] = "PinExtra"; //PinExtra 25
// define the GPIO connected with Relays and switches
static uint8_t LedR = 4; //LedR 4 RelayPin1
static uint8_t LedG = 17; //LedG 17 RelayPin2
static uint8_t LedB = 5; //LedB 5 RelayPin3
static uint8_t Rele = 23; //Rele 23 RelayPin4
static uint8_t ARMADO = 14; //D13 ARMADO
static uint8_t DESARMADO = 27; //D12 DESARMADO
static uint8_t PinPanico = 26; //D14 PinPanico
static uint8_t RF = 12; //D27 RF
static uint8_t PinExtra = 25; //D33 PinExtra
static uint8_t wifiLed = 2; //D2
static uint8_t gpio_reset = 0;
/* Variable for reading pin status*/
// Relay State
bool toggleState_1 = HIGH; //Define integer to remember the toggle state for LedR
bool toggleState_2 = LOW; //Define integer to remember the toggle state for LedG
bool toggleState_3 = LOW; //Define integer to remember the toggle state for LedB
bool toggleState_4 = LOW; //Define integer to remember the toggle state for Rele
// Switch State
bool SwitchState_1 = LOW; //ARMADO
bool SwitchState_2 = LOW; //DESARMADO
bool SwitchState_3 = LOW; //PinPanico
bool SwitchState_4 = LOW; //RF
bool SwitchState_5 = LOW; //PinExtra
//The framework provides some standard device types like switch, lightbulb, fan, temperature sensor.
static Switch my_switch1(deviceName_1, &LedR);
//static Switch my_switch2(deviceName_2, &LedG);
static Switch my_switch3(deviceName_3, &LedB);
//static Switch my_switch4(deviceName_4, &Rele);
void sysProvEvent(arduino_event_t *sys_event)
{
switch (sys_event->event_id) {
case ARDUINO_EVENT_PROV_START:
#if CONFIG_IDF_TARGET_ESP32
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on BLE\n", service_name, pop);
printQR(service_name, pop, "ble");
#else
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on SoftAP\n", service_name, pop);
printQR(service_name, pop, "softap");
#endif
break;
case ARDUINO_EVENT_WIFI_STA_CONNECTED:
Serial.printf("\nConnected to Wi-Fi!\n");
digitalWrite(wifiLed, true);
break;
}
}
void write_callback(Device *device, Param *param, const param_val_t val, void *priv_data, write_ctx_t *ctx)
{
const char *device_name = device->getDeviceName();
const char *param_name = param->getParamName();
if(strcmp(device_name, deviceName_1) == 0) {
Serial.printf("Lightbulb = %s\n", val.val.b? "true" : "false");
if(strcmp(param_name, "Power") == 0) {
Serial.printf("Received value = %s for %s - %s\n", val.val.b? "true" : "false", device_name, param_name);
toggleState_1 = val.val.b;
if(toggleState_1 == 1){
EstadoSistema = 1;
EstadoArmado = 1;
EstadoDesarmado = 0;
EstadoPanicoF = 0;
estadoRF = 0;
EstadoSirena = 0;
Serial.print("toggleState_1(ARMADO EN LINEA) = ");
Serial.println(toggleState_1);
message_to_whatsapp("SISTEMA ARMADO EN LINEA "); // Cuando el sensor detecte movimiento se enviara un mensje de alerta a tu whatsapp
}
if(toggleState_1 == 0){
EstadoSistema = 0;
EstadoArmado = 0;
EstadoDesarmado = 1;
EstadoPanicoF = 0;
estadoRF = 0;
EstadoSirena = 0;
Serial.print("toggleState_1(DESARMADO EN LINEA) = ");
message_to_whatsapp("SISTEMA DESARMADO EN LINEA ");
Serial.println(toggleState_1);
}
param->updateAndReport(val);
}
/*
} else if(strcmp(device_name, deviceName_2) == 0) {
Serial.printf("Switch value = %s\n", val.val.b? "true" : "false");
if(strcmp(param_name, "Power") == 0) {
Serial.printf("Received value = %s for %s - %s\n", val.val.b? "true" : "false", device_name, param_name);
toggleState_2 = val.val.b;
//(toggleState_2 == false) ? digitalWrite(LedG, HIGH) : digitalWrite(LedG, LOW);
Serial.print("toggleState_2(DESARMADO EN LINEA) = ");
Serial.println(toggleState_2);
param->updateAndReport(val);
}
*/
} else if(strcmp(device_name, deviceName_3) == 0) {
Serial.printf("Switch value = %s\n", val.val.b? "true" : "false");
if(strcmp(param_name, "Power") == 0) {
Serial.printf("Received value = %s for %s - %s\n", val.val.b? "true" : "false", device_name, param_name);
toggleState_3 = val.val.b;
EstadoPanicoF = toggleState_3;
Serial.print("BOTON DE PANICO = ");
Serial.println(EstadoPanicoF);
message_to_whatsapp("PANICO ACTIVADO EN LINEA ");
previousMillis = millis();
if(EstadoPanicoF == 0){
digitalWrite(Rele, LOW);
message_to_whatsapp("PANICO DESACTIVADO AUTOMATICO POR TIEMPO ");
}
param->updateAndReport(val);
}
} else if(strcmp(device_name, deviceName_4) == 0) {
Serial.printf("Switch value = %s\n", val.val.b? "true" : "false");
if(strcmp(param_name, "Power") == 0) {
Serial.printf("Received value = %s for %s - %s\n", val.val.b? "true" : "false", device_name, param_name);
toggleState_4 = val.val.b;
//(toggleState_4 == false) ? digitalWrite(Rele, HIGH) : digitalWrite(Rele, LOW);
param->updateAndReport(val);
}
}
}
void manual_control()
{
if (digitalRead(ARMADO) == HIGH) {
armado();
toggleState_1 = 1;
SwitchState_1 = HIGH;
my_switch1.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, toggleState_1);
Serial.println("Sistema Armado desde control remoto");
message_to_whatsapp("SISTEMA ARMADO CON CONTROL REMOTO ");
}
if (digitalRead(DESARMADO) == HIGH) {
desarmado();
toggleState_1 = 0;
toggleState_2 = 0;
toggleState_3 = 0;
SwitchState_2 = HIGH;
my_switch1.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, toggleState_1);
my_switch3.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, toggleState_3);
Serial.println("Sistema Desarmado desde control remoto");
message_to_whatsapp("SISTEMA DESARMADO CON CONTROL REMOTO ");
}
if (digitalRead(PinPanico) == HIGH) {
toggleState_3 = 1;
SwitchState_3 = HIGH;
EstadoPanicoF = 1;
Serial.print("BOTON DE PANICO = ");
Serial.println(EstadoPanicoF);
previousMillis = millis(); //Solo pasara si en boton esta en HIGH. Si esta en LOW el bucle no hara esta accion.
estadoRF = 0;
my_switch3.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, toggleState_3);
Serial.println("Panico activado desde control remoto");
message_to_whatsapp("Panico activado desde control remoto ");
}
if (digitalRead(RF) == HIGH) {
estadoRF = 1;
toggleState_4 = 1;
SwitchState_4 = HIGH;
}
}
void setup()
{
uint32_t chipId = 0;
Serial.begin(115200);
Wire.begin( ); // GDY200622
lcd.begin();
lcd.backlight();
lcd.print("Iniciando...");
// Set the Relays GPIOs as output mode
pinMode(LedR, OUTPUT);
pinMode(LedG, OUTPUT);
pinMode(LedB, OUTPUT);
pinMode(Rele, OUTPUT);
// Configure the input GPIOs
pinMode(ARMADO, INPUT);
pinMode(DESARMADO, INPUT);
pinMode(PinPanico, INPUT);
pinMode(RF, INPUT);
pinMode(PinExtra, INPUT);
pinMode(gpio_reset, INPUT);
// Write to the GPIOs the default state on booting
digitalWrite(LedR, !toggleState_1);
digitalWrite(LedG, !toggleState_2);
digitalWrite(LedB, !toggleState_3);
digitalWrite(Rele, !toggleState_4);//*****************
digitalWrite(wifiLed, LOW);
Node my_node;
my_node = RMaker.initNode("ALARMA DOMOTICA ESP32");
//Standard switch device
my_switch1.addCb(write_callback);
//my_switch2.addCb(write_callback);
my_switch3.addCb(write_callback);
//my_switch4.addCb(write_callback);
//Add switch device to the node
my_node.addDevice(my_switch1);
//my_node.addDevice(my_switch2);
my_node.addDevice(my_switch3);
//my_node.addDevice(my_switch4);
//This is optional
RMaker.enableOTA(OTA_USING_PARAMS);
//If you want to enable scheduling, set time zone for your region using setTimeZone().
//The list of available values are provided here https://rainmaker.espressif.com/docs/time-service.html
// RMaker.setTimeZone("Asia/Shanghai");
// Alternatively, enable the Timezone service and let the phone apps set the appropriate timezone
RMaker.enableTZService();
RMaker.enableSchedule();
//Service Name
for(int i=0; i<17; i=i+8) {
chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
}
Serial.printf("\nChip ID: %d Service Name: %s\n", chipId, service_name);
Serial.printf("\nStarting ESP-RainMaker\n");
RMaker.start();
WiFi.onEvent(sysProvEvent);
#if CONFIG_IDF_TARGET_ESP32
WiFiProv.beginProvision(WIFI_PROV_SCHEME_BLE, WIFI_PROV_SCHEME_HANDLER_FREE_BTDM, WIFI_PROV_SECURITY_1, pop, service_name);
#else
WiFiProv.beginProvision(WIFI_PROV_SCHEME_SOFTAP, WIFI_PROV_SCHEME_HANDLER_NONE, WIFI_PROV_SECURITY_1, pop, service_name);
#endif
my_switch1.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, false);
//my_switch2.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, false);
my_switch3.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, false);
//my_switch4.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, false);
if(!rtc.begin()) {
//Serial.println(F("Couldn't find RTC"));
while(1);
}
lcd.clear();
}
void loop(){
Fecha_hora();
if(toggleState_1 == 1 && EstadoArmado == 1){
armado();
EstadoArmado = 0;
EstadoDesarmado = 0;
}
if(toggleState_1 == 0 && EstadoDesarmado == 1){
desarmado();
EstadoArmado = 0;
EstadoDesarmado = 0;
}
if(EstadoPanicoF == 1){
digitalWrite (LedR, HIGH);//*******************
digitalWrite (LedG, LOW);
digitalWrite (LedB, LOW);
digitalWrite (Rele, HIGH);
}
if((EstadoSistema == 1) && (estadoRF == 1) && (EstadoPanicoF == 0)){
Serial.println("INTRUSO DETECTADO");
message_to_whatsapp("INTRUSO DETECTADO ");
Serial.print("EstadoSistema = ");
Serial.println(EstadoSistema);
Serial.print("EstadoPanicoF = ");
Serial.println(EstadoPanicoF);
Serial.print("EstadoRF = ");
Serial.println(estadoRF);
Serial.print("EstadoSirena = ");
Serial.println(EstadoSirena);
digitalWrite(Rele, HIGH);
digitalWrite (LedR, HIGH);//*******************
digitalWrite (LedG, LOW);
digitalWrite (LedB, LOW);
previousMillis = millis(); //Solo pasara si en boton esta en HIGH. Si esta en LOW el bucle no hara esta accion.
estadoRF = 0;
EstadoSirena = 1;
}
if(millis() - previousMillis >= intervalOn) { // Mientras (estado = 1) millis aumentara con cada pasada del bucle y previusMillis se mantendra
digitalWrite (Rele, LOW);
estadoRF = 0;
EstadoSirena = 0;
EstadoPanicoF = 0;
}
if((EstadoSistema == 1) && (estadoRF == 0) && (EstadoSirena == 0) && (EstadoPanicoF == 0)){
digitalWrite (LedR, LOW);
digitalWrite (LedG, HIGH);//*************
digitalWrite (LedB, LOW);
}
if((EstadoSistema == 0) && (EstadoPanicoF == 0) && (estadoRF == 0) && (EstadoSirena == 0)){
digitalWrite (LedR, LOW);
digitalWrite (LedG, LOW);
digitalWrite (LedB, LOW); //HIGH
//digitalWrite (Rele, LOW);
}
// Read GPIO0 (external button to reset device
if(digitalRead(gpio_reset) == LOW) { //Push button pressed
Serial.printf("Reset Button Pressed!\n");
// Key debounce handling
delay(100);
int startTime = millis();
while(digitalRead(gpio_reset) == LOW) delay(50);
int endTime = millis();
if ((endTime - startTime) > 10000) {
// If key pressed for more than 10secs, reset all
Serial.printf("Reset to factory.\n");
RMakerFactoryReset(2);
} else if ((endTime - startTime) > 3000) {
Serial.printf("Reset Wi-Fi.\n");
// If key pressed for more than 3secs, but less than 10, reset Wi-Fi
RMakerWiFiReset(2);
}
}
delay(100);
if (WiFi.status() != WL_CONNECTED)
{
//Serial.println("WiFi Not Connected");
digitalWrite(wifiLed, false);
}
else
{
//Serial.println("WiFi Connected");
digitalWrite(wifiLed, true);
}
manual_control();
if(inicio <= 250){
inicio = inicio + 1;
//Serial.print("Inicio = ");
//Serial.println(inicio);
if(inicio == 245){
Serial.print("ENVIANDO...");
toggleState_1 = 1;
delay(100);
my_switch1.updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, toggleState_1);
delay(100);
}
}
}
void Fecha_hora(){
DateTime now = rtc.now(); // funcion que devuelve fecha y horario en formato
if((now.second()==0) || (now.minute()==0) || (now.hour()==0)){
lcd.begin();
//delay(100);
}
lcd.setCursor(0,0); //columna, fila
lcd.print(now.day(), DEC); // funcion que obtiene el dia de la fecha completa
lcd.print("/"); // caracter barra como separador
lcd.print(now.month(), DEC); // funcion que obtiene el mes de la fecha completa
lcd.print("/"); // caracter barra como separador
lcd.print(now.year(), DEC); // funcion que obtiene el año de la fecha completa
lcd.setCursor(0,1);
lcd.print(now.hour(), DEC); // funcion que obtiene la hora de la fecha completa
lcd.print(":"); // caracter dos puntos como separador
lcd.print(now.minute(), DEC); // funcion que obtiene los minutos de la fecha completa
lcd.print(":"); // caracter dos puntos como separador
lcd.print(now.second(), DEC); // funcion que obtiene los segundos de la fecha completa
lcd.setCursor(11,0);
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
lcd.setCursor(9,1);
Temperatura = rtc.getTemperature();
lcd.print(Temperatura);
lcd.setCursor(14,1);
lcd.print(" C");
}
void armado(){
EstadoSistema = 1;
EstadoPanicoF = 0;
estadoRF = 0;
EstadoSirena = 0;
digitalWrite(Rele, HIGH); // RELE QUE ACTIVA LA SIRENA
delay (600);
digitalWrite(Rele, LOW);
delay (5000); //ESPERA 5 SEGUNDOS PARA SALIR Y ARMAR
digitalWrite(Rele, HIGH);
delay (200);
digitalWrite(Rele, LOW);
delay(50);
Serial.println("SISTEMA ARMADO");
Serial.print("EstadoSistema = ");
Serial.println(EstadoSistema);
Serial.print("EstadoPanicoF = ");
Serial.println(EstadoPanicoF);
Serial.print("EstadoRF = ");
Serial.println(estadoRF);
Serial.print("EstadoSirena = ");
Serial.println(EstadoSirena);
delay(300);
}
void desarmado(){
EstadoPanicoF = 0;
EstadoSistema = 0;
estadoRF = 0;
EstadoSirena = 0;
digitalWrite(Rele, HIGH); // RELE QUE ACTIVA LA SIRENA
delay (100);
digitalWrite(Rele, LOW);
delay (100);
digitalWrite(Rele, HIGH); //SIRENA ACTIVADA
delay (100);
digitalWrite(Rele, LOW);
delay (100);
digitalWrite(Rele, HIGH); // SIRENA ACTIVADA
delay (100);
digitalWrite(Rele, LOW);
delay(50);
Serial.println("SISTEMA DESARMADO");
Serial.print("EstadoSistema = ");
Serial.println(EstadoSistema);
Serial.print("EstadoPanicoF = ");
Serial.println(EstadoPanicoF);
Serial.print("EstadoRF = ");
Serial.println(estadoRF);
Serial.print("EstadoSirena = ");
Serial.println(EstadoSirena);
}
void message_to_whatsapp(String message) // es nuestra función definida por el usuario que enviará mensajes a WhatsApp messenger.
{
//agregando todos los números, su clave api, su mensaje en una url completa
url = "https://api.callmebot.com/whatsapp.php?phone=" + phone_number + "&apikey=" + apiKey + "&text=" + urlencode(message);
postData(); // llamando a postData para ejecutar la URL generada anteriormente una vez para que reciba un mensaje.
}
void postData() //postData es otra función definida por el usuario que se utiliza para enviar la URL mediante el método HTTP GET.
{
int httpCode; // variable utilizada para obtener el código http de respuesta después de llamar a api
HTTPClient http; // Declarar objeto de clase HTTPClient
http.begin(url); // comience el objeto HTTPClient con la URL generada
httpCode = http.POST(url); // Finalmente, publique la URL con esta función y almacenará el código http
if (httpCode == 200) // Compruebe si el código http de respuesta es 200
{
Serial.println("MENSAJE ENVIADO CORRECTAMENTE"); // imprimir MENSAJE ENVIADO CORRECTAMENTE
}
else // si el código HTTP de respuesta no es 200, significa que hay algún error.
{
Serial.println("Error."); // Imprimir mensaje de error.
}
http.end(); // Después de llamar a la API, finalice el objeto de cliente HTTP.
}
String urlencode(String str) // Función utilizada para codificar la url
{
String encodedString = "";
char c;
char code0;
char code1;
char code2;
for (int i = 0; i < str.length(); i++) {
c = str.charAt(i);
if (c == ' ') {
encodedString += '+';
} else if (isalnum(c)) {
encodedString += c;
} else {
code1 = (c & 0xf) + '0';
if ((c & 0xf) > 9) {
code1 = (c & 0xf) - 10 + 'A';
}
c = (c >> 4) & 0xf;
code0 = c + '0';
if (c > 9) {
code0 = c - 10 + 'A';
}
code2 = '\0';
encodedString += '%';
encodedString += code0;
encodedString += code1;
//encodedString+=code2;
}
yield();
}
return encodedString;
}
Comentarios
Publicar un comentario