Irrighiamo con Wemos e Telegram lo sketch

Irrighiamo con Wemos e Telegram lo sketch finalmente ci siamo, in questo articolo trovi lo sketch con cui controllare il progetto.

Irrighiamo con Wemos e Telegram sketch

Come hai letto negli ultimi articoli dedicati al progetto ci sono alcuni passaggi che compongono il progetto e che puoi seguire leggendo questi articoli:

a cui si aggiunge il presente articolo con la descrizione dello sketch.

Irrighiamo con Wemos e Telegram lo sketch

Iniziamo subito con lo sketch che ti permetterà di controllare il tuo progetto di irrigazione da remoto:

/*******************************************************************
    A telegram bot for your ESP8266 that controls the 
    capacitive soil moisture sensor and a pump.

    Parts:
    D1 Mini ESP8266 (or any ESP8266 board)
    Capacitive soil moisture sensor

    *** BOM ***
    WeMos D1 mini ( ESP8266 )
    Capacitive soil moisture sensor ( https://amzn.to/3h8I5po )
    Wemos proto shield
    Drv8833 motor driver ( https://amzn.to/3z1vUAV )
    Wemos Lipo battery shield ( https://amzn.to/3zSGI5w )
    Pompa peristaltica ( https://amzn.to/3zV6pCu )
    Lipo Battery 1000mAh ( https://amzn.to/3twc1AM )
    3D case per pompa peristaltica ( https://www.thingiverse.com/thing:4961202 )
    3D case per elettronica e batteria ( https://www.thingiverse.com/thing:4961202 )
    
    Written by Mauro Alfieri
    YouTube: https://www.youtube.com/c/MauroAlfieri77
    Instagram: @mauroalfieri
 *******************************************************************/

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

// Wifi network station credentials
#define WIFI_SSID "[Your WiFI SSID Name]"
#define WIFI_PASSWORD "[Your WiFI Password]"
// Telegram BOT Token (Get from Botfather)
#define BOT_TOKEN "[Telegram Bot Token]"

const unsigned long BOT_MTBS = 1000; // mean time between scan messages

X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
unsigned long bot_lasttime; // last time messages' scan has been done

const int ledPin = LED_BUILTIN;
const int  soilMoistureSensor = A0;
const int  pumpA = D5;
const int  pumpB = D6;

int ledStatus = 0;
int pumpStatus = 0;
int soilMisure = 0;
const int soilThreshold = 500;
const int irrigationTime = 1500;

char buffer[200] ="";

void handleNewMessages(int numNewMessages)
{
  Serial.print("handleNewMessages ");
  Serial.println(numNewMessages);

  for (int i = 0; i < numNewMessages; i++) {
    String chat_id = bot.messages[i].chat_id;
    String text = bot.messages[i].text;

    String from_name = bot.messages[i].from_name;
    if (from_name == "")
      from_name = "Guest";

    if (text == "/ledon")       { digitalWrite(ledPin, LOW); ledStatus = 1; bot.sendMessage(chat_id, "Led is ON", ""); }
    if (text == "/ledoff")      { ledStatus = 0; digitalWrite(ledPin, HIGH); bot.sendMessage(chat_id, "Led is OFF", ""); }
    if (text == "/status")      { if (ledStatus) { bot.sendMessage(chat_id, "Led is ON", ""); } else { bot.sendMessage(chat_id, "Led is OFF", ""); } }
    if (text == "/pumpon")      { pumpON(); bot.sendMessage(chat_id, "Pump is ON", ""); }
    if (text == "/pumpoff")     { pumpOFF(); bot.sendMessage(chat_id, "Pump is OFF", ""); }
    if (text == "/pumpStatus")  { if (pumpStatus) { bot.sendMessage(chat_id, "Pump is ON", ""); } else { bot.sendMessage(chat_id, "Pump is OFF", ""); } }
    if (text == "/soilUmidity") { sprintf(buffer, "Soil Moisture: %d\n", soilMisure); bot.sendMessage(chat_id, buffer, ""); }
    if (text == "/Water2000")   { irrigation( 2000 ); bot.sendMessage(chat_id, "Pump is ON for 2sec", ""); }
    if (text == "/Water4000")   { irrigation( 4000 ); bot.sendMessage(chat_id, "Pump is ON for 4sec", ""); }
    if (text == "/Water6000")   { irrigation( 6000 ); bot.sendMessage(chat_id, "Pump is ON for 6sec", ""); }
    if (text == "/Water8000")   { irrigation( 8000 ); bot.sendMessage(chat_id, "Pump is ON for 8sec", ""); }
    if (text == "/Water10000")  { irrigation( 10000 ); bot.sendMessage(chat_id, "Pump is ON for 10sec", ""); }

    if (text == "/start") {
      String welcome = "Welcome to Universal Arduino Telegram Bot library, " + from_name + ".\n";
      welcome += "This is Flash Led Bot example.\n\n";
      welcome += "/ledon : to switch the Led ON\n";
      welcome += "/ledoff : to switch the Led OFF\n";
      welcome += "/status : Returns current status of LED\n";

      welcome += "/pumpon : to switch the Pump ON\n";
      welcome += "/pumpoff : to switch the Pump OFF\n";
      welcome += "/pumpStatus : Returns current status of Pump\n";

      welcome += "/Water2000 : Returns current status of Pump\n";
      welcome += "/Water4000 : Returns current status of Pump\n";
      welcome += "/Water6000 : Returns current status of Pump\n";
      welcome += "/Water8000 : Returns current status of Pump\n";
      welcome += "/Water10000 : Returns current status of Pump\n";
      
      welcome += "/soilUmidity : Returns current status of Soil\n";
      bot.sendMessage(chat_id, welcome, "Markdown");
    }
  }
}


void setup() {
  Serial.begin(115200);
  Serial.println();

  pinMode(soilMoistureSensor, INPUT);
  pinMode(pumpA, OUTPUT);
  pinMode(pumpB, OUTPUT);
  pinMode(ledPin, OUTPUT);
  delay(10);
  digitalWrite(ledPin, HIGH);
  digitalWrite(pumpA, LOW);
  digitalWrite(pumpB, LOW);

  // attempt to connect to Wifi network:
  configTime(0, 0, "pool.ntp.org");      // get UTC time via NTP
  secured_client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
  Serial.print("Connecting to Wifi SSID ");
  Serial.print(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); }
  Serial.print("\nWiFi connected. IP address: ");
  Serial.println(WiFi.localIP());

  // Check NTP/Time, usually it is instantaneous and you can delete the code below.
  Serial.print("Retrieving time: ");
  time_t now = time(nullptr);
  while (now < 24 * 3600) {
    Serial.print(".");
    delay(100);
    now = time(nullptr);
  }
  Serial.println(now);
}

void loop() {
  if (millis() - bot_lasttime > BOT_MTBS) {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    while (numNewMessages) {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }

    bot_lasttime = millis();

    soilMisure = analogRead(soilMoistureSensor);
    Serial.println(soilMisure);
    if (soilMisure > soilThreshold) { irrigation( irrigationTime ); }
  }
}

void irrigation( int timeToIrrigation ) {
  for(int i=0; i<=timeToIrrigation; i++ ) {
      pumpON();
      delay(1);  
    }
    pumpOFF();
}  

void pumpON() {
  digitalWrite(pumpA,LOW);
  analogWrite(pumpB,255);
  pumpStatus = 1;
}  

void pumpOFF() {
    digitalWrite(pumpA, LOW);
    digitalWrite(pumpB, LOW);
    pumpStatus = 0;
}

la descrizione della maggior parte delle linee di codice la puoi trovare in questi due articoli:

in questo articolo dedicato al progetto  irrighiamo con Wemos e Telegram lo sketch leggerai il commento alle sole linee nuove partendo dalle

linee 045-046: in cui definisci due nuove costanti legate ai due pin della Wemod a cui è connesso il driver DRV8833 per il controllo della pompa peristaltica.

All’interno della funzione handleMessages() dovrai inserire alcune linee nuove come le linee 072-074: in cui per ciascuna linea definisci sia il messaggio che ti spetti da Telegram sia l’azione da intraprendere alla ricezione; ad esempio la line a 072 indica che alla ricezione del messaggio “/pumpon” devi avviare la pompa richiamando la funzione pumpON() ( che analizzeremo in seguito ) e restituire il messaggio “Pump is ON” al bot telegram.

Analogamente le altre due linee faranno operazioni simili.

Le linee 076-080: aggiungono altri possibili comandi recepiti dallo sketch; ad esempio digitando sul bot il comando “/Water6000” avvierai l’irrigazione per 6 secondi ( 6000 millisecondi ):

Irrighiamo con Wemos e Telegram test finale water

al termine dell’esecuzione della funzione di irrigazione il messaggio che restituirai al bot sarà “Pumo is ON for 6sec” anche se l’esecuzione della routine di irrigazione è già terminata quando il bot riceverà il messaggio.

Linea 082:  definisce il messaggio di risposta al comando “/start” è quindi necessario aggiungere anche in questa parte di sketch delle linee nuove.

Tali linee informeranno l’utente che sta utilizzando Telegram dei possibili comandi che irrighiamo con Wemos e Telegram lo sketch accetta.

In particolare puoi aggiungere le linee 089-091 che analogamente alle linee 072-074 definiscono i nuovi comandi accettati, anche se saranno le righe 072-074 ad eseguirli.

Le linee 093-097 che provvederanno ad informare l’utente dell’esistenza dei comandi /Water* ( dove * è il valore in millisecondi accettato dal programma ).

In questo modo inviando dal Bot il comando “/start” l’utente riceverà il seguente messaggio:

Irrighiamo con Wemos e Telegram test finale start

e sarà in grado di irrigare o chiedere info sullo stato del terreno.

Puoi trovare sul sito thingiverse i file necessari alla realizzazione dei due case 3D che ospitano il progetto.

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/irrighiamo-con-wemos-e-telegram-lo-sketch.html

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.