DIY Station de control ESP 8266 + DHT22 + HC-SR04 + Thingspeak

Bonjour les amis,

voila je viens vers vous pour essayer de résoudre mon soucis de codage :confused:

Je m'explique. je voudrais réaliser une station de contrôle avec un simple capteur dht22 et un capteur ultrasonic de type hcsr04 le tout avec les data envoyé sur thingspeak.

DHT22 = temperature et humidité
HCSR04 = Cuve Niveau D'eau

j'ai réaliser la partie du code pour le dht22 et cella fonction ! mais le problème viens au moment ou j'essaye d’intégré le code pour le hcsr04 je me tape des erreurs sur erreurs a ne plus savoir ou chercher :confused:

je vous met le code en description

#include "DHT22.h"
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

// WIFI SETTINGS
#define WIFI_SSID "nomwifi"
#define WIFI_KEY "123456789"

#define FIELD_TEMPERATURE 1
#define FIELD_HUMIDITY 2
#define FIELD_DISTANCE 3

// THINGSPEAK SETTINGS
#define THINGSPEAK_HOST "api.thingspeak.com"
#define THINGSPEAK_API_KEY "ABCDEFGH12345678"

// defines pins numbers
const int trigPin = 2; //D4
const int echoPin = 0; //D3
#define PIN_DHT D3

// PROGRAM SETTINGS
#define TIME_SLEEP 1000
#define CPT_PUBLISH 30

// defines variables
HTTPClient http;
long duration;
int distance;
DHT dht(PIN_DHT, DHT22);

uint16_t cptLoop = 0;

float temperature = 0;
float humidity = 0;
float distancecm = 0;

uint16_t cptTemperature = 0;
uint16_t cptHumidity = 0;
uint16_t cptDistance = 0;

void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
Serial.println("\nSetup");
}
// Initialisation du WIFI
WiFi.begin(WIFI_SSID, WIFI_KEY);

Serial.printf("Connecting to %s with key %s\n", WIFI_SSID, WIFI_KEY);

uint32_t timer = millis();
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(200);

// Si il n'arrive pas à se connecter au bout de 20 secondes, le système redémarre (au cas ou un bug serait survenu)
if (millis() - timer >= 20000)
{
Serial.println("Unable to connect, restarting...");
ESP.restart();
}
}

Serial.println(" WiFi connected");

// Initialisation pour le DHT22 et le YL100
dht.begin();

}
void loop()
{
// Incrémentation de 1 du compteur de boucle
cptLoop++;

// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);

// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);

// Lecture des capteurs
float _temperature = dht.readTemperature();
if (_temperature >= -40 && _temperature <= 80)
{
temperature += _temperature;
cptTemperature++;
}

float _humidity = dht.readHumidity();
if (_humidity >= 0 && _humidity <= 200)
{
humidity += _humidity;
cptHumidity++;
}

float _distance = dht.readdistance();
if (_distance >= 0 && _distance <= 200)
{
distance += _distance;
cptdistance++;
}

// Calculating the distance
distance= duration*0.034/2;

// Si le compteur de boucle arrive à CPT_PUBLISH
if (cptLoop >= CPT_PUBLISH)
{
temperature = temperature / cptTemperature;
humidity = humidity / cptHumidity;
distance = distance /cptdistance;

// Affichage à l'écran des valeurs lues
Serial.println("======");
Serial.printf("Temperature : %s C°\n", String(temperature).c_str());
Serial.printf("Humidity : %s %%\n", String(humidity).c_str());
Serial.printf("Distance: %s %%\n", String(distance).c_str());

// Si nous ne sommes plus connectés au WiFi
if (WiFi.status() != WL_CONNECTED)
{
Serial.println("Connection to the SSID lost, trying to reconnect...");

uint32_t timer = millis();
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(200);

if (millis() - timer >= 20000)
{
Serial.println(" Unable to connect, restarting...");
ESP.restart();
}
}
}

// Création de l'URL
String url;
url.reserve(256);
url = "http://"+ String(THINGSPEAK_HOST) +"/update?api_key="+ String(THINGSPEAK_API_KEY);

// Ici on intègre les champs et leurs valeurs.
if (cptTemperature > 0)
url += "&field"+ String(FIELD_TEMPERATURE) +"="+ temperature;
else
Serial.println("Unable to read temperature");

if (cptHumidity > 0)
url += "&field"+ String(FIELD_HUMIDITY) +"="+ humidity;
else

Serial.println("Unable to read humidity");
if (cptDistance > 0)
url += "&field"+ String(FIELD_DISTANCE) +"="+ distance;
else
Serial.println("Unable to read humidity");

Serial.printf("Fetching %s\n", url.c_str());

// Etablissement de la communication HTTP
http.begin(url);
int httpCode = http.GET();

// Si nous n'avons pas réussi à émettre les données, nous redémarrons le système (au cas ou un bug serait survenu)
if(httpCode != HTTP_CODE_OK)
{
Serial.printf("[HTTP] GET... failed, code: %d, error: %s\n", httpCode, http.errorToString(httpCode).c_str());
ESP.restart();
}

Serial.println("Data sent !");

http.end();

// Remise à zéro
cptLoop = 0;

temperature = 0;
humidity = 0;
distance = 0;

cptTemperature = 0;
cptHumidity = 0;
cptdistance = 0;

}

delay(2000);
}

Dernière code erreur en date :

Arduino : 1.8.8 (Windows 10), Carte : "NodeMCU 1.0 (ESP-12E Module), 80 MHz, 115200, 4M (3M SPIFFS)"

Ultrasonic_Sensor-1:49:3: error: 'WiFi' does not name a type

WiFi.begin(WIFI_SSID, WIFI_KEY);

^

Ultrasonic_Sensor-1:51:3: error: 'Serial' does not name a type

Serial.printf("Connecting to %s with key %s\n", WIFI_SSID, WIFI_KEY);

^

Ultrasonic_Sensor-1:54:3: error: expected unqualified-id before 'while'

while (WiFi.status() != WL_CONNECTED)

^

exit status 1
'WiFi' does not name a type

Merci pour les infos les amis en espérant que ce poste vous intéresse :slight_smile:

Vous avez du code qui se ballade en dehors des fonctions...C'est interdit en C ou C++

// Initialisation du WIFI
WiFi.begin(WIFI_SSID, WIFI_KEY);

Serial.printf("Connecting to %s with key %s\n", WIFI_SSID, WIFI_KEY);

Bonjour J-M-L et merci pour ta rapidité de réponse :slight_smile:

j'ai du mal a interprété votre phrase

ça veut dire quoi "dans du code qui se ballade en dehors des fonctions ?" j'efface ou c'est pas a la bonne place ?

bah ca fonction c'est initialiser le wifi nan ? Mon dieux que j comprend rien :frowning:

Salut,

Ce qu'il veut dire c'est que seul les appels de bibliothèques (#include <XX.h>), les déclarations de variables globales (int variable;), les defines (#define XX YY) et d'autres choses que j'oublie peuvent se faire hors des fonctions.

Les appels de fonctions et procédures doivent se faire, elles, dans des fonctions. Dans votre programme, les fonctions sont "setup()" et "loop()". Le code qui est dans une fonction se trouve donc entre les accolades ({}).

Il faut donc prendre le code cité plus haut et le mettre au début de la fonction loop comme ceci :

void loop()
{
 // Initialisation du WIFI
  WiFi.begin(WIFI_SSID, WIFI_KEY);

  Serial.printf("Connecting to %s with key %s\n", WIFI_SSID, WIFI_KEY);
  
  uint32_t timer = millis();
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(200);

    // Si il n'arrive pas à se connecter au bout de 20 secondes, le système redémarre (au cas ou un bug serait survenu)
    if (millis() - timer >= 20000)
    {
      Serial.println("Unable to connect, restarting...");
      ESP.restart();
    }
  }
 
  Serial.println(" WiFi connected");

  // Initialisation pour le DHT22 et le YL100
  dht.begin();

RESTE DU CODE
}

Ou encore il est possible de créer une fonction et de l'appeler au début de la fonction loop comme suivant :

void initialisation()
{
 // Initialisation du WIFI
  WiFi.begin(WIFI_SSID, WIFI_KEY);

  Serial.printf("Connecting to %s with key %s\n", WIFI_SSID, WIFI_KEY);
  
  uint32_t timer = millis();
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(200);

    // Si il n'arrive pas à se connecter au bout de 20 secondes, le système redémarre (au cas ou un bug serait survenu)
    if (millis() - timer >= 20000)
    {
      Serial.println("Unable to connect, restarting...");
      ESP.restart();
    }
  }
 
  Serial.println(" WiFi connected");

  // Initialisation pour le DHT22 et le YL100
  dht.begin();
}

void loop()
{
   initialisation();

RESTE DU CODE
}

Voilà, j'espère avoir été clair pour vous.

Il y a un parenthèse de trop après Serial.println("\nSetup");
Ce qui fait que le code qui suit est en dehors de la fonction setup()

moi qui pensais avoir pris le temps de bien tout placer -_-

Merci pour les réponses les amis :slight_smile:

je vais continuer de regarder ca

voila j'ai corriger le soucis des parenthèse mais il y a encore une erreur :s

je comprend pas comment intégrée le capteur hc sr04 si on pourrais m’éclairè.

ou es puissé la commande final de l'impulsion de retour sur le echo ? il y a juste distance et distancecm nan ?

kanabise:
smartgrow:106:21: error: 'read' was not declared in this scope

float _distance = read.distance();

^

smartgrow:110:5: error: 'cptdistance' was not declared in this scope

cptdistance++;

^

smartgrow:121:26: error: 'cptdistance' was not declared in this scope

distance = distance /cptdistance;

^

smartgrow:130:1: error: a function-definition is not allowed here before '{' token

{

^

smartgrow:203:1: error: expected '}' at end of input

}

^

smartgrow:203:1: error: expected '}' at end of input

exit status 1
'read' was not declared in this scope

Problème de résolu avec ESPeasy !!

C'est un firmware pour les modules WiFi ESP8266 qui permet de réaliser de petits objets connectés sans aucune programmation !!