Apertura cancello con comando vocale

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();
  }
}

Temo che con quella shield non puoi fare nulla purtroppo.

Lo schema elettrico dovrebbe essere quello che si trova a questo link e come puoi vedere hanno usato il GPIO0 per il transistor che pilota il relè.

Il GPIO0 al boot della MCU deve essere al livello HIGH (altrimenti la MCU non partirebbe) e quindi il relè si attiva di conseguenza.

Era quello che temevo. Grazie

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.