Depuis quelque jour j'essaye d'envoyer les valeurs de mon DS18B20 sur un serveur MySQL puis des envoyés sur un site j'ai réussi mais mon problème c'est que je voudrais avoir 2 capteurs qui envoient les valeurs et dans mon code je ne trouve pas comment faire pour qu'il envoie les deux valeurs séparément sinon il envoie les deux en même temps et la base de donné ne ce n'est pas faire la différence entre les deux et donc ne m'en affiche qu'une. Merci d'avance pour votre réponse.
Julien
#ifdef ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ArduinoOTA.h>
#else
#endif
#include "ESPAsyncTCP.h"
#include "SyncClient.h"
const char* ssid = "***************";
const char* password = "*************";
#include "DHT.h"
#define DHTPIN D5
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
float humidite;
float temperature;
float tempC;
SyncClient client;
char server[] = "**********";
unsigned long previousMillis = 0;
const long interval = 5000;
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 4 on the Arduino
#define ONE_WIRE_BUS 4
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
int numberOfDevices; // Number of temperature devices found
DeviceAddress tempDeviceAddress;
void setup(){
// Start up the library
sensors.begin();
// Grab a count of devices on the wire
numberOfDevices = sensors.getDeviceCount();
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(numberOfDevices, DEC);
Serial.println(" devices.");
// Loop through each device, print out address
for(int i=0;i<numberOfDevices; i++) {
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i)) {
Serial.print("Found device ");
Serial.print(i, DEC);
Serial.print(" with address: ");
printAddress(tempDeviceAddress);
Serial.println();
} else {
Serial.print("Found ghost device at ");
Serial.print(i, DEC);
Serial.print(" but could not detect address. Check power and cabling");
}
}
Serial.begin(115200);
dht.begin();
WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.printf("WiFi Failed!\n");
return;
}
Serial.printf("WiFi Connected!\n");
Serial.println(WiFi.localIP());
#ifdef ESP8266
ArduinoOTA.begin();
#endif
}
void loop(){
sensors.requestTemperatures(); // Send the command to get temperatures
// Loop through each device, print out temperature data
for(int i=0;i<numberOfDevices; i++) {
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i)){
// Output the device ID
Serial.print("Temperature for device: ");
Serial.println(i,DEC);
// Print the data
float tempC = sensors.getTempC(tempDeviceAddress);
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(" Temp F: ");
Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}
}
delay(5000);
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
humidite = dht.readHumidity();
temperature = dht.readTemperature();
#ifdef ESP8266
php();
#endif
}
}
void php()
{
float tempC = sensors.getTempC(tempDeviceAddress);
if (client.connect(server, 80)) {
Serial.println("Connecte !!");
client.print ("GET /DHT22/dht22.php?id=");
client.print ("&humidite=");
client.print (tempC);
client.print ("&temperature=");
client.print (tempC);
client.print("\r\n");
Serial.println ("GET /DHT22/dht22.php?id=");
Serial.print ("Humidité : ");
Serial.println (tempC);
Serial.print ("Température : ");
Serial.println (tempC);
} else {
Serial.println("connexion échouée");
}
}
void printAddress(DeviceAddress deviceAddress) {
for (uint8_t i = 0; i < 8; i++) {
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
/DHT22/dht22.php?id=&humidite=HHH&temperature=TTT
Notez qu'il n'y a pas d'id qui est fourni dans la requête GET que vous effectuez. est-ce normal ?
Si vous voulez envoyez plus de données il suffit de rajouter des paramètres. /DHT22/dht22.php?humidite1=HHH&temperature1=TTT&humidite2=HHH&temperature2=TTT
ou alors de passer l'ID de la sonde que vous mettez à jour
/DHT22/dht22.php?id=1&humidite=HHH&temperature=TTT
et /DHT22/dht22.php?id=2&humidite=HHH&temperature=TTT
➜ il faut bien sûr que le code PHP de l'autre côté gère correctement la requête
Au dépars j'utiliser un capteur de température DHT22 mais maintenant je souhaite utiliser les DS18B20, je découvre tout ce qui est envoyé sur les bases de donner du coup est ce qu'il faut que j'ajoute l'id dans la requête GET et si oui pouvez-vous me dire comment faire pour ce qui du code PHP je vous le laisse juste en dessous pouvez-vous me dire s'il faut que je modifie des choses pour tous fonctionne.
<?php
class temp_humi_dht22{
public $link='';
function __construct ($temperature, $humidite,) {
$this->connect();
$this->storeInDB($temperature, $humidite);
}
function connect (){
$this->link = mysqli_connect('localhost','root','') or die('Cannot connect to the DB');
mysqli_select_db($this->link,'essai_data') or die ('Cannot select the DB');
}
function storeInDB($temperature, $humidite ) {
$query = "insert into temp_humi_dht22 set humidite='".$humidite."', temperature='".$temperature."'";
$result = mysqli_query($this->link,$query) or die ('Errant query: '.$query);
}
}
if ($_GET['temperature'] != '' and $_GET['humidite'] != '') {
$temp_humi_dht22=new temp_humi_dht22($_GET['temperature'],$_GET['humidite']);
}
?>
Merci pour l'explication si je modifie ça dans le code PHP
<?php
class temp_humi_dht22{
public $link='';
function __construct ($temperature, $humidite, $temperature2,) {
$this->connect();
$this->storeInDB($temperature, $humidite, $temperature2);
}
function connect (){
$this->link = mysqli_connect('localhost','root','') or die('Cannot connect to the DB');
mysqli_select_db($this->link,'essai_data') or die ('Cannot select the DB');
}
function storeInDB($temperature, $humidite, $temperature2 ) {
$query = "insert into temp_humi_dht22 set humidite='".$humidite."', temperature='".$temperature."', temperature2='".$temperature2."'";
$result = mysqli_query($this->link,$query) or die ('Errant query: '.$query);
}
}
if ($_GET['temperature'] != '' and $_GET['humidite'] != '' and $_GET['temperature2'] != '') {
$temp_humi_dht22=new temp_humi_dht22($_GET['temperature'],$_GET['humidite'],$_GET['temperature2']);
}
?>
Oui je penserais à changer pour imprimer les bonnes valeurs je testerais ça demain car j'ai qu'un seul capteur actuellement si j'ai un problème je vous le dirais. Encore merci pour l'aide.
Ce que je comprends par c'est qu'avec le DHT22 j'avais mis une colonne humidité qui a les mêmes caractéristiques que température donc avec 2 DS18B20 sa aurai dû mettre une valeur dans humidité pour 1 capteur et l'autre valeur dans température.
il faut donc que sur votre serveur vous ayez un script PHP qui se nomme dht22.php dans un répertoire DHT22 accessible sur le port 80 pour une requête HTTP standard
ce script PHP doit être capable d'extraire les 3 paramètres xxx, yyy et zzz précédents de la requête
puis bâtir une requête SQL pour faire l'insertion dans la base de données
il faut donc que la base de donnée
soit configurée pour accepter une requête en provenance du scripts (droits)
et qu'il existe une table correspondant à la requête INSERT
si ça ne fonctionne pas il faut regarder
est-ce que l'ESP prépare bien et envoie la requête (affichez là et utiliser une bibliothèque qui permet de gérer le requête HTTP et obtenir la réponse du serveur, que votre script enverrait, ça serait pas mal aussi)
les logs du serveurs HTTP pour voir si la requête arrive (ou faire que le script PHP log dans la console système ce qu'il reçoit)
la requête INSERT qui est bâtie pour voir si elle est conforme
les logs de votre base de données pour voir si la requête est bien reçue et traitée
Du point de vue sécurité ça permet d’Éviter de mettre le serveur de base de données directement dans la DMZ (on n’accède pas directement à la base par requêtes SQL qui pourraient être n’importe quoi, on passe par un code qui donc a une API limitée donc une surface d’attaque de votre système moindre.).
Un autre point bien sûr c’est qu’on peut faire autre chose dans ce code que juste du SQL, aller récupérer des infos sur d’autres systèmes, faire de la vérification de cohérence, limiter le flux de ce qui est envoyé si la bande passante vers le serveur est limitée etc)