J'ai l'impression que cela fonctionne du côté com ESP vers la page http puisque j'ai un retour code 200, sauf erreur de ma part
HTTP Response code: 200
Voici le code ino :
//ESP VROOM DA Module Baud 9600
//V2 Version OK DHT BME et air et moy le 05/10
// base de travail https://www.tingene.com/blog/index.php?article51/cloud-weather-station-esp32-esp8266
// Pour acceder à la base sql passer par free adree email et acces base sql
// Inclusion des librairies
#include <DHT.h>
#include "SdsDustSensor.h"
#include <Adafruit_BME280.h>
#include <WiFi.h>
#include <HTTPClient.h>
//#include <Wire.h> /: Vérifier si nécessaire car librairie pour commander des com I2C
// Constantes du programme
#define brocheDeBranchementDHT 23
#define typeDeDHT DHT22
#define adresseI2CduBME280 0x76 // Adresse I2C du BME280 (0x76, dans mon cas, ce qui est souvent la valeur par défaut)
#define pressionAuNiveauDeLaMerEnHpa 1024.90 // https://fr.wikipedia.org/wiki/Pression_atmospherique (1013.25 hPa en moyenne, valeur "par défaut")
#define delaiRafraichissementAffichage 1500 // Délai de rafraîchissement de l'affichage (en millisecondes)
#define delaiRafraichissementAffichage 10000
int led = 13;
const int rxPin = 19;
const int txPin = 18;
String sensorName = "BME280";
String sensorLocation = "Ext";
// Network credentials
const char* ssid = "XXX";
const char* password = "XXX";
// Variable to store the HTTP request
String header;
//Votre nom de domaine avec chemin URL ou adresse IP avec chemin
const char* serverName = "http://nom.free.fr/esp-post-data.php";
// Conservez cette valeur de clé API pour être compatible avec le code PHP fourni dans la page du projet.
// Si vous modifiez la valeur apiKeyValue, le fichier PHP /esp-post-data.php doit également avoir la même clé
String apiKeyValue = "XXXXX";
// les variables suivantes sont des longueurs non signées car le temps, mesuré en
// millisecondes, deviendra rapidement un nombre plus grand que celui qui peut être stocké dans un int.
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
unsigned long httptimerDelay = 60000; // modif le 9/10 à 60 000 au lieu de 600 000 1mn ald 10mn
// Set timer to 30 seconds (30000)
//unsigned long timerDelay30s = 30000;
// Instanciation des librairies
SdsDustSensor sds(Serial1);
DHT dht(brocheDeBranchementDHT, typeDeDHT);
// Instanciation de la librairie BME280
Adafruit_BME280 bme;
// ========================
// Initialisation programme
// ========================
void setup() {
// Initialisation diode;
pinMode(led, OUTPUT);
// Initialisation du DHT22;
dht.begin();
// Initialisation du moniteur;
Serial.begin(9600);
// Initialisation du controleur air;
Serial1.begin(9600, SERIAL_8N1, rxPin, txPin);
sds.begin();
Serial.println(sds.queryFirmwareVersion().toString());
Serial.println(sds.setActiveReportingMode().toString());
Serial.println(sds.setContinuousWorkingPeriod().toString());
// Initialisation du BME280
Serial.print("Initialisation du BME280, à l'adresse [0x");
Serial.print(adresseI2CduBME280, HEX);
Serial.println("]");
if(!bme.begin(adresseI2CduBME280)) {
Serial.println("--> ÉCHEC…");
while(1); // Arrêt du programme, en cas d'échec de l'initialisation
} else {
Serial.println("--> RÉUSSIE !");
}
Serial.println();
// Connection au reseau wifi et attribution IP
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connecté au réseau WiFi avec l'adresse IP : ");
Serial.println(WiFi.localIP());
//} temporaire
// détails : https://www.upesy.fr/blogs/tutorials/how-to-connect-wifi-acces-point-with-esp32
Serial.println("\nConnected to the WiFi network");
Serial.print("[+] Gateway IP : ");
Serial.println(WiFi.gatewayIP());
Serial.println((String)"[+] RSSI : " + WiFi.RSSI() + " dB");;
}
// ======================================
// Boucle principale (boucle perpétuelle)
// ======================================
void loop() {
digitalWrite(led, HIGH);
// **********BMP180********************
// Affichage de la TEMPÉRATURE
// ****Mesure BMP****
float TEMPBMP = bme.readTemperature();
float HUMBMP = bme.readHumidity();
float PREBMP = bme.readPressure();
Serial.print("**BMP280** ");
Serial.print("{\"Hum\": ");
Serial.print(HUMBMP);
Serial.print(", % \"Temp\": ");
Serial.print(TEMPBMP);
Serial.print(", °C \ Pression\": ");
Serial.print(PREBMP/100);
Serial.print(" Mpa}\n");
// ****Mesure DHT****
float HUMDHT = dht.readHumidity();
float TEMPDHT = dht.readTemperature();
Serial.print("**DHT22** ");
//Serial.print("{\"humidity\": ");
Serial.print("{\"Hum\": ");
Serial.print(HUMDHT);
Serial.print(", % \"Temp\": ");
Serial.print(TEMPDHT);
Serial.print("°C}\n");
// Affichage de la TEMPÉRATURE MOY
Serial.print(F("Temp Moy = "));
float TEMPMOY = (TEMPBMP + TEMPDHT)/2;
Serial.print(TEMPMOY);
Serial.print(F(" °C "));
float ECARTTEMP= TEMPBMP - TEMPDHT;
Serial.print(F("Ecart "));
Serial.print(ECARTTEMP);
Serial.println(F(" °C"));
// Affichage du Tx Humidité moyen
float HUMMOY = (HUMBMP + HUMDHT)/2;
Serial.print(F("Hum Moy = "));
Serial.print(HUMMOY);
Serial.print(F(" % "));
Serial.print(F("Ecart "));
float ECARTHUM = HUMBMP - HUMDHT;
Serial.print(ECARTHUM);
Serial.println(F(" %"));
// Calcul de la température ressentie
float temperatureRessentieEnCelsius = dht.computeHeatIndex(TEMPDHT, HUMDHT, false); // Le "false" est là pour dire qu'on travaille en °C, et non en °F
Serial.print("Température ressentie DHT= "); Serial.print(temperatureRessentieEnCelsius); Serial.println(" °C");
//***Mesure de particules
PmResult pm = sds.readPm();
if (pm.isOk()) {
Serial.print("PM2.5 = ");
Serial.print(pm.pm25);
Serial.print(", PM10 = ");
Serial.println(pm.pm10);
//Serial.println(pm.toString());
}
else {
Serial.print("Could not read values from sensor, reason: ");
Serial.println(pm.statusToString());
}
delay(delaiRafraichissementAffichage/2);
//***************************************************************
// *****Partie WEB***********************************************
//***************************************************************
//Envoie une requête HTTP POST toutes les xx minutes
if ((millis() - lastTime) > httptimerDelay) {
// Vérifier l'état de la connexion Wi-Fi
if(WiFi.status()== WL_CONNECTED){
WiFiClient client;
HTTPClient http;
// Votre nom de domaine avec chemin URL ou adresse IP avec chemin
http.begin(client, serverName);
// Spécifiez l'en-tête du type de contenu
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Préparez vos données de requête HTTP POST
String httpRequestData = "api_key=" + apiKeyValue + "&sensor=" + sensorName
+ "&location=" + sensorLocation + "&value1=" + String(bme.readTemperature())
+ "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + ""; // A compléter avec les autres capteurs
Serial.print("httpRequestData: ");
Serial.println(httpRequestData);
// Vous pouvez commenter la variable httpRequestData ci-dessus
// ensuite, utilisez la variable httpRequestData ci-dessous (à des fins de test sans le capteur BME280)
//String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&location=Office&value1=24.75&value2=49.54&value3=1005.14";
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);
// Si vous avez besoin d'une requête HTTP avec un type de contenu : text/plain
//http.addHeader("Content-Type", "text/plain");
//int httpResponseCode = http.POST("Hello, World!");
// Si vous avez besoin d'une requête HTTP avec un type de contenu : application/json, utilisez ce qui suit :
//http.addHeader("Content-Type", "application/json");
//int httpResponseCode = http.POST("{"value1":"19","value2":"67","value3":"78"}");
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Free resources
http.end();
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
digitalWrite(led, LOW);
delay(delaiRafraichissementAffichage/2);
}
Voici le code http qui repond esp-post-data.php :
<!--
-->
<?php
include_once('esp-database.php');
// Conservez cette valeur de cl� API pour �tre compatible avec le code ESP fourni dans la page du projet. Si vous modifiez cette valeur, l'esquisse ESP doit correspondre
$api_key_value = "XXXX";
$api_key= $sensor = $location = $value1 = $value2 = $value3 = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$api_key = test_input($_POST["api_key"]);
if($api_key == $api_key_value) {
$sensor = test_input($_POST["sensor"]);
$location = test_input($_POST["location"]);
$value1 = test_input($_POST["value1"]);
$value2 = test_input($_POST["value2"]);
$value3 = test_input($_POST["value3"]);
$result = insertReading($sensor, $location, $value1, $value2, $value3);
echo $result;
}
else {
echo "Wrong API Key provided.";
}
}
else {
echo "No data posted with HTTP POST.";
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
et ensuite le insertreading dans esp-database.php en charge d'inscrire
<!--
-->
<?php
$servername = "localhost";
// REMPLACER par le nom de votre base de donn es
$dbname = "esp_data";
// REMPLACER par l'utilisateur de la base de donn es
$username = "nom";
// REMPLACER par le mot de passe de l'utilisateur de la base de donn es
$password = "motdepassedelabasemysql";
function insertReading($sensor, $location, $value1, $value2, $value3) {
global $servername, $username, $password, $dbname;
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "INSERT INTO SensorData (sensor, location, value1, value2, value3)
VALUES ('" . $sensor . "', '" . $location . "', '" . $value1 . "', '" . $value2 . "', '" . $value3 . "')";
if ($conn->query($sql) === TRUE) {
return "New record created successfully";
}
else {
return "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
}