L’idée ici est de programmer un client https qui enverra ses données toutes les … minutes sur le testcloud linuxtarn.
Cet article est de type “découverte”, les codes sont largement perfectibles , mais c’est bien pour débuter et comprendre ce que l’on fait !! Pour les pros, passez votre chemin, ici on débute .
Ces exemples sont fonctionnels, vous pouvez les tester avec vos configs personnelles. Si toutes fois vous préférez tester sur notre serveur , il les codes d’accès sont ici, par contre il faut être membre de l’asso.
Le principe de fonctionnement
Une fois alimenté, l’esp récupère les données du capteur puis les envoie sur le cloud LinuxTarn en passant par la box du home sweethome
Le montage
branchements pour le le BMP085 sur le node mmCU ESP8266
VCC BMP085 sur le 3.3V (pas le 5.0V!)
GND
SCL sur D1
SDA sur D2
le code pour l’ESP : (la partie fingerprint est à reprendre )
//Client pour cloud linuxtarn #include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> #include <WiFiClientSecure.h> #include <Wire.h> #include <Adafruit_BMP085.h> ESP8266WiFiMulti WiFiMulti; Adafruit_BMP085 bmp; //les trois lignes ci-dessous sont à compléter les deux premieres sont pour le wifi const char* SSID = ""; const char* PASSWORD = ""; //celle la c'est une protection rapide const char* code= ""; //des variables que l'on utilisera plus tard float temperature = 22.0; float pression = 1.0; float altitude = 1.0; void setup() { Serial.begin(115200); delay(10); // On se connecte au resau wifi (box locale ?) WiFiMulti.addAP(SSID, PASSWORD); Serial.println(); Serial.println(); Serial.print("Wait for WiFi... "); while(WiFiMulti.run() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WiFi connected"); //on indique l'adresse ip Serial.println("IP address: "); Serial.println(WiFi.localIP()); delay(500); //on vérifie la présence du bmp Wire.begin(4, 5); if (!bmp.begin()) { Serial.println("Pas de capteur de type BMP085 !"); while (1) {} } } void loop() { const uint16_t port = 443; const char * host = "blog.linuxtarn.org"; // ip or dns //visibement la clef //En fait ne sert à rien cette partie est à reprendre const char* fingerprint ="78 B9 8F 52 19 39 25 65 3F A8 E0 1A DD F1 E9 10 2 6D B4 CB"; Serial.print("connecting to "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClientSecure client; if (!client.connect(host, port)) { Serial.println("connection failed"); Serial.println("wait 5 sec..."); delay(5000); return; } if (client.verify(fingerprint, host)) { Serial.println("certificate matches"); } else { Serial.println("certificate doesn't match"); } //lecture des donnees temperature = bmp.readTemperature(); pression = bmp.readPressure(); altitude = bmp.readAltitude(); //préparation de la requete de type string (chaine de caractères) String url = "/testcloud/recupdonnees.php"; url += "?code="; url+= code; url += "&temp="; url += temperature; url += "&press="; url += pression; url += "&alt="; url += altitude; // This will send the request to the server Serial.print("Requesting URL: "); Serial.println(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { Serial.println(">>> Client Timeout !"); client.stop(); return; } } // Read all the lines of the reply from server and print them to Serial while (client.available()) { String line = client.readStringUntil('\r'); Serial.print(line); } Serial.println("closing connection"); client.stop(); Serial.println("wait 5 sec..."); delay(50000); }
Pensez bien à compléter les trois lignes :
SSID de votre Wifi
Passe de votre Wifi
Code pour pouvoir enregistrer les données dans notre Cloud (largement tiré des exemples livrés avec l’ESP)
Côté Cloud
La connexion à la base de données , le fichier connect.php :
<?php $VALEUR_hote='localhost'; $VALEUR_port='3306'; $VALEUR_nom_bd='testiot'; $VALEUR_user='testiot'; $VALEUR_mot_de_passe='******'; $connexion = new PDO('mysql:host='.$VALEUR_hote.';port='.$VALEUR_port.';dbname='.$VALEUR_nom_bd, $VALEUR_user, $VALEUR_mot_de_passe); ?>
La récupération des données via l’URL (données envoyées par l’ESP)
<?php require("connect.php"); //on vefirie le code $code = "***********"; //une securisation tres sommaire //on vérifie que le bon code est envoyé if(isset($_GET['code']) and $_GET['code'] == $code ){ //on détermine le jour, le mois, l'année $jourdetail = explode(',',date("j, n, Y")); $ajout = $connexion->prepare("INSERT mesures (temperature,pression,altitude,jour,mois,annee) VALUES (?,?,?,".$jourdetail[0].",".$jourdetail[1].",".$jourdetail[2].")"); $ajout->execute(Array($_GET['temp'],$_GET['press'],$_GET['alt'])); } ?>
mesfonctions.php :
<?php
#cette fonction releve les last temperature de la base la table $latable
#si last n’est pas indique par l’utilisateur, il affiche la dernière
function giveTemp($con,$latable,$last=0) {
$compteur = 0; //compteur pour laffichage, nec essaire seulement si last est indiqué
$temp = $con->prepare(“SELECT * FROM `”.$latable.”` ORDER BY date DESC”);
$temp->execute();
while($ligne = $temp->fetch()){
//print_r($ligne);
if($last ==0 || $compteur < $last) // si last =0 affiche tout sinon afficher le nb)
echo $ligne[‘temperature’].” “.$ligne[‘altitude’].” “.$ligne[‘pression’].” “.$ligne[‘jour’].” “;
$compteur++;
echo “<br />”;
}
}
?>
La page cloud.php :
<?php require("connect.php"); require("mesfonctions.php"); ?> <!DOCTYPE html> <html lang="fr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="stylesheet" type="text/css" href="../components/bootstrap-4.0.0/dist/css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="css/monstyle.css"> <title>Structure de la page</title> </head> <body> <div class="container"> Salut man, bienvenue dans le cloud !<br /> <?php giveTemp($connexion,'mesures',4); ?> </div> <script src="../components/jquery-3.3.1/jquery-3.3.1.min.js" type="application/javascript"></script> <script src="../components/popper/popper.min.js" type="application/javascript"></script> <script src="../components/bootstrap-4.0.0/dist/js/bootstrap.min.js" type="application/javascript"></script> <script src="./scripts/script.js"></script> </body> </html>