Contrôle Climatique Par Zones Intelligent avec MediaTek LinkIt™ Smart 7688
Composants et Fournitures
| Composant | Quantité |
|---|---|
| Espressif ESP8266 ESP-01 | 1 |
| Arduino Nano R3 | 1 |
| Microchip ATtiny85 | 1 |
| Capteur Température/Humidité DHT22 | 1 |
| Servomoteur Tower Pro MG996R | 1 |
Applications et Services en Ligne
- Arduino IDE
À Propos de ce Projet
L'Hiver Arrive
Avec notre premier enfant l'hiver dernier, nous avons acheté un radiateur électrique d'appoint pour chauffer la zone autour de bébé. En le déplaçant de pièce en pièce, nous pensions être efficaces. La facture d'électricité a doublé le mois suivant : il aurait été moins cher de chauffer toute la maison au gaz en continu.
Cet hiver, j'ai installé un thermostat WiFi pour allumer le chauffage depuis le canapé ou le lit. Plus pratique, mais on chauffe encore toute la maison alors qu'on restemostly dans une zone.
Travailler Plus Intelligemment
Les logs de mes capteurs de mouvement (éclairage) montrent un schéma clair : 4-5h en famille en bas après le travail, puis montée aux chambres vers 21h jusqu'au lendemain matin. Lundi-vendredi, c'est immuable (bébé de 10 mois, horaires stricts). Week-ends plus variables.
J'ai regardé les systèmes CVC multi-zones avec registres motorisés sans fil : matériel très cher, logiciel souvent bâclé (peu de support/mises à jour). J'ai déjà des sondes WiFi pour mes climatiseurs d'appoint et voulais utiliser des servos. Il me fallait juste des servos WiFi pour ouvrir/fermer les registres CVC... simple en théorie.
MediaTek LinkIt™ Smart 7688 Duo HDK
Le LinkIt Smart 7688 Duo HDK est un microprocesseur WiFi sous OpenWRT avec microcontrôleur Arduino-compatible intégré. Parfait : broches I/O pour capteurs/servos multiples + WiFi pour communiquer avec mes sondes existantes. OpenWRT avec uHTTPd permet d'héberger l'application web directement sur la carte : solution autonome complète.
Configuration du LinkIt Smart 7688 HDK
Première utilisation d'une carte WiFi intégrée, je m'attendais à une courbe d'apprentissage raide. Heureusement, configuration en 3 étapes :
- Alimentez le LinkIt, connectez-vous à son point d'accès WiFi depuis votre ordinateur
- Connectez-vous à l'interface web, configurez votre point d'accès WiFi
- Ajoutez la carte "LinkIt Smart 7688 Duo" dans l'Arduino IDE
C'est tout ! Sélectionnez la carte dans l'IDE : upload série classique ou upload WiFi (très pratique). Guides de démarrage et développeur disponibles.
Pour permettre au microcontrôleur d'utiliser le WiFi directement dans le sketch Arduino (ce qu'on fera), activez la compatibilité bibliothèque Arduino Yun via SSH :
Copiez-collez ces lignes :
uci set yunbridge.config.disabled='0'
uci commit
reboot
Client WiFi et Contrôleur Servo
Grâce à la compatibilité bibliothèque Yun Bridge et l'Arduino IDE, l'adaptation de code existant est aisée. Via la bibliothèque Bridge, le HDK interroge le serveur web embarqué pour la configuration des registres (étage, rez-de-chaussée, toute la maison) et actionne les deux servos. La vidéo montre ça sur Raspberry Pi 2, mais j'ai porté l'appli web sur le LinkIt pour plus d'efficacité (code inclus).
Mon appli web est en PHP. Installation via opkg (inclus dans OpenWRT) :
opkg update
opkg install php7 php7-cgi
Mise à jour /etc/config/uhttpd pour interpréter PHP :
list interpreter ".php=/usr/bin/php-cgi"
Redémarrage uHTTPd : /etc/init.d/uhttpd restart
Matériel
Le bras du servo est fixé directement sur le registre. J'ai fabriqué une équerre en aluminium pour maintenir le servo avec des entretoises inox. Il reste un peu de jeu, je rajouterai des colliers de serrage pour pérenniser.
Logiciel
Trois composants principaux :
- Sondes température dans la maison envoient périodiquement les relevés au serveur uHTTPd sur le LinkIt Smart 7688.
- Application Web sur le LinkIt affichant l'état et permettant reconfiguration manuelle des registres.
- Microcontrôleur du LinkIt contrôlant les registres pour diriger l'air chaud vers l'étage ou le rez-de-chaussée selon l'heure.
Les sondes : ATtiny85 ou Arduino Nano + DHT11/DHT22, envoient température/humidité au serveur web via ESP8266 en liaison série logicielle. J'ai un article complet sur ces sondes (phase II de mon projet climatiseur d'appoint - optionnel mais donne métriques pour affiner/automatiser).
Le LinkIt Smart 7688 HDK est dans les combles, connecté directement aux registres. Côté OpenWRT : tâche cron met à jour le fichier d'état des registres. Côté MCU (sketch Arduino) : lecture périodique de ce fichier et actionnement servos.
Pour vérifier/contrôler manuellement : petite appli web hébergée sur le LinkIt. Avec dyndns et redirection de port, accès/contrôle depuis l'extérieur.
Marges d'Amélioration
Déploiement rapide imposé par l'arrivée du froid → concessions :
- Matériel : impression 3D de supports servo sérieux (mes bricolages ont du jeu). Servos RC à engrenages plastique ne dureront pas des années → remplacement par servos plus gros à engrenages métal (pas envie de retourner dans les combles).
- Futur : servos WiFi supplémentaires sur registres de chaque pièce, tous connectés au même LinkIt.
- Sondes température : actuellement export CSV pour suivi/graphiques. J'aimerais démarrer le chauffage plus tôt si maison très froide, mais mon thermostat WiFi n'a pas d'API.
- Intégration domotique : ajustement registres basé sur occupation temps réel (capteurs mouvement) plutôt que purement horaire (surtout week-ends, emplois du temps variables).
Code
LinkIt Smart Duo WiFi Vent (C/C++)
Sketch utilisant bibliothèques Bridge et HTTP Client (Arduino Yun) pour interroger serveur web et ouvrir/fermer registres CVC.
/* Adapté de Sweep servo example by BARRAGAN <https://barraganstudio.com>
et Yun HTTP Client example by Tom Igoe <https://www.arduino.cc/en/Tutorial/HttpClient>
Tous deux domaine public.
Adapté pour HAI (Home Automation w/ Intelligence) par Buddy Crotty */
#include <Servo.h>
#include <Bridge.h>
#include <HttpClient.h>
Servo upservo; // Servo registre étage
Servo downservo; // Servo registre rez-de-chaussée
int uppos = 0, downpos = 0;
const char* host = "192.168.1.80"; // IP serveur domotique
int dopenangle = 80, dcloseangle = 0;
int uopenangle = 140, ucloseangle = 0;
void setup() {
upservo.attach(9); // Pin registre étage
downservo.attach(10); // Pin registre rez-de-chaussée
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
Bridge.begin();
digitalWrite(13, HIGH);
}
void wholehouse() {
if (downpos <= dcloseangle) {
for (downpos = dcloseangle; downpos <= dopenangle; downpos++) {
downservo.write(downpos); delay(20);
}
}
if (uppos <= uopenangle) {
for (uppos = ucloseangle; uppos <= uopenangle; uppos++) {
upservo.write(uppos); delay(20);
}
}
}
void downstairs() {
if (downpos <= dopenangle) {
for (downpos = dcloseangle; downpos <= dopenangle; downpos++) {
downservo.write(downpos); delay(20);
}
}
if (uppos >= ucloseangle) {
for (uppos = uopenangle; uppos >= ucloseangle; uppos--) {
upservo.write(uppos); delay(20);
}
}
}
void upstairs() {
if (uppos <= uopenangle) {
for (uppos = ucloseangle; uppos <= uopenangle; uppos++) {
upservo.write(uppos); delay(20);
}
}
if (downpos >= dcloseangle) {
for (downpos = dopenangle; downpos >= dcloseangle; downpos--) {
downservo.write(downpos); delay(20);
}
}
}
void loop() {
HttpClient client;
String cmd = "https://"; cmd += host; cmd += "/vent.txt";
client.get(cmd);
while (client.available()) {
int c = client.read();
if (c == '2') upstairs();
if (c == '1') downstairs();
if (c == '0') wholehouse();
}
delay(60000); // Vérification toutes les minutes
}
Sonde Température WiFi (C/C++)
Capteur température/humidité connecté. Envoie données vers serveur domotique central.
/* Adapté pour HAI par Buddy Crotty
Envoi via requêtes HTTP GET vers serveur HAI
Connectivité via liaison série logicielle vers ESP8266 déjà configuré sur votre WLAN
(Décommentez réglages WiFi pour réinitialiser SSID/mot de passe) */
const char* host = "192.168.1.80";
const char* devID = "downstairs"; // ID appareil (un mot, sans espaces/caractères spéciaux)
#include <SoftwareSerial.h>
SoftwareSerial ser(10, 11); // RX, TX pour ESP8266
long utime = 300000; // Intervalle mises à jour
// 900000 = 15 min (batterie/solaire)
// 300000 = 5 min (secteur)
// 5000 = 5 sec (test)
// Doit être > 10000 pour sortie veille ESP8266 (mode batterie)
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
ser.begin(9600);
/* // Décommenter pour reset WiFi
delay(1000);
ser.println("AT+CWMODE=1");
ser.println("AT+CWJAP=\"SSID\",\"Password\"");
*/
ser.println("AT+RST"); // Reset ESP8266
delay(10);
dht.begin();
Serial.println("Temps de chauffe...");
Serial.println("|-------------------------|");
Serial.print("|");
for (int x = 0; x < 25; x++) { Serial.print("#"); delay(1000); }
Serial.println("|"); Serial.println("Prêt");
}
void loop() {
Serial.println();
float t = dht.readTemperature(true); // Fahrenheit
int h = dht.readHumidity();
float hi = dht.computeHeatIndex(t, h);
Serial.print("Température: "); Serial.print(t); Serial.print(" *F\t");
Serial.print("Indice chaleur: "); Serial.print(hi); Serial.println(" *F");
Serial.print("Humidité: "); Serial.print(h); Serial.println("%\t");
Serial.print("...connexion à "); Serial.println(host);
// Connexion TCP
String cmd = "AT+CIPSTART=\"TCP\",\""; cmd += host; cmd += "\",80";
ser.println(cmd); delay(1000);
if (ser.find("Error")) { Serial.println("Erreur AT+CIPSTART"); return; }
// Requête GET
String getStr = "GET /tempupdate.php?ID=";
getStr += devID; getStr += "&field1="; getStr += t; // Temp
getStr += "&field2="; getStr += h; // Humidité
getStr += "&field3="; getStr += hi; // Indice chaleur
getStr += "\r\n\r\n";
Serial.print("URL envoi: "); Serial.println(getStr);
cmd = "AT+CIPSEND="; cmd += String(getStr.length());
ser.println(cmd);
if (ser.find(">")) {
ser.print(getStr); Serial.println("Succès !");
} else {
ser.println("AT+CIPCLOSE");
Serial.println("Échec connexion");
}
Serial.print("Prochaine mise à jour dans "); Serial.print(utime / 1000); Serial.println(" secondes");
delay(utime);
}
Vent.php (PHP)
Vérification état et surcharge manuelle configuration registres.
<html> <head> <style>
.myButton { /* Styles boutons volumineux tactiles */
box-shadow: 0px 10px 14px -7px #276873;
background: linear-gradient(to bottom, #599bb3 5%, #408c99 100%);
border-radius: 20px; display: inline-block; cursor: pointer;
color: #ffffff; font-family: Arial; font-size: 100px; font-weight: bold;
padding: 50px 200px; text-align: center; text-decoration: none;
text-shadow: 0px 5px 0px #3d768a;
}
.myButton:hover { background: linear-gradient(to bottom, #408c99 5%, #599bb3 100%); background-color: #408c99; }
.myButton:active { position: relative; top: 1px; }
</style>
<link rel="manifest" href="manifest.json"> </head> <body>
<div align="center">
<a href="vent.php?zone=2" class="myButton">Étage Seulement</a><br><br>
<a href="vent.php?zone=0" class="myButton">Toute la Maison</a><br><br>
<a href="vent.php?zone=1" class="myButton">Rez-de-chaussée Seulement</a>
<br><br>
<?php
$myfile = fopen("vent.txt", "r") or die("Impossible d'ouvrir le fichier !");
$status = fgets($myfile);
if ($status != "") print "<h1>Registres ouverts pour ";
if ($status === "0") print "Toute la Maison";
if ($status === "1") print "Rez-de-chaussée Seulement";
if ($status === "2") print "Étage Seulement";
print "<br>"; fclose($myfile);
if ($_GET["zone"] != "") {
$myfile = fopen("vent.txt", "w+") or die("Impossible d'ouvrir le fichier !");
print "<h1>Envoi commande ouverture registres pour ";
if ($_GET["zone"] === "0") print "Toute la Maison";
if ($_GET["zone"] === "1") print "Rez-de-chaussée Seulement";
if ($_GET["zone"] === "2") print "Étage Seulement";
print "</h1>";
fwrite($myfile, $_GET['zone']);
fclose($myfile);
}
?>
</div> </body> </html>
LinkIt Smart Vent Android WebApp (JSON Manifest)
Fichier manifest pour que Chrome sur Android ouvre le contrôleur comme application web.
{
"name": "LinkIt Smart Vent",
"icons": [
{ "src": "LinkIt_icon_36.png", "sizes": "36x36", "type": "image/png", "density": 0.75 },
{ "src": "LinkIt_icon_48.png", "sizes": "48x48", "type": "image/png", "density": 1.0 },
{ "src": "LinkIt_icon_128.png", "sizes": "128x128", "type": "image/png", "density": 1.0 },
{ "src": "LinkIt_icon_192.png", "sizes": "192x192", "type": "image/png", "density": 1.0 }
],
"start_url": "vent.php",
"display": "standalone",
"orientation": "portrait"
}
Schémas
ATtiny85 ou Arduino Nano lisant température via DHT11/22, connecté WiFi via ESP8266.
Processus de fabrication
- DATA MODUL Lance l'Affichage TFT 23,1″ Ultra-Fin avec Contrôle Wi-Fi Intelligent
- Système de contrôle d'accès intégré QR, RFID et vérification de température
- Élever le contrôle qualité : l'outillage 3D imprimé améliore la précision manufacturière
- Achats intelligents : fusionner l'IA et l'expertise humaine
- Construire une Tirelire Intelligente : Contrôler un Accepteur de Pièces avec Arduino Nano
- Télécommande TV Arduino Personnalisée – Alimentation Batterie, Boîtier Imprimé 3D
- Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
- GÖPEL optimise le contrôle qualité automobile avec le cobot UR10e d'Universal Robots
- Tour CNC Millport SmartLathez 1740 – Précision et puissance