Salve a tutti, ho accroccato un piccolo dispositivo che simula la pressione del tasto del citofono per l'apertura del cancello. Il dispositivo è formato da un ESP-01S montato su un adattatore con relè ESP-8266.
Per dare il comando da remoto ho usato una chatbot di telegram che poi ho integrato tramite IFTTT e l'assistente vocale android.
Il dispositivo funziona ma ho il problema che appena lo alimento il relè parte per pochi istanti e questo causerebbe l'apertura del cancello ogni volta che, per esempio, va via la corrente. Posso risolvere in qualche modo? Grazie
#ifdef ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
// Credenziali di rete
const char* ssid = "XXX";
const char* password = "123456";
// Inizializzazione del BOT Telegram
#define BOTtoken "12345:AAEEIIOOUU" // Inserisci il tuo token BOT
// Aggiungi i chat ID autorizzati in un array
const String chat_ids[] = {"123123123", "-321321321"}; // Sostituisci con i tuoi chat ID
#define NUM_CHATS 2 // Numero di chat ID
#ifdef ESP8266
X509List cert(TELEGRAM_CERTIFICATE_ROOT);
#endif
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
// Controllo del bot ogni 1 secondo
int botRequestDelay = 1000;
unsigned long lastTimeBotRan = 0;
// Pin del relè
#define RELAY 0
// Funzione per verificare se l'ID del messaggio è autorizzato
bool isAuthorized(String chat_id) {
for (int i = 0; i < NUM_CHATS; i++) {
if (chat_ids[i] == chat_id) {
return true;
}
}
return false;
}
// Funzione per gestire nuovi messaggi
void handleNewMessages(int numNewMessages) {
Serial.println("handleNewMessages");
Serial.println(String(numNewMessages));
for (int i = 0; i < numNewMessages; i++) {
String chat_id = String(bot.messages[i].chat_id);
if (!isAuthorized(chat_id)) {
bot.sendMessage(chat_id, "Utente non autorizzato.", "");
continue;
}
String text = bot.messages[i].text;
Serial.println(text);
if (text == "/start") {
bot.sendMessage(chat_id, "Benvenuto! Usa /apri_cancello per APRIRE il cancello.", "");
}
if (text == "/apri_cancello") {
digitalWrite(RELAY, LOW); // Accende il relè - Apre il cancello
bot.sendMessage(chat_id, "Cancello in apertura", "");
delay(1000); // Aspetta 1 secondo
digitalWrite(RELAY, HIGH); // Spegne il relè automaticamente
}
}
}
void setup() {
Serial.begin(115200);
// Configurazione pin del relè/cancello
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, HIGH); // Assicura che il cancello sia chiuso all'avvio
// Connessione alla rete WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connessione al WiFi in corso...");
}
Serial.println("Connesso al WiFi!");
Serial.println(WiFi.localIP());
#ifdef ESP8266
configTime(0, 0, "pool.ntp.org");
client.setTrustAnchors(&cert); // Aggiunge il certificato per ESP8266
#endif
#ifdef ESP32
client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Aggiunge il certificato per ESP32
#endif
}
void loop() {
if (millis() > lastTimeBotRan + botRequestDelay) {
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
while (numNewMessages) {
handleNewMessages(numNewMessages);
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}
lastTimeBotRan = millis();
}
}