MeteoPi

Thermomètre Wifi

Matériel

1- NodeMCU Lua Lolin V3 Module ESP8266 (ESP-12E) 7,50 Euros
2- Sonde DS18B20 Chez GOTRONIC
3- Sonde DHT22 (Température et Humidité)

Branchements DS18B20

Le capteur est branché en D4,3V et Ground

Programme DS18B20

Lolin.ino
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Paramètres WIFI
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
const char* ssid     = "Votre SSID";
const char* password = "Passe Phrase";
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Serveurs
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
WiFiClient client;
const char* dest = "Adresse IP de destination";
const char* name = "Lolin-01";       // pour identifier l' expéditeur
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Timers  et variables
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
unsigned long CurrentMillis  = 0;       // Millisseconde courante
unsigned long NextMillis  = 0;          // Millisseconde courante
// on défini un interval de 30 secondes pour envoyer les données au serveur
#define INTERVAL 30000 ;
char sondes[] = "DS18B20";
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// DS18B20
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#define ONE_WIRE_BUS D4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// SETUP
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void setup()
{
  Serial.begin(115200);
  delay(10);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  // on affiche l'adresse IP qui nous a ete attribuee
  Serial.println("");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  if (client.connect(dest, 80))
  {
    client.print("GET /wemos/start.php?IP="); // à modifier en fonction de votre installation
    client.print(WiFi.localIP());
    client.print("&Nom=");
    client.print(name);
    client.println(" HTTP/1.0");
    client.println();
    client.stop();
  }
  /* Configure the sensor */
  DS18B20.begin();
  NextMillis = millis();
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Boucle principale
// Cette boucle s'exécute à l'infini
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void loop()
{
  CurrentMillis = millis() ;
  if (CurrentMillis > NextMillis)
  {
    float temperature = getTemperature();
    Serial.println(temperature);
    if (client.connect(dest, 80))
    {
      client.print("GET /wemos/logs.php?Tmp="); // à modifier 
      client.print(temperature);
      client.print("&Nom=");
      client.print(name);
      client.println(" HTTP/1.0");
      client.println();
      client.stop();
    }
    NextMillis = CurrentMillis + INTERVAL ;
  }
}
 
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
float getTemperature() {
  float temp;
  do {
    DS18B20.requestTemperatures(); 
    temp = DS18B20.getTempCByIndex(0);
    delay(100);
  } while (temp == 85.0 || temp == (-127.0));
  return temp;
}

Branchements DHT22

Le capteur est branché en D4,3V et Ground (Comme pour le DS18B20 pour plus de facilité)

Programme DHT22

dht22.ino
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WebServer.h>
#include "DHT.h"
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Personnalisation de la sonde
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
String dest = "http://xx.xx.xx.xx"; // adresse IP du serveur qui recueille les données
const char* host = "Nom de la sonde";
char script[] = "DHT22-1.071";
char sondes[] = "DHT22";
char Titre[] = "Lieu";
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Paramètres WIFI
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
const char* ssid1     = "SSID 1";
const char* psk1 = "Phrase 1";
const char* ssid2     = "SSID 2";
const char* psk2 = "Phrase 2";
HTTPClient http;
ESP8266WebServer server ( 80 );
ESP8266WiFiMulti wifiMulti;
// les 3 lignes suivantes si vous désirez une adresse IP Fixe
IPAddress gateway(192, 168, 1, 254); 	// gateway FREEBOX
IPAddress subnet(255, 255, 255, 0); 	// Masque de réseau
IPAddress ip(192, 168, 1, XX); 			// xx pour l' adresse  statique désirèe
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Configuration DHT 
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#define DHTPIN D4       // Pin D4 du NodeCMU on peu aussi utiliser le D2
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Timers  et variables
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
unsigned long CurrentMillis  = 0;       // Millisseconde courante
unsigned long NextMillis  = 0;          // Millisseconde courante
int delai = 750 ;
#define INTERVAL 60000 ;                // 60 secondes
float Tmp = 0;
float Hum = 0;
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Page à Afficher
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
String getPage() {
  String page = "<!DOCTYPE HTML>\n";
  page += "<html>\n<head>\n";
  page += "<meta charset=\"UTF-8\">\n";
  page += "<meta http-equiv='refresh' content='60'/>\n<title>\n";      // C'est du code HTML, la page s'auto-actualise
  page += host;
  page += "</title>\n";                               // Titre de la barre du navigateur
  page += "<style>\nhtml, body { width: auto; background-color: #e5e8e8 ; font-family: Arial, Helvetica, Sans-Serif; font-size: 25px; Color: #000088; }\n";
  page += "table {font-size: 22px; font-weight: 200;}\n";
  page += "span.titre{font-size: 23px; font-weight: 700; float: left; padding-right: 40px; }\n";
  page += "span.sonde{font-size: 23px; font-weight: 400; float: right;}\n";
  page += "#page {width: 335px; margin: 0 auto;}\n";
  page += "</style>\n";             // style de la page
  page += "</head>\n<body>\n";
  page += "<div id='page'>\n<span class='titre'>";
  page += Titre;
  page += "</span>\n<span class='sonde'>";
  page += host;
  page += "</span></br>\n<hr>\n";
  page += "<table width = 330px><tr><td align = left width = 60 % >Heure: ";
  page += " </td>\n<td align = right>";
  page += "<script type=\"text/javascript\">\n";
  page += "var dr=new Date();\n";
  page += "var hrs = dr.getHours();\n";
  page += "var min = dr.getMinutes();\n";
  page += "var sec = dr.getSeconds();\n";
  page += "var str = (hrs<10?'0':'')+hrs;\n";
  page += "str += ':'+(min<10?'0':'')+min;\n";
  page += "str += ':'+(sec<10?'0':'')+sec;\n";
  page += "document.write(str);\n";
  page += "</script>\n";
  page += "</td></tr>\n";
  // ici on place les données
  page += "<tr><td>Température: </td><td align=right>";
  page += Tmp;
  page += " °C</td></tr>\n";
  page += "<tr><td> Humidité: </td><td align=right>";
  page += Hum;
  page += " %</td></tr>\n</table>\n</div>\n";
  page += "</body>\n</html>";
  return page;
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Connection au wifi
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void wificonnect()
{
  wifiMulti.addAP(ssid2, psk2);
  wifiMulti.addAP(ssid1, psk1);
  Serial.println("Connection Wifi...");
  while (wifiMulti.run() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  WiFi.config(ip, gateway, subnet);   //Si vous désirez une adresse IP Fixe
  Serial.println("");
  String Nom = Titre;
  Nom.replace(" ", "%20");
  String url = dest;
  url += "/esp/php/start.php?Host=";
  url += host;
  url += "&SSID=";
  url += WiFi.SSID();
  url += "&Signal=";
  url += WiFi.RSSI();
  url += "&Nom=";
  url += Nom;
  url += "&Script=";
  url += script;
  url += "&Sondes=";
  url += sondes;
  Serial.println(url);
  http.begin(url);
  http.addHeader("Content-Type", "text/html;");
  int httpCode = http.GET();
  Serial.println(httpCode);
  if (httpCode == HTTP_CODE_OK)
  {
    Serial.print("HTTP response code ");
    Serial.println(httpCode);
    String response = http.getString();
    Serial.println(response);
  }
  http.end();
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Handle client
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void handleRoot()
{
  server.sendHeader("server", host);
  server.send ( 200, "Content-Type: text/html; charset=UTF-8", getPage() );
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// SETUP
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void setup()
{
  Serial.begin(115200);
  delay(10);
  WiFi.mode(WIFI_STA);
  wificonnect();
  // on affiche l'adresse IP qui nous a ete attribuee
  Serial.print("Machine: ");
  Serial.println(host);
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  server.on ( "/", handleRoot );
  server.begin();
  Serial.print( "HTTP serveur en service ... http://" );
  Serial.print(WiFi.localIP());
  Serial.println("/");
  /* Configure the sensor */
  delay(2000);
  NextMillis = millis();
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Boucle principale
// Cette boucle s'exécute à l'infini
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void loop()
{
  server.handleClient();
  CurrentMillis = millis() ;
  if (CurrentMillis > NextMillis)
  {
    Hum = dht.readHumidity();
    Tmp = dht.readTemperature();
    while (isnan(Tmp))
    {
      delay(delai);
      Tmp = dht.readTemperature();
    }
    while (isnan(Hum))
    {
      delay(delai);
      Hum = dht.readHumidity();
    }
    String url = dest;
    url += "/esp/php/logs.php?Host=";
    url += host;
    url += "&Sondes=";
    url += sondes;
    url += "&Tmp=";
    url += Tmp;
    url += "&Hum=";
    url += Hum;
    Serial.println(url);
    http.begin(url);
    http.addHeader("Content-Type", "text/html");
    int httpCode = http.GET();
    Serial.println(httpCode);
    if (httpCode == HTTP_CODE_OK)
    {
      Serial.print("HTTP response code ");
      Serial.println(httpCode);
      String response = http.getString();
      Serial.println(response);
    }
    http.end();
    NextMillis = CurrentMillis + INTERVAL ;
  }
}

Ce script permet 2 choses:

  1. envoyer les données à un serveur distant.
  2. afficher les données.

Scripts PHP

start.php
<?php 
$IP = ($_REQUEST["IP"] == null)? -1 : $_REQUEST["IP"]; 
$Host = ($_REQUEST["Host"] == null)? '-' : $_REQUEST["Host"];
$Script = ($_REQUEST["Script"] == null)? '-' : $_REQUEST["Script"];
$Sondes = ($_REQUEST["Sondes"] == null)? '-' : $_REQUEST["Sondes"];
/* ====================================================== 
Traitement de ces données en fonction de vos besoins
*/
?>
logs.php
<?php 
$Lux = ($_REQUEST["Lux"] == null)? -1000 : $_REQUEST["Lux"]; 
$Tmp = ($_REQUEST["Tmp"] == null)? -1000 : $_REQUEST["Tmp"];
$Hum = ($_REQUEST["Hum"] == null)? -1000 : $_REQUEST["Hum"];
$PR = ($_REQUEST["PR"] == null)? -1000 : $_REQUEST["PR"];  
$Host = ($_REQUEST["Host"] == null)? '-' : $_REQUEST["Host"];
$Sonde = ($_REQUEST["Sondes"] == null)? '-' : $_REQUEST["Sondes"];
//===========================================================
$datesql = date("Y-m-d H:i:s");
$capteur = array (
"Tmp" => $Tmp,
"Hum" => $Hum,
"PR" => $PR,
"PA" => $PA,
);
//===========================================================
//  Fichiers Logs
//===========================================================
$logs = sprintf("logs/%s.txt",$Host);
$fichier = fopen($logs, 'a+');
$date = date("d/m/Y H:i:s");
$txt = $date."\t";
foreach($capteur as $key => $val)
    {
    if ($val != -1000)
	{
	$txt .= " | ".$key." = ".$val;
	}
    }
$txt .= " | ".$Host."\n";
fputs($fichier, $txt); 
fclose($fichier);
chmod($logs, 0666);
//===========================================================
//  Insert dans BD
//===========================================================
$sondes = array (
"Nom de la sonde DHT" => array ("Tmp","Hum"),
"Nom de la sonde BME" => array ("Tmp","Hum","PR","PA"),
);
if (array_key_exists($sonde, $sondes))
	{
	$champs = $sondes[$sonde];
	$table = "Votre table";
	$qc = "INSERT INTO `".$table."` (`Date`, `Sonde` ";
	$qv = " VALUES ( '".$datesql."', '".$sonde."' ";
	foreach ( $champs as $ch)
		{
		$qc .= ", `".$ch."`";
		$qv .= ", ".$capteur[$ch];
		}
	$query = $qc.")".$qv.")";
	$BD = new mysqli("Votre serveur","User Name","Mot dePasse","Base");
	$result = $BD->query($query);
	$BD->close();
	}
?>
meteoduino/thermometre.txt · Dernière modification: 10/02/2018 20:33 par michel
Powered by PHP Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Valid HTML5