Guide mis à jour le 27 mars 2022
Nous avons vu dans un précédent guide du domo-lab comment mettre en place un serveur MQTT sur un Raspberry Pi pour collecter de nombreuses informations domotiques efficacement et rapidement issues de vos périphériques domotique do it yourself.
Parmi les nombreux guides DIY du blog, nous avons également vu comment réaliser une sonde de température de piscine depuis une sonde Oregon modifiée avec une sonde étanche. Aujourd’hui, je vous propose un nouveau guide afin de fabriquer une nouvelle sonde de température pour la piscine, plus performante, à l’aide d’un nodemcu et MQTT.
Domotique budget : Fabriquer une sonde de température de piscine connectée performante à moindre coût
Relever la température de l’eau de la piscine vers le système domotique, au delà du côté pratique qui permet d’avoir connaissance de cette température sans avoir besoin de mettre la main dedans, est un passage obligatoire pour domotiser les différentes…
Le node MCU dispose d’une connexion Wifi ce qui en fait un excellent support pour une problématique de portée par exemple. Avec ce module contrairement à la sonde oregon, ce n’est plus la portée de réception du RFXCom qui importe, étant donné que le node MCU utilise le réseau wifi de la maison, la portée est étendue à toute la maison et même une grande partie de l’extérieur si votre réseau wifi est correctement dimensionné. C’est mon cas, j’ai donc une portée wifi qui couvre largement la piscine et ses abords. C’est donc parfait pour ce nouveau projet.
La liste des composants
Pour fabriquer cette sonde nous aurons besoin de quelques composants et un peu de matériel.
Le schéma de câblage
le câblage est assez simple à réaliser. La sonde de température étanche étant pré-cablée, il n’y a qu’à souder les fils sur les PIN du nodeMCU et ajouter la résistance de 4,7Kohms entre le fil data et le fil d’alimentation.
Le code du programme
Le code n’est pas plus compliqué. Il faudra au préalable ajouter les différentes bibliothèques au programme Arduino et c’est parti. Pensez naturellement à modifier les différentes variables avec vos informations concernant le SSID wifi et son password ou encore l’adresse du serveur MQTT.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Streaming.h>
#define SLEEP_DELAY_IN_SECONDS 30
#define ONE_WIRE_BUS D4 // DS18B20 data
const char* ssid = "IoTNet"; // Nom du wifi
const char* password = "password"; // Mot de passe wifi
const char* mqtt_server = "192.168.1.114"; // Adresse IP du brovker MQTT
const char* mqtt_username = ""; // User MQTT
const char* mqtt_password = ""; // Password MQTT
const char* mqtt_topic = "temp"; // Nom du topic MQTT
WiFiClient espClient;
PubSubClient client(espClient);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
char temperatureString[6];
void setup() {
// setup serial port
Serial.begin(115200);
// setup WiFi
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
// setup OneWire bus
DS18B20.begin();
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP8266Client", mqtt_username, mqtt_password)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
float getTemperature() {
Serial << "Requesting DS18B20 temperature..." << endl;
float temp;
do {
DS18B20.requestTemperatures();
temp = DS18B20.getTempCByIndex(0);
delay(100);
} while (temp == 85.0 || temp == (-127.0));
return temp;
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
float temperature = getTemperature();
// convert temperature to a string with two digits before the comma and 2 digits for precision
dtostrf(temperature, 2, 2, temperatureString);
// send temperature to the serial console
Serial << "Sending temperature: " << temperatureString << endl;
// send temperature to the MQTT topic
client.publish(mqtt_topic, temperatureString);
}
// #### OPTIONS ####
//Serial << "Closing MQTT connection..." << endl;
//client.disconnect();
//Serial << "Closing WiFi connection..." << endl;
//WiFi.disconnect();
//delay(100);
//Serial << "Entering deep sleep mode for " << 60 << " seconds..." << endl;
//ESP.deepSleep(30 * 1000000);
delay(600000);
Une fois le programme poussé dans le nodmcu, vous pouvez au besoin faire un test avec le moniteur série, ou simplement passer à l’installation de la sonde.
La configuration de Jeedom
Coté Jeedom, il faudra installer un plugin MQTT si ce n’est pas encore fait. jMQTT est un excellent plugin gratuit et très intuitif. Vos devices seront par exemple automatiquement détectés et ajoutés.
Personnalisez donc la nouvelle sonde qui apparaît dans le plugin jMQTT.
Du côté de la commande, ajustez les paramètres comme ci-dessous.
Résultat
Voilà une sonde de température très peu coûteuse mais très performante. Le wifi permet une portée bien supérieure aux différents autres protocoles, ce qui permet de suivre la température d’un local éloigné ou encore une serre au fond du jardin ou l’eau d’une piscine comme ici.
Notez que j’ai configuré ma sonde pour poster la température toutes les 10 minutes. Ce paramètre peut parfaitement être ajusté si vous envisagez une alimentation sur batterie par exemple. J’ai laissé en commentaire les paramètres de sleep mode, si toutefois vous envisagez un module sur accus, je vous conseille vivement de l’utiliser pour prolonger la vie de vos accus.
Pour ceux qui ne connaissent pas, le sleep mode permet de passer le node mcu en veille profonde pendant un certain temps, le réveiller régulièrement pour jouer son programme, envoyer la température dans MQTT, puis retomber en sommeil profond.
De mon coté, j’ai une alimentation dans le poolhouse, c’est pourquoi j’applique un relevé plus fréquent de la température.
Si vous envisagez de vous lancer dans ce projet DIY et très peu couteux, vous aurez sans doute besoin de créer un serveur MQTT personnel. Sachez que c’est tout à fait possible sur un Raspberry Pi et nous avons même un guide pour vous accompagner.
Comment installer MQTT sur Raspberry Pi avec Mosquitto
MQTT est un protocole hyper léger et donc tout aussi rapide qui révolutionne le monde des objets connectés. On entend de plus en plus parler de MQTT ici et là. Pourtant le protocole n’est pas nouveau. Créé en 1999 par…
Add Comment