Projet Wifi

Bonjour,

Dans les pages qui suivent, je vais vous détailler comment j’ai mis au point une sonde de température à base d’une carte HELTEC ESP32 LORA WIFI V2.

La sonde se connecte au WIFI et les données sont ensuite envoyées sur Cayenne pour l’exploitation graphique des informations.

Je vais détailler au maximum le projet en expliquant chacun des blocs importants du programme.

Le programme complet est également disponible en téléchargement, vous trouverez un lien à la fin de cet article.

Liste du matériel nécessaire :

  • Une carte HELTEC ESP32 LoRa WIFI 32
  • Si possible une batterie
  • Une sonde de température type AM2302 / DHT22
  • Un boitier imprimer que vous trouverez ICI

Concernant la sonde de température, il faut connecter VCC au 3.3 volts GND au GND de la carte. La patte 2, DATA, doit être connectée au GPIO17 de la carte. La papatte 3, elle, ne sert à rien…

AM2302 / DHT22 Datasheet

Pour rappel, voici le détail des entrées/sorties disponible de la carte WIFI LoRa 32 V2.

Ce schéma est disponible sur le site HELTEC au format PDF si vous le désirez.

En gros, normalement, c’est tout ce qu’il y a à faire côté « électronique ». Cependant, j’ai constaté une erreur de lecture de la tension de la batterie via le GPIO13. Après de longue recherche, j’ai constaté que l’ADC2 de l’EPS32 n’est plus utilisable si le WIFI est activé. Il faut donc connecté le GPIO13 au GPIO36 qui lui, est sur l’ADC1. Ceci permettra de pouvoir lire la tension de la batterie via l’ADC1.

Ne pas oublier de connecter la batterie sur le connecteur se trouvant sous la carte (optionnel).

Pour la programmation, tout se fera avec l’IDE ARDUINO.

Commençons déjà par les bibliothèques nécessaires :


#define CAYENNE_PRINT Serial
#include <CayenneMQTTESP32.h>
#include "SSD1306.h"             // Pour gérer l'OLED intégré.
#include "DHTesp.h"              // Pour gérer la sonde de température
#include <WiFi.h>                //https://github.com/esp8266/Arduino
#include <WebServer.h>
#include <ESPmDNS.h>
#include <WiFiManager.h>         //https://github.com/tzapu/WiFiManager
//#include <IotWebConf.h>
#include <HTTPClient.h>
#include <Update.h>

#include <ArduinoJson.h>          //https://github.com/bblanchon/ArduinoJson
#include <FS.h>                   //this needs to be first
#include "SPIFFS.h"

Définition des variables globales :

// Variables globales
uint32_t prevMillis = 0;
uint32_t prevMillisAff = 0;
uint32_t WaitingFor = 0;
uint32_t WaitingOpenWeather = 0;

int SignalRSSI, prevSignalRSSI, TypeAff = 3;
double c, d, prevD;
float temp, prevTemp, hum, prevHum, pres, uvindex, lum;
int _minimumQuality = -1;
WiFiManagerParameter* _params[10];
long NbTrans;                       // Compteur du nombre de transmission 

#define SDA                  4
#define SCL                  15
#define RST_OLED             16     //RST must be set by software
#define OLED_UPDATE_INTERVAL 500
#define STATUS_PIN           25
#define CONFIG_PIN           0
#define CONFIG_VERSION       "V1.10"
const char thingName[] =     "LM38_MQTT";

boolean WiFiConnected = 0;        // suis je ou non connecté au Wifi ?
boolean MQTTConnected = 0;        // suis je connecté à MQTT ?
int RELAI = 33;                   // Relai, piloté par le canal 10 
int LED_BOARD = 25;               // Led blanche interne

// Données à récupérer du site OpenWeatherMap
char OpenWeatherTemp[8];
char OpenWeatherHumidity[8];
char OpenWeatherPressure[8];

// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
char username[45];
char password[45];
char clientID[45];
char WaitingTime[10];          // Temps d'attente entre chaque emmission vers Cayenne.
char Ville[80];                // Ville lecture données pour OpenWeatherMap
char Calibrage[5];             // Valeur modifiable pour le calibrage 

//flag for saving data
bool shouldSaveConfig = false;

#define DHTPIN 17           // broche ou l'on a branche le capteur

Définitionde base de la sonde de température et de l’afficheur :

// Initialisation DHT
DHTesp dht;
// Initialisation afficheur
SSD1306  display(0x3c, SDA, SCL);

Déclaration des méthodes :

// -- Callback method declarations.
void wifiWiFiConnected();
void configSaved();
boolean formValidator();

Initialisation du serveur WEB :

// Initialisation serveur Web.
WebServer server(80);
HTTPClient http;

Initialisation de l’afficheur OLED intégré :

void setupOLED()
{
  pinMode(RST_OLED, OUTPUT);
  digitalWrite(RST_OLED, LOW);        // turn D16 low to reset OLED
  delay(50);
  digitalWrite(RST_OLED, HIGH);       // while OLED is running, must set D16 in high
  display.init();
  display.flipScreenVertically();           //
  display.setFont(ArialMT_Plain_10);        //
  display.setTextAlignment(TEXT_ALIGN_LEFT);//
  display.clear();
  display.drawString(0, 0, "Initialisation...");
  display.display();
  delay(1000);
}

Le code qui suit est spécifique à CAYENNE. Il permet de vérifier la connexion à Cayenne et gérer les messages reçus sur les canaux 10 et 11. Dans ce montage, le canal 10 est utilisé pour commander un relais interne et le 11 pour commander la LED intégrée. Ces canaux sont géré depuis l’interface Cayenne ou depuis l’autre sonde LoRa détaillée également sur ce site.

CAYENNE_CONNECTED() {
  MQTTConnected = 1;
  Serial.println("Connection CAYENNE établie.");
  AffConCayenne();
}

CAYENNE_DISCONNECTED() {
  MQTTConnected = 0;
  Serial.println("Connection CAYENNE perdue...");
}

CAYENNE_IN(10)
{
  int value = getValue.asInt();
  CAYENNE_LOG("Channel %d, pin %d, value %d", 10, RELAI, value);
  // Write the value received to the digital pin.
  digitalWrite(RELAI, !value);
}

CAYENNE_IN(11)
{
  int value = getValue.asInt();
  CAYENNE_LOG("Channel %d, pin %d, value %d", 11, LED_BOARD, value);
  // Write the value received to the digital pin.
  digitalWrite(LED_BOARD, value);
}

Le code qui suit permet de gérer la première ligne de l’afficheur OLED. Cette première ligne permet d’afficher les notifications, un peu à la manière d’un smartphone. LEs informations indiquées sont :

  • La connexion à Cayenne,
  • La force du signal WIFI,
  • La charge de la batterie,
  • Les natures des informations affichées (interne, externe, température…)
void AffConCayenne() {             // Affiche un "C" si on est connécté à Cayenne.
  if (MQTTConnected) {
    display.fillRect(79, 0, 4, 2);
    display.fillRect(77, 2, 2, 4);
    display.fillRect(79, 6, 4, 2);
  }
}

void CalculBat()                     // Affiche une gauge de l'état de charge de la batterie.
{
double c=0;
   // Pour que la lecture de la tension fonctionne, il faut connecter le GPIO13 au GPIO36.
   // En effet, si le WIFI est activé, l'ADC2 est inutilisable. Il faut donc utiliser l'ADC1.
   pinMode(13, INPUT); pinMode(36, INPUT);
   pinMode(21, OUTPUT);              //MOS-FET du contrôle de la batterie
   digitalWrite(21, LOW);           //Permet la lecture de la tension VExt sur pin 13

   //adcAttachPin(13);
   c = analogRead(36) * 0.0009035409035;   // Valeur lue entre 0 et 4095 pour  à 3.3 volts. 
                                               
   Serial.print("Tension batterie = "); 
   Serial.println(c);
   
   d  =  int(c/0.153);                // Division de la valeur lue de 3.7 volts en 24 partie d'affichage.
   display.fillRect(100,1,d,8);
   display.drawRect(100,1,24,8);
   display.fillRect(124,4,2,2);
}


void AffRSSI ()                       // Affiche la force du signal WIFI
{
  if (SignalRSSI == 0) display.drawCircle(90, 4, 4);
  else {
    if (SignalRSSI > -85) display.fillRect(86, 6, 2, 2);
    if (SignalRSSI > -80) display.fillRect(89, 4, 2, 4);
    if (SignalRSSI > -70) display.fillRect(92, 2, 2, 6);
    if (SignalRSSI > -66)display.fillRect(95, 0, 2, 8);
  }
}

void AffOled() {                      // Affiche les information sur l'écran OLED
  display.clear();
  display.setFont(ArialMT_Plain_10);        //
  display.drawString(0, 2, "IOT - MQTT");
  display.drawString(0, 14, "IP : ");
  display.drawString(40, 14, (String) WiFi.localIP().toString());
  display.drawString(0, 26, "Temperature : ");
  display.drawString(85, 26, (String) temp);
  display.drawString(0, 38, "Humidite : ");
  display.drawString(85, 38, (String) hum);
  display.drawString(0, 50, "RSSI : ");
  display.drawString(85, 48, (String)SignalRSSI);
  CalculBat();
  AffRSSI();
  AffConCayenne();
  display.display();
}

void affTemp() {
  display.clear();
  display.setFont(ArialMT_Plain_24);
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.drawString(16, 8, (String) temp);
  display.drawString(85, 8, "°C");
  display.drawString(16, 36, (String) hum);
  display.drawString(85, 36, "%");
  CalculBat();
  AffRSSI();
  AffConCayenne();
  display.fillRect(69, 0, 5, 1);
  display.fillRect(71, 1, 1, 5);
  display.fillRect(69, 6, 5, 1);
  display.display();
}

void affTempExt() {
  display.clear();
  display.setFont(ArialMT_Plain_24);
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.drawString(16, 8, (String) OpenWeatherTemp);
  display.drawString(85, 8, "°C");
  display.drawString(16, 36, (String) OpenWeatherHumidity);
  display.drawString(85, 36, "%");
  CalculBat();
  AffRSSI();
  AffConCayenne();
  display.fillRect(69, 0, 5, 1);
  display.fillRect(69, 0, 1, 6);
  display.fillRect(69, 3, 4, 1);
  display.fillRect(69, 6, 5, 1);
  display.display();
}

void affTempInExt() {
  display.clear();
  display.setFont(ArialMT_Plain_24);
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.drawString(16, 8, (String) temp);
  display.drawString(85, 8, "°C");
  display.drawString(16, 36, (String) OpenWeatherTemp);
  display.drawString(85, 36, "°C");
  CalculBat();
  AffRSSI();
  AffConCayenne();
  display.fillRect(69, 0, 5, 1);
  display.fillRect(71, 1, 1, 6);
  display.display();
}

Concernant la suite du programme, je me dois de vous détailler le cahier des charges de cette sonde :

  • La configuration Wifi doit être configurable et modifiable à tout moment. Pour cela, il est possible au démarrage de la sonde d’appuyer sur le bouton intégré pour passer la sonde en mode AP. Un nouveau point d’accès nommé LM38_MQTT sera disponible. ET ce connectant à ce point d’accès, il sera possible de configurer totalement la sonde , donc de changer les paramètres Wifi.
  • Les informations concernant la configuration Cayenne doit être modifiables via une page Web.
  • Il doit être possible de calibrer la sonde.
  • La ville de récupération des données sur OpenWeather doit être modifiable.
  • Il doit être possible de récupérer les informations de la sonde au format JSON.

Voici pour les besoins de base…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *