Sensor de Temperatura e Humidade DIY barato fiável e com integração MQTT

Boas pessoal,

Partilho este sensor de temperatura algo que estava a trabalhar há algum tempo e que irei colocar em alguns locais da casa como complemento aos dos aparelhos de climatizaçao (piso radiante, ar condicionado e recuperador a pellets) e que é para usar em automações de forma a regular o funcionamento da climatizaçao.
Este sensor usa os seguintes componentes

  • wemos d1 clone
  • dht11 (ou dht22)
  • ssd1306 de 0.96” 128 x 64 (ou em alternativa ssh1106 display de 1,3” também I2C)

Os componentes com a caixa ficam por 6 a 7 €
O firmware foi escrito em C/C++ usando o SDK do Arduino mas também pode ser feito com o ESPHome.
Resultado final:

No Home Assistant:

A sensação térmica tem um erro nas unidades :nerd_face: que entretanto já corrigi.

Interior:

imagem

Se acaso alguém estiver interessado posso partilhar o ficheiro .ino em que apenas é necessário configurar o SSID e password e o tópico mqtt. O código tem já o HW alternativo que caso for usado será apenas necessário remover os comentários dessas linhas.

5 Curtiram

Granda fezada! Eu necessito de uns 5 destes aqui em casa e estava relutante em comprar Shelly…

Partilha onde comprar os itens (caixa, vemos e display). Mais ainda, como carregar o firmware e o código C++.

Obrigado!

Estou interessado no .ino. Obrigado

Reduz as decimais, evita a base de dados crescer exponencialmente.

Boa dica. Dá para fazer isso quer no HA quer no codigo. Tenho o recorder 10 dias e a BD do HA tem 1,5 GB. No caso da influx DB com um cerca de 1 ano vai em 11 GB.

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 :slight_smile:
    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:

  • sensor dht:
    alimenta com 3.3V (VDD) + GND
    pin “out” (do meio) vai ao D4 (do wemos)

  • display
    alimenta com 5V(VDD) + GND
    pin “SCK” vai ao D1 (do wemos)
    pin “SDA” vai ao D2 (do wemos)

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.

1 Curtiu

@sslopes ja tens o ino partilhado
@Moacir_Ferreira

Download do Arduino IDE

Dowload do CH340 Driver
https://www.wemos.cc/en/latest/ch340_driver.html

Encontras is facilmente na net:

Install the Arduino Software

a) Please install the Arduino Software on your computer. Please do not use the web version but download and install the version for Linux, Mac, or Windows. We use this software to transfer the code to the microprocessor (and make adjustments to the code).

b) Enable the ESP8266 board (Wemos D1 Mini). You need to enable the D1 mini board in the Arduino IDE by following these steps:

  • Start Arduino and open the Preferences window.
  • Enter http://arduino.esp8266.com/stable/package_esp8266com_index.json into Additional Board Manager URLs field.
  • Open Boards Manager from Tools > Board menu and find the ESP8266 platform.
  • Select the latest version you need from a drop-down box.
  • Click the install button.

Depois terás que ir ao Manage Libaries under tools e adicionar as seguintes librarias:

DHT sensor library
ESP8266 and ESP32 OLED driver for SSD1306 displays

Se faltar alguma porque me esqueci… vais ter um erro a compilar!

Quando ligares o wemos ao PC com o cabo USB terás que escolher a porta que está a ser usada:

Depois escolhes o tipo de board aqui:

E finalmente depois de o compile resultar sem qualquer erro fazes o upload assim:

E está pronto!

1 Curtiu

Para vos aguçar o apetite estou também a terminar um outro modelo que para além da temperatura e humidade tam mede o CO2 usando um dos mais fiáveis componentes do mercado o SCD30 embora um pouco dispendioso

imagem
imagem

E assim no HA

Oportunamente abrirei um tópico com este modelo assim que estiver montado e calibrado.

Algum motivo para usares arduino?

Só sei soldar pins. Des-soldar é para esquecer😆

Edit:

Like a Pro

20220102_160851

1 Curtiu

Olha a principal razão para usar arduiino é que (ainda) estou muito mais à vontade com C/C++ que aprendi há 30 anos no ISEL do que com ESPHome (embora tenha os controladores da relva e a câmara do deposito dos pellets feito por mim em ESPHome) e depois tenho várias coisas destas como a monitorização dos Paineis Solares de AQS com 3 sensores de temperatura (Dd18b20) ,e tambem um hardware que inventei usando o ESP-01 com uma bateria de 3.7V que me diz se a portas (casa, garagem e cozinha) estão fechadas à chave ou apenas no trinco, e de que lado (dentro ou fora) foram trancadas a ultima vez e com essa informação por exemplo ativo o Alarme Total quando é fechada por fora e o Parcial quando é fechada por dentro. Claro que por motivos de segurança não desarmo o alarme quando são destrancadas…

ESPHome com ESP32 + Ds18b20?

Sim.

Chegou a ter PCB. Com alguns bugs.

Na altura nem reparei que havia 2 oleds semelhantes.

Screenshot_20221123-013656_VNC Viewer

1 Curtiu

Estas são as minhas dos outros projetos que referi:

image

E noutro formato por causa das caixas…
image

1 Curtiu

Coisas com pins wemos/esp01 fica barato.

Pcb já com esp soldado nem por isso.

No meu caso fazer 5 pcb e só usar 1. Por 10€ foi aceitável :laughing:

Isto tudo para nao comprar uma impressora 3D.

E continuo a precisar de uma. :laughing:


Quanto a temp/humidade uso os xiaomi ble. Devido a isso nunca usei os DHT. A durabilidade também é questionável.

Isso ficava mesmo bem com uma caixa impressa em 3D…

2 Curtiram

Pois ficava mas eu não tenho :relieved:


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade