Control de luces remoto
Presentación
El presente proyecto se origina en una inquietud planteada por el usuario Mr. Smith en el canal Arduino de Telegram sobre como controlar las luces a distancia sin dejar de mantener habilitadas las llaves de luces originales.
O sea se busco un modo que permitiera por un lado mantener el uso normal de las luces y simultaneamente habilitar el control remoto de tal modo que apgando o encendiendo las luces de un lado permitiera su encnedido y apagado del otro.
Al encarar el desarrollo se considero que la mejor opcion era establecer un sistema similar al que se usa en las escaleras donde se colocan dos llaves una a cada extremo y luego con cualquiera de ellas se pueden encender o apagar las luces
Para ello se coloca una llave combinada en cada extremo de la escalera conectandolas del siguiente modo
En este caso se propone reemplazar una de las llaves combinadas por un rele controlado a traves de una placa Esp8288 via wifi deste Telegram
Este rele reemplaza una de las llaves de dos puntos conectando igual que la misma de tal modo que las conexiones (NO) y (NC) se corresponden con cada una de las posiciones de la llave
Asi el sistema que armado conforme el siguiente esquema donde tando desde la llave como desde el rele se puede encender o apagar la luz segun corresponda
En el sistema de la escalera no hay problema para saber cuando cada llave enciende o apaga la lampara puesto tenemos visión directa de la misma y sabemos si esta encendida o no, pero en el presente proyecto quien controla la luz remotamente no tiene acceso visual al estado de la luz por lo que era necesario que se le hiciera llegar esa informacion.
Concretamente quien tiene el control remoto debia conocer si la luz estaba encendida u apagada para ello analice varias alternativas, pareciendo en primera instancia que la colocación de un Sensor de Voltaje Corriente Alterna que mostrara el paso del corriente en el cable que llega a la lampara, pero ello tenía dos inconvenientes, primero el bajo consuomo de las lamparas led porduciria una corriente casi imperceptible para el sensor y los sensores general señales analogicas no teneinado la placa Esp8266 pines analogicos para recibirlas.
Es por ello que se opto por agregar un segundo rele quedando el circuito de la siguiente manera:
De este modo la llave interruptora y el primer rele controlan con 5 volts la posición del segundo rele que es el que conecta y desconecta la lampara, y mediante una conexion entre el cable que lleva la señal al rele y el pin GPIO 0 de la Esp8266 se puede informar cual es el estado del segundo rele y por lo tanto de la lampara
Materiales
Conjunto de Rele con Placa Esp8266
Rele
Llave de dos puntos
Minifuente de 5 volts
Código
El codigo esta desarrollado con la IDE de arduino y tiene varias funciones, primero establece la conexion con la red wifi a la se conecta la Esp8266, despues establece la conexion con el BOT de Telegram que se utilizara para controlar las luces y finalmente controla el rele segun las instrucciones que reciba via telegram e informa por la misma via el estado de la lampara.
control.ino
//Libreria
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
//Parametros
const char* red = "Nombre de la red WIFI";
const char* clave = "Clave de la red WIFI";
#define BOTtoken "Token del BOT de Telegram"
#define CHAT_ID "ID del chat de Telegram"
X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
// Revisa si hay mensajes cada 1 segundo
int botRequestDelay = 100;
unsigned long tiempo;
const int control = 2;
const int salida = 0;
bool estado = LOW;
bool infor = false;
bool llave = false;
void maneja_mensajes(int mensaje){/* funcion maneja_respuestas */
Serial.println("Manejo Mensajes");
Serial.println(String(mensaje));
for (int i=0; i<mensaje; i++){
String chat_id = String(bot.messages[i].chat_id);
if (chat_id != CHAT_ID)
{
bot.sendMessage(chat_id, "USUARIO NO AUTORIZADO", "");
continue;
}
String texto = bot.messages[i].text;
Serial.println(texto);
String nombre = bot.messages[i].from_name;
if (texto == "/start") {
String saludo = "BIENVENIDO, " + nombre + ": \n";
saludo += "USE LOS SIGUIENTES COMANDOS PARA CONTROLAR SUS LUCES.\n\n";
saludo += "/prender_luz PARA PRENDER LA LUZ \n";
saludo += "/apagar_luz PARA APAGARLA \n";
saludo += "/estado PARA SABER EL ESTADO DE LA LUZ \n";
bot.sendMessage(chat_id, nombre, "");
}
if (texto == "/prender_luz") {
if (digitalRead(control)){
bot.sendMessage(chat_id, "LA LUZ YA ESTA PRENDIDA", "");
}else{
if (digitalRead(salida)){
estado = LOW;
digitalWrite(salida, estado);
}else{
estado = HIGH;
digitalWrite(salida, estado);
}
bot.sendMessage(chat_id, "SE PRENDIO LA LUZ", "");
}
}
if (texto == "/apagar_luz") {
if (digitalRead(control)){
if (digitalRead(salida)){
estado = LOW;
digitalWrite(salida, estado);
}else{
estado = HIGH;
digitalWrite(salida, estado);
}
bot.sendMessage(chat_id, "SE APAGO LA LUZ", "");
}else{
bot.sendMessage(chat_id, "LA LUZ YA ESTA APAGADA", "");
}
}
if (texto == "/estado") {
if (digitalRead(control)){
bot.sendMessage(chat_id, "LA LUZ ESTA PRENDIDA", "");
}else{
bot.sendMessage(chat_id, "LA LUZ ESTA APAGADA", "");
}
}
}
}
void setup(){
//Iniciar Puerto Serie USB
Serial.begin(115200);
Serial.println(F("Inicia Sistema"));
delay(5000);
configTime(0, 0, "pool.ntp.org");
client.setTrustAnchors(&cert);
pinMode(salida, OUTPUT);
digitalWrite(salida, estado);
//Iniciar Conexion
WiFi.mode(WIFI_STA);
Serial.print(F("Connectar a "));Serial.println(red);
WiFi.begin(red, clave);
// Conectar a red Wifi.
while (WiFi.status() != WL_CONNECTED)
{
delay(500);Serial.print(F("."));
}
Serial.println();
Serial.println(F("Conexion establecida"));
Serial.print(F("Direccion IP: "));
Serial.println(WiFi.localIP());
String saludo = "BIENVENIDO, \n";
saludo += "USE LOS SIGUIENTES COMANDOS PARA CONTROLAR SUS LUCES.\n\n";
saludo += "/prender_luz PARA PRENDER LA LUZ \n";
saludo += "/apagar_luz PARA APAGARLA \n";
saludo += "/estado PARA SABER EL ESTADO DE LA LUZ \n";
bot.sendMessage(CHAT_ID, saludo, "");
if (digitalRead(control)){
infor = true;
}else{
infor = false;
}
}
void loop(){
if (digitalRead(control)){
llave = true;
}else{
llave = false;
}
if (infor == llave){
Serial.print("no cambia");
}else{
bot.sendMessage(CHAT_ID, "CAMBIO DE ESTADO DE LA LLAVE", "");
if (digitalRead(control)){
bot.sendMessage(CHAT_ID, "SE PRENDIO LA LUZ", "");
}else{
bot.sendMessage(CHAT_ID, "SE APAGO LA LUZ", "");
}
infor = llave;
}
if (millis() > tiempo + botRequestDelay) {
int mensaje = bot.getUpdates(bot.last_message_received + 1);
while(mensaje) {
Serial.println("RESPUESTA OBTENIDA");
maneja_mensajes(mensaje);
mensaje = bot.getUpdates(bot.last_message_received + 1);
}
tiempo = millis();
}
}