Mets un ESP8266 dans ton frigo !

Suite à un incident avec le congélateur (porte mal refermée), ça fait un moment que je voulais mettre une sonde de température avec une alarme. Le Frigo est lui-même dôté d’une alarme, mais celle-ci n’indique pas correctement s’il y a eu un incident sur le maintient de la chaîne du froid.

J’ai un peu cherché des sondes « toutes faites » mais elles ne me semblaient pas très fiables notamment avec les piles qui doivent supporter des températures de l’ordre de -18°C.

Pourquoi ne pas créer son propre système ? J’ai un ESP8266 (WeMos) de disponible et quelques sondes DS18B20 étanches.

Je passe les sondes dans le compartiment congélation en passant par le passe câble en mousse de la sonde d’origine.

Idem pour la partie réfrigérateur. Là, il faut démonter un cache en plastique pour passer le capteur.

Le branchement des capteurs 1-Wire est extrêmement simple, il suffit des les connecter à la Masse (fil noir), au +3/3v (fil rouge) et le fil de données en D4 sur l’ESP8266. Il faut aussi placer une résistance de 4.7 kOhms entre le +3.3v et D4. Une petite recherche sur internet permet de trouver rapidement les schémas de branchement. Je me suis largement inspiré de cet article.

L’ESP est placé sur une carte perforée pour que ce soit plus « propre ».

Le tout est attaché dans un petit boitier plastique sur les grilles derrière le frigo. Ces grilles sont chaudes mais pas suffisamment pour perturber le fonctionnement de l’ESP, même en plein été.

Voilà pour la partie matériel. Maintenant, il s’agit de programmer l’ESP pour qu’il récupère les informations de température toutes les 30s et qu’il les transmette à mon serveur Domoticz.

Sur le raspberry qui héberge Domoticz, j’installe le serveur MQTT mosquitto. C’est lui qui recevra les messages de l’ESP et qui les transmettra à Domoticz.

sudo apt install mosquitto mosquitto-clients

Sur domoticz, il faut rajouter un matériel MQTT

Puis un périphérique virtuel correspondant au capteur de température (2 dans mon cas)

Quand le capteur est créé, on peut voir son ID dans la barre d’adresse du navigateur. Cet ID (2762 ici) est à noter, il sera utilisé dans le code de l’ESP.

Voici le code à compiler dans l’ESP. Vous aurez besoin de l’IDE arduino configuré pour accepter des cartes ESP8266, ainsi que des différentes librairies utilisées dans le code: PubSubClient, WifiManager, OneWire, DallasTemperature.

Il vous faudra adapter dans le code l’ip de domoticz, le port MQTT, les deux ID des capteurs dans domoticz et les adresses 1-Wire de vos 2 capteurs. Les adresses découvertes sur le BUS 1-wire sont affichée sur la console série au démarrage du module.

Pour la connexion réseau, j’utilise la librairie Wifi manager qui créé un réseau Wifi (AutoConnectAP) avec une interface web pour réaliser le paramétrage depuis votre téléphone. C’est simplissime !

#include <PubSubClient.h>
#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
//needed for library
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager
#include <OneWire.h>
#include <DallasTemperature.h>


#define ONE_WIRE_BUS D4
#define TEMPERATURE_PRECISION 10
byte i;
byte type_s;
byte data[12];
byte addr[8];
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
WiFiClient espClient;
PubSubClient client(espClient);


// Valeurs à adapter à votre configuration
const char* host = « 192.168.0.19 »;
const int port = 1883;
#define IDX_sensor1 2762
#define IDX_sensor2 2763
// Tableaux contenant l’adresse de chaque sonde OneWire | arrays to hold device addresses
DeviceAddress sensor1 = { 0x28, 0x4E, 0xCF, 0x80, 0x3A, 0x19, 0x1, 0x58 };
DeviceAddress sensor2 = { 0x28, 0xD7, 0x9A, 0x7B, 0x3A, 0x19, 0x1, 0xDD };


// Reconnexion au serveur MQTT
void reconnect() {
// Loop until we’re reconnected
while (!client.connected()) {
Serial.print(« Attempting MQTT connection… »);
// Create a random client ID
String clientId = « ESP8266Client-« ;
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println(« connected »);
// … and resubscribe
client.subscribe(« domoticz/in »);
} else {
Serial.print(« failed, rc= »);
Serial.print(client.state());
Serial.println( » try again in 5 seconds »);
// Wait 5 seconds before retrying
delay(5000);
}
}
}

// Liste les périphériques 1-Wire
void OneWireScanner() {
if ( !oneWire.search(addr)) {
Serial.println(« No more addresses. »);
Serial.println();
oneWire.reset_search();
return;
}

Serial.print(« ROM = « );
for ( i = 0; i < 8; i++) {
Serial.write(‘ ‘);
Serial.print(« 0x »);
Serial.print(addr[i], HEX);
if ( i != 7 ) {
Serial.print(« , « );
}
}

if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println(« CRC is not valid! »);
return;
}
Serial.println();

// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
Serial.println( » Chip = DS18S20″); // or old DS1820
type_s = 1;
break;
case 0x28:
Serial.println( » Chip = DS18B20″);
type_s = 0;
break;
case 0x22:
Serial.println( » Chip = DS1822″);
type_s = 0;
break;
default:
Serial.println(« Device is not a DS18x20 family device. »);
return;
}
}

// Envoie les températures via MQTT
void sendTemp(int IDX, DeviceAddress addr)
{
sensors.requestTemperatures();
float temp = sensors.getTempC(addr);
if (temp == -127.00) {
Serial.println(« Error getting temperature on id  » + String(IDX));
}
else
{
String msg = « { \ »idx\ » : » + String(IDX) + « , \ »nvalue\ » : 0, \ »svalue\ » : \ » » + String(temp) + « \ »} »;
char buf[msg.length() + 1];
msg.toCharArray(buf, msg.length() + 1);
Serial.println(temp);
Serial.println(msg);
Serial.println(buf);
client.publish(« domoticz/in », buf);
}

}


void setup() {
Serial.begin(115200);
// Connexion au Wifi
WiFiManager wifiManager;
wifiManager.autoConnect(« AutoConnectAP »);
Serial.println(« connected… 🙂 »);
client.setServer(host, 1883);

OneWireScanner();

sensors.begin();
// locate devices on the bus
Serial.print(« Locating devices… »);
Serial.print(« Found « );
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println( » devices. »);

// report parasite power requirements
Serial.print(« Parasite power is: « );
if (sensors.isParasitePowerMode()) Serial.println(« ON »);
else Serial.println(« OFF »);

// Vérifie sir les capteurs sont connectés | check and report if sensors are conneted
if (!sensors.getAddress(sensor1, 0)) Serial.println(« Unable to find address for Device 0 »);
if (!sensors.getAddress(sensor2, 1)) Serial.println(« Unable to find address for Device 1 »);

// set the resolution to 9 bit per device
sensors.setResolution(sensor1, TEMPERATURE_PRECISION);
sensors.setResolution(sensor2, TEMPERATURE_PRECISION);

// On vérifie que le capteur st correctement configuré | Check that ensor is correctly configured
Serial.print(« Device 0 Resolution: « );
Serial.print(sensors.getResolution(sensor1), DEC);
Serial.println();

Serial.print(« Device 1 Resolution: « );
Serial.print(sensors.getResolution(sensor2), DEC);
Serial.println();
}

void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
sendTemp(IDX_sensor1, sensor1);
sendTemp(IDX_sensor2, sensor2);
delay(30000);
}

Si tout fonctionne comme prévu, vous verrez vos capteurs se mettre à jour dans domoticz.

Un petit Blocky permet de gérer l’alarme:

Si la température dépasse -10°C je suis notifié sur mon téléphone. Et en plus de l’alarme, on dispose d’un suivi de la chaîne du froid.

Réduire une caméra IP Foscam FI9803P

J’ai acheté une caméra IP pour mettre à l’extérieur de la maison. Elle dispose d’une excellente définition et elle est étanche. Parfait. Bon par contre, je la trouve un peu trop imposante.

La caméra, mais ça c'était avant..
La caméra, mais ça c’était avant..

Au moment de l’installer, un problème se présente. Les câbles sortant de la caméra font environ 20cm. On se retrouve donc avec une prise de courant basse tension, une prise RJ45 et un bouton de reset qui pendouille derrière la caméra. Pour faire quelque chose de propre, il faudrait mettre un boitier électrique pour protéger la connectique. C’est nul 🙁

Une autre alternative, c’est d’ouvrir sa caméra pour voir ce que l’on peut faire pour rallonger les connecteurs.

Bye bye la garantie
Bye bye la garantie

 

Oh, tient c’est amusant, l’électronique tient dans la tête de la caméra, le reste, c’est … vide… Surement une astuce marketing pour faire croire que c’est un « gros » produit, pro ! Et bien moi je veux une petite caméra discrète avec des câbles plus longs pour traverser un mur.

Problème 1: Boitier trop gros

Solution 1: Scie à métaux

Coupez !
Coupez !

Ensuite on recolle les morceaux restant avec du mastic epoxy chargé de fibres, on ponce et on peint. J’ai conservé le fond de la caméra et les 22 premiers millimètres derrière la tête. Sacré cure d’amaigrissement !

La nouvelle boite mise en peinture
La nouvelle boite mise en peinture

 

Le reste est devenu inutile

ça ne sert à rien
ça ne sert à rien

 

Seules ces pièces sont utiles

 

Les restes
Les restes

 

On peint tout, même le pied de fixation

En peinture
En peinture

 

Ensuite on découpe et recolle l’ancienne fixation

Collage
Collage

Problème 2: La longueur des fils

Solution 2: 1m de câble RJ45, un peu de soudure et hop…

Rallonge ton câble
Rallonge ton câble

 

On remonte le tout pour tester. Tout est OK

On teste
On teste

 

 

Voilà, ma caméra est terminée. Elle n’est pas mimi ma mini foscam 🙂

L'ensemble
L’ensemble

 

Finie
Finie

 

Comme quoi un peu de DIY peut venir à bout de stupidités marketing. Hey Foscam ! au lieu de faire des gros boitiers inutiles, rallonge tes connecteurs…

Cordon coupé sur une alimentation de portable

Sur un portable récupéré récemment, le cordon de l’alimentation est coupé juste à la sortie du boitier. Juste un bout de cordon à raccourcir et 2 soudures à faire… Sauf que le boitier est collé et il n’est pas prévu pour être ouvert !

La Dremel vient à la rescousse pour ouvrir la boite à l’aide d’un disque de découpe. Il faut y aller doucement, il y a la carte électronique pas loin.

DREMEL
DREMEL

 

Environ 2mm de profondeur sont suffisants. Ensuite, un gros tournevis dans un coin pour faire levier et les derniers points d’attache cèdent.

Boitier ouvert
Boitier ouvert

C’est un peu barbare mais au moins le boitier est ouvert. Ensuite rien de compliqué, on dessoude le cordon, on le coupe de quelques centimètres et on ressoude.

Cordon remplacé
Cordon remplacé

 

Ensuite pour refermer la boite correctement ( il ne faudrait pas qu’elle s’ouvre lors d’une chute par exemple ) elle va être collée à l’époxy. Encore une utilisation possible de la colle Epoxy JB-WELD.

Collage
Collage

Une fois collée, les 2 parties sont maintenues en place par 3 presses en C, le temps du séchage qui peut prendre une bonne dizaine d’heures.

 

ça sèche
ça sèche

 

Une fois la colle sèche, l’excès d’Epoxy sera poncé.

Après ponçage
Après ponçage

Réparation de la carte vidéo d’un portable Samsung Q45

Après avoir rendu de bon et loyaux services pendant quelques années, j’ai un portable Q45 qui a une panne d’affichage vidéo des plus ennuyeuse: Pas de vidéo du tout ou alors un affichage rayé de lignes violettes.

Symptômes
Symptômes

 

Souvent dans ce cas, il s’agit d’une ou plusieurs soudures défectueuses sur le chipset vidéo. Malheureusement, ce sont des composants BGA dont les soudures sont sous le corps et non sur les côtés.

BGA Chipset
BGA Chipset

 

Elles sont donc inaccessibles aux fers à souder classiques ! Il faut utiliser des technique à air chaud pour arriver à réparer ce type de problème.

Ce type de composant contrairement à ce que l’on pourrait penser résiste bien aux hautes températures (250°C) à condition de bien respecter le cycle de chauffe.

Il faut comme indiqué sur wikipédia,   suivre une montée en température progressive avec un préchauffage autour de 150°C.

 

Cycle de chauffe
Cycle de chauffe

 

Dans la vidéo qui suit, j’ai utilisé une station de soudure aoyue 906+ ( Du matériel chinois mais suffisant pour l’amateur à un prix dérisoire… )

Station de soudure
Station de soudure

 

Pour le reste, du bon DIY avec un cache en papier d’aluminium pour protéger de la chaleur et du souffle de la buse les composants avoisinant. Un multimètre avec sonde de T° est aussi utilisé pour contrôler la montée en température.

Cache
Cache

 

L’opération #screensaver en vidéo

Et le résultat, pas si mal 🙂

Bingo !
Bingo !

Elle n'est pas belle ma Debian ?
Elle n’est pas belle ma Debian ?

 

L’opération qui au premier abord peut paraître compliquée est en réalité assez simple ! Et un portable qui va éviter la benne…