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 <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "DHT.h"
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Paramètres WIFI
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
const char* ssid     = "Votre SSID";		// à Modifier
const char* password = "Passe Phrase";		// à Modifier
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
WiFiClient client2;
ESP8266WebServer server ( 80 );
const char* dest = "192.168.XX.XX";		// à Modifier selon votre réseau
const char* host = "Lolin-02";			// à Modifier (donner un nom pour identifier votre sonde)
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// DHT Settings
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#define DHTPIN D4       // what digital pin we're connected to. If you are not using NodeMCU change D6 to real pin
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
// Initialize the temperature/ humidity sensor
DHT dht(DHTPIN, DHTTYPE);
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Timers  et variables
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
unsigned long CurrentMillis  = 0;       // Millisseconde courante
unsigned long NextMillis  = 0;          // Millisseconde courante
#define INTERVAL 61000 ;                // 61 secondes
char modele[] = "NodeMCU";
char script[] = "DHT22-1.041";
char sondes[] = "DHT22";
char lieu[] = "Lieu";			// à Modifier 
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 {background-color: f4f6f6; 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 += lieu;
  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;
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// 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 );
  WiFi.begin(ssid, password);
  Serial.println ( "" );
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  // on affiche l'adresse IP qui nous a ete attribuee
  Serial.println("");
  Serial.print("Machine: ");
  Serial.println(host);
  server.on ( "/", handleRoot );
  server.begin();
  Serial.print( "HTTP serveur en service ... http://" );
  Serial.print(WiFi.localIP());
  Serial.println("/");
  if (client2.connect(dest, 80))
  {
    Serial.print("Connecté à ");
    Serial.println(dest);
    client2.print("GET /esp/start.php?IP=");
    client2.print(WiFi.localIP());
    client2.print("&Host=");
    client2.print(host);
    client2.print("&Script=");
    client2.print(script);
    client2.print("&Sondes=");
    client2.print(sondes);
    client2.println(" HTTP/1.0");
    client2.println();
    client2.stop();
  }
  /* Configure the sensor */
  NextMillis = millis();
}
 
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Boucle principale
// Cette boucle s'exécute à l'infini
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Cette boucle s'exécute à l'infini - the loop function runs over and over again forever
void loop() {
  // a chaque iteration, on appelle handleClient pour que les requetes soient traitees
  server.handleClient();
  CurrentMillis = millis() ;
  if (CurrentMillis > NextMillis)
  {
    Hum = dht.readHumidity();
    Tmp = dht.readTemperature();
    Serial.print("Tmp = ");
    Serial.println(Tmp);
    if (client2.connect(dest, 80))
    {
      client2.print("GET /esp/logs.php?Host=");
      client2.print(host);
      client2.print("&Tmp=");
      client2.print(Tmp);
      client2.print("&Hum=");
      client2.print(Hum);
      client2.print("&Sonde=");
      client2.print(sondes);
      client2.println(" HTTP/1.0");
      client2.println();
      client2.stop();
    }
    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: 19/01/2018 14:36 par michel
Powered by PHP Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Valid HTML5