Ora aqui vai @Moacir_Ferreira
Componentes
-
D1 MINI (as versões clone são bastante mais baratas que o original da Lolin mas há algumas que não são boas e o Wemos fazem resets sozinhos devido ao regulador de tensão e precisam de um par de condensadores). Estes para já tem saido bons mas nunca se sabe
D1 MINI MICRO USB
-
dht11
DHT11 MODULE
-
dht22
DHT22 Module Black
-
Display 0.96" (deverá ser a versão I2C com 4 pinos)
0.96 4PIN Blue
-
Display 1.3" ( pode ser azuis, brancos amarelos etc)
4Pin-Blue
-
Caixas conjunts de 5 unidades ( o vendedor não tem atualmente mas irei procurar outro - posso dispensar duas para quem quiser)
Para o display 0.96" é a 70x35x17
e para o display 1.3" é a 80x40x18
Style 2
-
Diversos
10CM male to male
Reguas Pinos
Ligaçoes:
Terão ainda que des-soldar os pinos do dht pois estão do lado oposto e tambem substituir os do display pelos pinos em L. Não é preciso ser um PRO a soldar como o @nikito7 mas isto requer alguma experiencia e paciencia para nao danificar os componentes …
Notas:
O envio para o MQTT é de 60 em 60 segundos ( e nesse intervalo muda a informação do visormas pode ser modificado.
Estou neste momento na fase de calibração dos sensores (ajustando um offset e recalculando a humidae relativa). Mesmo a caixa senso bastante arejada e o sendor está do lado de fora desconfio que depois de montada está a inflacionar a tempertatura lida. Embora dê para fazer do lado do HA muito provavelment irei alterar do lado do FW para que o display mostre o mesmo que o HA.
Codigo C++
A parte que tem de alterar está no //USER CONFIGURED SECTION START//
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// DHT 11 or DHT22 Temperature Sensor to MQTT - Home Assistant
// OLED 1,3" SSH1106 and OLED 0.96" SSD1306 suported
// Joao Sousa 2022
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <PubSubClient.h>
#define scd_debug 0
#include "SSD1306Wire.h" // for SDD1306 (0.96" - 128x64)
//#include "SH1106Wire.h", legacy include: `#include "SH1106.h"` // 128x64
// Include the UI lib
#include "OLEDDisplayUi.h"
#include "DHT.h"
ADC_MODE(ADC_VCC);
// Initialize the OLED display using Wire library
#define DHTPIN D4 // what digital pin we're connected on Wemos D1 - this is on D4
SSD1306Wire display(0x3c, SDA, SCL); // ADDRESS, SDA, SCL - SDA and SCL usually populate automatically
//SH1106Wire display(0x3c, SDA, SCL);
OLEDDisplayUi ui ( &display );
//USER CONFIGURED SECTION START//
const char* ssid = "WI-FI_SSID";
const char* password = "WI-FI_Password";
const char* mqtt_server = "192.168.X.XXX";
const int mqtt_port = 1883;
const char *mqtt_user = "";
const char *mqtt_pass = "";
const char *mqtt_client_name = "WEMOSD1_PROD_1"; // Client connections can't have the same connection name
const char *mqtt_topic = "sensors/tempsensor2/statusjson";
//USER CONFIGURED SECTION END//
// Uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor.
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
// Variables
bool boot = true;
int status = WL_IDLE_STATUS;
int secs;
int mins;
int hrs;
int dys;
char mqttmsg[100];
String temp_str,hum_str,heatindex_str,bat_str,bat_str_v;
unsigned long msecs;
unsigned long prevmillis = 0;
//Functions
void setup_wifi()
{
WiFi.mode(WIFI_STA); // disable internal AP
Serial.println();
Serial.print("Connecting to ");
// Display
display.clear();
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0,0, "Connecting " + String(ssid));
display.drawString(0,10,"Please wait.......................");
display.display();
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
display.drawString(0,20,"WiFi is now connected!!!");
display.drawString(0,32, "IP addr: " + WiFi.localIP().toString());
display.drawString(0,43, "MAC: " + WiFi.macAddress());
display.drawString(0,54, "Get Sensor data.-.--.---.----.--");
display.display();
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("DHT 11 values:");
}
void getSensorValues()
{
delay(10000);
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
// float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
//Serial.print(f);
//Serial.print(" *F\t");
Serial.print("Heat Index: ");
Serial.print(hic);
Serial.println(" ºC");
//Serial.print(hif);
//Serial.println(" *F");
if ((h == 0.00) || (t == 0.00))
{
Serial.println("Sensor not conected or broken");
}
else
{
msecs = millis();
if (msecs - prevmillis > 0)
{
prevmillis = msecs;
}
else
{
prevmillis+= 60000;
}
secs = int((prevmillis / (1000)) % 60);
mins = int((prevmillis / (1000 * 60)) % 60);
hrs = int((prevmillis / (1000 * 60 * 60)) % 24);
dys = int((prevmillis / (1000 * 60 * 60 * 24)) % 365);
// Update temperature and humidity
temp_str = String(t);
// temp_str.toCharArray(temperature, temp_str.length() + 1);
hum_str = String(h);
// hum_str.toCharArray(humidity, hum_str.length() + 1);
heatindex_str = String (hic);
int bat_offset = 286; //239 Mini Pro 16 M
int battery_Voltage = ESP.getVcc() + bat_offset; // Power VCC
bat_str = String(battery_Voltage);
bat_str_v = bat_str.substring(0,1) + "." + bat_str.substring(1,4);
String mqttString = "{\"Temperatura\":\""+ temp_str + "\",\"Humidade\":\"" + hum_str + "\",\"Termica\":\"" + heatindex_str + "\",\"Power\":\"" + bat_str + "\",\"Uptime\":\"" + String(dys) + "d " + String(hrs) + "h " + String(mins) + "m " + String(secs) + "s\"}";
mqttString.toCharArray(mqttmsg, mqttString.length() + 1);
if (client.connect(mqtt_client_name, mqtt_user, mqtt_pass)) //
{
client.publish(mqtt_topic, mqttmsg,true);
}
}
display.clear();
display.setFont(ArialMT_Plain_16);
display.setTextAlignment(TEXT_ALIGN_RIGHT);
display.drawString(126,0, heatindex_str + " ºC");
display.drawString(126,48, hum_str + " %");
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_24);
display.drawString(10,20," " + temp_str + " ºC");
display.display();
delay(30000);
display.clear();
display.setFont(ArialMT_Plain_16);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0,0, "TEMP: " + temp_str + " ºC");
display.drawString(0,18, "HUMI: " + hum_str + " %");
display.drawString(0,36, "TERM: " + heatindex_str + " ºC");
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0,54,"P: " + bat_str_v + "V");
display.setTextAlignment(TEXT_ALIGN_RIGHT);
display.drawString(128,54, "UT: " + String(dys) + "d " + String(hrs) + "h " + String(mins) + "m");
display.display();
delay(20000);
}
void setup() {
Wire.begin();
Serial.begin(9600);
dht.begin();
delay(2000);
Serial.println("Booting");
// Display
ui.setTargetFPS(60);
ui.init();
display.flipScreenVertically(); // Turn the display upside down
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
getSensorValues();
}
E os sensores no Home Assistant:
# Temperature and Humididty Sensor MQTT Ground Floor
- name: "Sensacao Termica Piso 0"
unique_id: "termica_piso0"
state_topic: "sensors/tempsensor2/statusjson"
unit_of_measurement: "°C"
value_template: "{{value_json.Termica}}"
force_update: true
- name: "Temperatura Piso 0"
unique_id: "temperatura_piso0"
state_topic: "sensors/tempsensor2/statusjson"
unit_of_measurement: "°C"
value_template: "{{value_json.Temperatura}}" # Valor Numerico
force_update: true
- name: "Humidade Piso 0"
unique_id: "humidade_piso0"
state_topic: "sensors/tempsensor2/statusjson"
unit_of_measurement: "%"
value_template: "{{value_json.Humidade}}" # Valor Numerico
force_update: true
- name: "Power Sensor 2"
unique_id: "power_sensor2_piso0"
state_topic: "sensors/tempsensor2/statusjson"
unit_of_measurement: "mV"
value_template: "{{value_json.Power}}"
force_update: true
- name: "Sensor 2 Ativo Desde"
unique_id: "sensor2_ativo_desde"
state_topic: "sensors/tempsensor2/statusjson"
value_template: "{{value_json['Uptime']}}"
force_update: true
Ja coloco num proximo comentario as intruções de como usar o SDK do arduino.