Este video es la continuación del video «esp now luces 1». En este video añado un detector de temperatura para proteger la caja junto con los dispositivos que hay dentro si alcanzaran mucha temperatura. Tambien protejo la placa ESP32 por si alcanza mucha temperatura. Utilizo el modo «deep sleep» para dejar sin tensión la instalación. Añado código para asegurarme de que las placas se comunican, y un pulsador para encender las luces de manera manual.
Código de la placa NodeMCU ESP32 V4, esta tarjeta en la que da tensión al relé para encender las luces, esta placa recibe la señal de la placa donde esta conectada el detector de movimiento.
#include <Arduino.h>
#include <WiFi.h>
#include <esp_now.h>
//funcion enlazada a codigo "c" compilada con compilador "c++"
#ifdef __cplusplus
extern "C" {
#endif
uint8_t temprature_sens_read();
#ifdef __cplusplus
}
#endif
uint8_t temprature_sens_read();
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
const int rele = 14;
const int pinPulsador = 35;
int i = 1;
int pulsador =0;
int analogPin = 33; // KY-028 detector de temperatura
int valAnalogTemp;
int confirmacion;
int grados;
void funcionPulsador(){
if(digitalRead(pinPulsador)==HIGH){
digitalWrite(rele, HIGH);
pulsador=1;
}else if(digitalRead(pinPulsador)==LOW){
pulsador=0;
}
}
typedef struct struct_message {
int a;
} struct_message;
// Se crean dos variables con tipo estructura myData
struct_message myDataRec;
struct_message myDataSen;
esp_now_peer_info_t peerInfo;
// Llamada para el envio del mensaje
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
if (status == ESP_NOW_SEND_SUCCESS){
confirmacion=1;
}else{
confirmacion=2;
}
}
// Funcion que recibe el mensaje
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&myDataRec, incomingData, sizeof(myDataRec));
if(myDataRec.a==2){confirmacion=1;}
if (myDataRec.a==2 || digitalRead(pinPulsador)==HIGH){
digitalWrite(rele,HIGH);
} else {
digitalWrite(rele,LOW);
}
}
void setup() {
// Iniciar Serial Monitor
Serial.begin(9600);
pinMode(rele, OUTPUT);
pinMode(pinPulsador, INPUT_PULLDOWN);
pinMode(analogPin,INPUT_PULLDOWN);
// Configuracion del modo Wi-Fi
WiFi.mode(WIFI_STA);
// Iniciar ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
// Funcion para enviar el mensaje
esp_now_register_send_cb(OnDataSent);
//Este apartado del peer es util para enviar el paquete
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
// Add peer
if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Failed to add peer");
return;
}
// Funcion para recibir el mensaje
esp_now_register_recv_cb(OnDataRecv);
}
void loop() {
funcionPulsador();
valAnalogTemp=analogRead(analogPin);
grados=((temprature_sens_read() - 32) / 1.8);
if(grados>=65 || valAnalogTemp<=900 || valAnalogTemp>=1300){
Serial.flush();
esp_sleep_enable_timer_wakeup(5e6);
esp_deep_sleep_start();
}
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myDataSen, sizeof(myDataSen));
while(confirmacion==2 && pulsador==0){
digitalWrite(rele, LOW);
delay(2000);
}
delay(2000);
}
Este es el código de la placa que recibe la señal del detector de movimiento, y envía la señal a la otra placa para dar tensión a la base de enchufes donde estan conectadas las lamparas.
#include <Arduino.h>
#include <WiFi.h>
#include <esp_now.h>
int confirmacion;
int contador;
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
const int pir = 14;
//Tipo de dato estructura
typedef struct struct_message {
int a;
} struct_message;
// Crear dos datos con el formato estructura
struct_message myDataRec;
struct_message myDataSen;
esp_now_peer_info_t peerInfo;
// Funcion para enviar datos
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
if (status == ESP_NOW_SEND_SUCCESS){
confirmacion=1;
}else{
confirmacion=2;
}
}
// Esta funcion se ejecuta cuando se recibe el dato
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&myDataRec, incomingData, sizeof(myDataRec));
}
void setup() {
//Datos para la comunicacion Monitor Serie
Serial.begin(9600);
pinMode(pir, INPUT_PULLDOWN);
// Configuracion del modo Wifi
WiFi.mode(WIFI_STA);
// Inicializa el protocolo esp-now
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
// Funcion para recibir el paquete
esp_now_register_recv_cb(OnDataRecv);
// Funcion para el envio de datos
esp_now_register_send_cb(OnDataSent);
//Este apartado del peer es utilizado para el envio del paquete
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
// Add peer
if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Failed to add peer");
return;
}
}
void loop() {
contador=0;
if (digitalRead(pir) == HIGH){
// Set values to send
myDataSen.a = 2;
// Enviar el mensaje ESP-NOW
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myDataSen, sizeof(myDataSen));
while(contador<=10){
delay(2000);
contador++;
if(digitalRead(pir)==HIGH){
myDataSen.a = 2;
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myDataSen, sizeof(myDataSen));
contador=0;
}
}
} else {
myDataSen.a=0;
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myDataSen, sizeof(myDataSen));
}
delay(2000);
}
El video explicando un poco como funciona:
Deja una respuesta Cancelar la respuesta