En aquest cas es poden llegir les lectures del dispositiu des de Telegram. El bot de Telegram és gestionat des del mateix microcontrolador, fent servir la biblioteca ESP8266TelegramBOT. Aquest mètode permet simplificar el sistema quan no es desitgen guardar les lectures en un full de càlcul però té l'inconvenient que el bot no funciona quan la placa no té connexió a internet. El programa del microcontrolador és el següent:
#include <SPI.h> #include <WiFiNINA.h> #include "ESP8266TelegramBOT.h" #include <Wire.h> #include "Adafruit_SGP30.h" #include <Adafruit_NeoPixel.h> #include <Adafruit_Sensor.h> #include <DHT.h> #include <DHT_U.h> // dades bot #define BOT_TOKEN "^^78785858:AAFz3vYYjSaRu9Q1R-xB2JYjRMfbxezrFqA" #define BOT_NAME "GasDetect" #define BOT_USERNAME "GasDetect_bot" #define chat_id "^^46465040" // buscar @chatidbot a telegram i escriure el id que doni el bot
// dades xarxa wifi char ssid[] = "xarxa-wifi"; // nom xarxa wifi char password[] ="contrasenya-wifi"; // contrassenya int status = WL_IDLE_STATUS; void Bot_EchoMessages(); TelegramBOT bot(BOT_TOKEN, BOT_NAME, BOT_USERNAME); int Bot_mtbs = 1500; // temps que triga a chekejar els missatges long Bot_lasttime; String Sender; Adafruit_SGP30 sgp; DHT_Unified dht(2, DHT22); Adafruit_NeoPixel pixels(1, 1, NEO_GRB + NEO_KHZ800); uint32_t delayMS; int counter = 0;
void setup() {
dht.begin();
sensor_t sensor;
dht.temperature().getSensor(&sensor);
dht.humidity().getSensor(&sensor);
delayMS = sensor.min_delay / 1000;
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("intent fallit!");
while (true);
}
while (status != WL_CONNECTED) {
Serial.print("Intentat-se conectar: ");
Serial.println(ssid);
status = WiFi.begin(ssid, password);
delay(5000);
}
// iniciar Telegram Bot
bot.begin();
Serial.println("conectat");
// iniciar Adafruit Neopixel
pixels.begin();
Serial.begin(115200);
if (! sgp.begin()){
Serial.println("Sensor not found :(");
while (1);
}
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
}
void loop() {
pixels.clear();
delay(delayMS);
sensors_event_t event;
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
Serial.println(F("Error reading temperature!"));
} else {
Serial.print(F("Temperature: "));
Serial.print(event.temperature);
Serial.println(F(" °C"));
delay(50);
}
// Get humidity event and print its value.
dht.humidity().getEvent(&event);
Serial.print(F("Humidity: "));
Serial.print(event.relative_humidity);
Serial.println(F("%"));
delay(50);
if (millis() > Bot_lasttime + Bot_mtbs) {
// launch API GetUpdates up to xxx message
if (bot.getUpdates(bot.message[0][1]) == true) {
// Telegram is responding!
Serial.println("Bot connected!");
Bot_EchoMessages(); // respon als missatges
} else {
// Telegram is NOT responding!
Serial.println("Bot not connected...");
}
Bot_lasttime = millis();
}
if (! sgp.IAQmeasure()) {
Serial.println("Measurement failed");
return;
}
Serial.print("eCO2 ");
Serial.print(sgp.eCO2);
Serial.println(" ppm");
delay(100);
counter++;
if (counter == 30) {
counter = 0;
uint16_t TVOC_base, eCO2_base;
if (! sgp.getIAQBaseline(&eCO2_base, &TVOC_base)) {
Serial.println("Failed to get baseline readings");
return;
}
Serial.print("****Baseline values: eCO2: 0x"); Serial.print(eCO2_base, HEX);
Serial.print(" & TVOC: 0x"); Serial.println(TVOC_base, HEX);
}
if (sgp.eCO2 >=950){
String nivell= String(sgp.eCO2)+" ppm";
bot.sendMessage(chat_id, "GAS GAS GAS","");
delay(100);
bot.sendMessage(chat_id, "Nivell CO2: "+ nivell,"");
delay(100);
bot.sendMessage(chat_id, "/ALARMA ?","");
delay(100);
delay(6000);
}
}
// missatgeria del bot
void Bot_EchoMessages() {
for (int i = 1; i < bot.message[0][0].toInt() + 1; i++){
Serial.println(bot.message[i][5]);
Sender=bot.message[i][4];
// save the user message
String userMsg=bot.message[i][5];
userMsg.toLowerCase();
String userName=bot.message[i][2];
if (userMsg == "/help" or userMsg == "help") {
getHelp();
} else if (userMsg == "/co2" or userMsg == "co2") {
String nivell= String(sgp.eCO2)+" ppm";
String n1= "Nivell Adecuat: ";
String n2= "Nivell Alt: ";
String n3= "Nivell Excessiu: ";
if (sgp.eCO2 <=750){
bot.sendMessage(Sender,n1+nivell , "");
pixels.setPixelColor(0, pixels.Color(0,50 , 0));
pixels.show();
delay(1000);
pixels.setPixelColor(0, pixels.Color(0,0 , 0));
pixels.show();
}
if (900 >sgp.eCO2 && sgp.eCO2 > 750){
bot.sendMessage(Sender,n2+nivell , "");
pixels.setPixelColor(0, pixels.Color(150,90 , 0));
pixels.show();
delay(1000);
pixels.setPixelColor(0, pixels.Color(0,0 , 0));
pixels.show();
}
if (sgp.eCO2 >= 900){
bot.sendMessage(Sender,n3+nivell , "");
bot.sendMessage(Sender,"/ALARMA" , "");
delay(10000);
}
} else if (userMsg == "/alarma" or userMsg == "alarma") {
int x=0;
for (x = 0; x < 10; ++x) {
tone(3, 990, 250); // La durant 0,25 s
pixels.setPixelColor(0, pixels.Color(150,0 , 0));
pixels.show();
delay(600); // Espera mig segon
tone(3, 223); // Do
pixels.setPixelColor(0, pixels.Color(50,0 , 0));
pixels.show();
delay(600); // Durada 0,25 s
noTone(3); // Silenci
pixels.setPixelColor(0, pixels.Color(0,0 , 0));
pixels.show();
delay(10); // Espera mig segon
}
bot.sendMessage(Sender, "ALARMA donada", "");
} else if (userMsg == "hola") {
bot.sendMessage(Sender, "Hello there", "");
} else if (userMsg == "temp" or userMsg == "/temp") {
sensors_event_t event;
dht.temperature().getEvent(&event);
String Temp = String (event.temperature) + " °C";
bot.sendMessage(Sender, Temp, "");
} else if (userMsg == "hum" or userMsg == "/hum") {
sensors_event_t event;
dht.humidity().getEvent(&event);
String Hum = String (event.relative_humidity) + "%";
bot.sendMessage(Sender, Hum, "");
} else if (userMsg == "/inici" or userMsg == "inici" ) {
String yourName = "Hola "+ userName +"\n"; // saluda a l'usuari
String welcome = "Benvinguts al sistema GasDetect";
String salu2= yourName+welcome;
bot.sendMessage(Sender, salu2, "");
getHelp();
bot.sendMessage(Sender, "Have a nice day", "");
} else {
// comanda desconeguda
bot.sendMessage(Sender, "Has escrit:", "");
bot.sendMessage(Sender, bot.message[i][5], "");
// retorna la comanda no reconeguda i ofereix ajuda
bot.sendMessage(Sender, "Comanda no reconeguda /HELP","");
}
}
bot.message[0][0] = ""; // S'ha respost a tots els missatges, RESET
}
// llista comandes
void getHelp() {
bot.sendMessage(Sender, "/INICI Inicia el sistema;", "");
bot.sendMessage(Sender, "/HELP Mostra les comandes", "");
bot.sendMessage(Sender, "/CO2 Retorna l'últim nivell de Co2 (ppm)", "");
bot.sendMessage(Sender, "/ALARMA En cas de rebre l'alerta d'una l'ALARMA", "");
bot.sendMessage(Sender, "/TEMP Retorna la temperatura (°C)", "");
bot.sendMessage(Sender, "/HUM Retorna la humitat (%)", "");
}

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.