#ifdef ARDUINO_ARCH_ESP32 //Uso librerie diverse per esp32 o esp8266
#include <WiFi.h>
#include<WebServer.h>
WebServer server(80);
#else
#include <ESP8266WiFi.h>
#include<WiFiClient.h>
#include<ESP8266WebServer.h>
#include<ESP8266mDNS.h>
ESP8266WebServer server(80);
#endif
//#include "DHTesp.h"
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "secrets.h"
#include <ThingSpeak.h>
//#include "secret.h"
#define DHTPIN 2 //pin a cui è collegato il sensore
#define DHTTYPE DHT22 //definisce il tipo di sensore
DHT dht(DHTPIN, DHTTYPE); //Istanza della classe DHT
float t, h; //Sono le variabili per temperatura e umidità
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2); //Definizione oggetto per la gestione del display
//Costruttore di classe
//ESP8266WebServer serverESP8266(80);
//WebServer serverESP32(80);
WiFiClient client;
void setup() {
dht.begin(); //Avvia la comunicazione col sensore
Serial.begin(115200);
Serial.println("setup");
ThingSpeak.begin(client);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Connecting to ");
LCD.setCursor(0, 1);
LCD.print("WiFi ");
WiFi.mode(WIFI_STA); //Stabilisce la connessione
WiFi.begin(ssid, pass); //Accesso alla rete
while(WiFi.status() != WL_CONNECTED) {
delay(500);
spinner();
}
Serial.println();
Serial.println(WiFi.localIP());
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Online");
LCD.setCursor(0, 1);
LCD.println("Updating values");
MDNS.begin("dht22"); //potremo raggiungere il server all’indirizzo http://dht22.local/
server.on("/", sendTemp); //chiamata alla funzione "sendTemp"
server.begin(); //avvia il server
}
void loop() {
h = dht.readHumidity(); //Legge il valore di umidità e lo assegna ad h
t = dht.readTemperature(); //Legge il valore di temperatura e lo assegna a t
server.handleClient(); //Questo metodo controlla periodicamente se ci sono richieste dai client
MDNS.update(); //Aggiorna il nome del server
//Se vogliamo leggere i dati anche sulla seriale
//TempAndHumidity data = dht.getTempAndHumidity();
//Serial.println("Temp: " + String(data.temperature, 2) + "°C");
//Serial.println("Humidity: " + String(data.humidity, 1) + "%");
//TempAndHumidity data = dht.getTempAndHumidity();
LCD.clear();
String temperature = writeValue(1,t);
Serial.println("Temp: " + temperature + "°C");
LCD.setCursor(0,0);
LCD.println("Temp: " + temperature + "^C");
String humidity = writeValue(2,h);
Serial.println("Humidity: " + humidity + "%");
LCD.setCursor(0,1);
LCD.println("Humidity: " + humidity + "%");
ThingSpeak.writeFields(chID,WriteAPIKey);
Serial.println("---");
delay(1000);
}
//Funzione che invia i dati al client
/*
*Ad esempio:
*Temperatura 25.90 gradi
*Umidità 34.20%
*/
void sendTemp()
{
String page=""; //Qui concateniamo i dati da inviare al client per la visualizzazione
page += "Temperatura"; //+= esegue la concatenazione tra le stringhe
page += String(t, 2); //Istanza della classe Stirng() che ritorna la stringa di t con 2 decimali
page += "gradi";
page += "\n"; //A capo
page += "Umidità";
page += String(h, 2); //Istanza della classe Stirng() che ritorna la stringa di h con 2 decimali
page += "%";
server.send(200, "text/plain", page); //Invia la risposta al client con la stinga page
}
void spinner() {
static int8_t counter = 0;
const char* glyphs = "\xa1\xa5\xdb";
LCD.setCursor(15, 1);
LCD.print(glyphs[counter++]);
if (counter == strlen(glyphs)) {
counter = 0;
}
}
String writeValue(unsigned int field, float value) {
int x = ThingSpeak.setField(field,value); //raises exception
if(x==200){
return String(value, 2);
}
else {
return "N/A";
}
}