#ifdef ESP8266
#include <ESP8266WiFi.h> /* WiFi library for ESP8266 */
#else
#include <WiFi.h> /* WiFi library for ESP32 */
#endif
#include <PubSubClient.h>
//#include <Adafruit_AHTX0.h> //Biblioteca para o AHT21
#include <DHTesp.h>//DHT 22
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int DHT_PIN = 15; //Usando o DHT22
DHTesp dht; //Variável do sensor
//Adafruit_AHTX0 aht; // Cria um objeto para o sensor AHT21
/*
const char* ssid = "WHOUSE";
const char* password = "weloveguto";
const char* mqtt_server = "192.168.5.131";
*/
/*
const char* ssid = "WEDO";
const char* password = "w3d0conw1f1";
const char* mqtt_server = "192.168.0.14";
*/
const char* ssid = "wokwi -GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
#define humidity_topic "sensor/AHT21B/humidity"
#define temperature_celsius_topic "sensor/AHT21B/temperature_celsius"
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
setup_display();
setup_AHTX();
setup_wifi();
client.setServer(mqtt_server, 1883);
}
//Inicializa o display
void setup_display() {
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
}
Serial.println("Display ok!!");
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
}
//Inicializa o sensor de ambiente esterno
void setup_AHTX() {
display.clearDisplay();
display.setCursor(0, 0);
Serial.println("Looking for AHT20 sensor!");
display.print("AHT20 sensor: ");
display.display();
delay(1000);
if (!aht.begin()) {
Serial.println("Could not find AHT? Check wiring!");
display.println("Fail!");
display.display();
while (1) delay(10);
}
Serial.println("AHT20 found!");
display.println("Ok!");
display.display();
delay(2000);
}
//Inicializa o WiFi
void setup_wifi() {
delay(10);
display.clearDisplay();
display.setCursor(0, 0);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
display.print("Connecting to ");
display.println(ssid);
display.display();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
display.print(".");
display.display();
}
Serial.println("");
Serial.println("WiFi connected");
display.clearDisplay();
display.setCursor(0, 0);
display.println("WiFi connected");
display.display();
Serial.println("IP addres: ");
Serial.println(WiFi.localIP());
delay(2000);
}
//Renexão com o broker MQTT
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
display.setCursor(0, 0);
Serial.println("Attempting MQTT connection...");
display.print("Attempting MQTT connection...");
display.display();
delay(2000);
display.clearDisplay();
display.setCursor(0, 0);
if (client.connect("ESP8266Client")) {
Serial.println("Connected to broker");
display.print("Connected to broker");
display.display();
delay(2000);
display.clearDisplay();
} else {
Serial.print("Failed, rc= ");
display.print("Failed, rc= ");
Serial.print(client.state());
display.print(client.state());
Serial.println(" try again in 5 seconds");
display.println(" try again in 5 seconds");
display.display();
delay(5000);
display.clearDisplay();
}
}
}
void loop() {
//Checa se a conexão com o broker persiste
if (!client.connected()) {
display.clearDisplay();
reconnect();
}
client.loop();
// Wait a few seconds between measurements.
delay(2000);
sensors_event_t h, t;
aht.getEvent(&h, &t); // populate temp and humidity objects with fresh data
// Check if any reads failed and exit early (to try again).
if (isnan(h.relative_humidity) || isnan(t.temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Exibe o SSID e o endereço IP
display.clearDisplay();
display.setCursor(0, 0);
display.print("SSID: ");
display.println(WiFi.SSID());
display.print("IP: ");
display.println(WiFi.localIP());
//Dados captados pelo sensor externo
Serial.print("Humidity: ");
display.print("Humidade: ");
Serial.print(h.relative_humidity);
display.print(h.relative_humidity);
Serial.println("%\t");
display.println("%");
Serial.print("Temperature: ");
display.print("Temperature: ");
Serial.print(t.temperature);
display.print(t.temperature);
Serial.println("ºC ");
display.println("C");
client.publish(temperature_celsius_topic, String(t.temperature).c_str(), true);
client.publish(humidity_topic, String(h.relative_humidity).c_str(), true);
display.display();
}