Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

projets:automate2:prog [2019/08/13 12:16] (Version actuelle)
Ligne 1: Ligne 1:
 +====== Programme ======
  
 +Le programme est le dernier mis à jour avec l'​afficheur OLED.\\
 +Il est encore en phase de test, mais on peu y trouver quasi toutes les fonctions.\\
 +Reste a agencer ça.
 +
 +===== Synoptique =====
 +
 +  Initiation
 +  Boucle principale
 +    Boucle tant que et temps limite
 +      Test de connexion MQTT
 +    Si réception message MQTT 
 +      Affichage ​
 +      Exécution de l'​ordre
 +        ( mise à jour des seuils,
 +        Commande volet,
 +        )
 +    Récupération de l'​heure / min
 +      Affichage
 +    Récupération des données interne (temp, humidité) / 5min
 +      Affichage
 +    Récupération des commandes du BP (interruption) ​
 +      Affichage/​exécution en fonction
 +        BP 1 fois - Affiche Temp, humidité, lumière externe
 +        BP 2 fois - Affiche pression
 +        BP 3 fois - désactive/​réactive volets
 +    Envoi info au serveur MQTT / 10min
 +  Fin boucle  ​
 +
 +===== Code =====
 +
 +<code c++>
 +/*
 + ​Projet de sonde luminosité,​ température et humidité.
 + Ajout de commande des volets roulants pour une gestion de la température du logement.
 + 
 + Basé sur l'​exemple Basic ESP8266 MQTT
 +
 + Il cherche une connexion sur un serveur MQTT puis :
 +  - Il affiche les luminosités/​humidités,​ lunière, pression baro intener (et externe).
 +  - Il envoie tout cela en MQTT
 +  - La température interne, (externe)
 +  - L'​humidité interne, (externe)
 +  - La lumiére
 +  - La pression barométrique et les autres parmêtres du BMP180
 +  ​
 + En fonction des paramètres lumiére, température, ​
 + il pourra monter ou descendre le volets roulants.
 + 
 + ​Affichage normal : (heure option) Tempéarute,​ Humidité
 + Si BP = 1s -> (peut étre 1 pression)
 +   ​Affiche Temp int/ext, Lum int/ext, hum int/ext
 + Si BP = 3S -> 
 +   ​Affiche pression, (prévisions météos options)
 + Si BP = 10s -> désactivation volets  ​
 +
 + FUTUR :
 + On pourra définir les paramètres via une instruction MQTT
 +
 + ​Fonction accessoire :
 + It will reconnect to the server if the connection is lost using a blocking
 + ​reconnect function. See the '​mqtt_reconnect_nonblocking'​ example for how to
 + ​achieve the same result without blocking the main loop.
 +
 + ​Exemples :
 + MQTT:
 + ​https://​github.com/​aderusha/​IoTWM-ESP8266/​blob/​master/​04_MQTT/​MQTTdemo/​MQTTdemo.ino
 + ​Witty:​
 + ​https://​blog.the-jedi.co.uk/​2016/​01/​02/​wifi-witty-esp12f-board/​
 + ​Module tricapteur:
 + ​http://​arduinolearning.com/​code/​htu21d-bmp180-bh1750fvi-sensor-example.php
 + 
 + 
 +*/
 +
 +#include <​ESP8266WiFi.h>​
 +#include <​PubSubClient.h>​
 +#include <​DHT.h>​
 +// Include the correct display library
 +// For a connection via I2C using Wire include
 +#include <​Wire.h> ​ // Only needed for Arduino 1.6.5 and earlier
 +#include "​SSD1306.h"​ // alias for `#include "​SSD1306Wire.h"​`
 +
 +// Include custom images
 +#include "​WeatherStationImages.h"​
 +#include "​WeatherStationFonts.h"​
 +
 +// DHT 11 sensor
 +#define DHTPIN 2
 +#define DHTTYPE DHT11
 +
 +
 +// Utilisation d’une photo-résistance ​
 +// Et ports pour cmd volet
 +const int port = A0;    // LDR
 +#define haut 12
 +#define arret 13
 +#define bas 15
 +#define lbp 14
 +
 +// Update these with values suitable for your network.
 +// Buffer pour convertir en chaine de l'​adresse IP de l'​appareil
 +char buffer[20]; ​               ​
 +const char* ssid1 = "​FREEBOX_xxx_EXT";​
 +const char* ssid2 = "​FREEBOX_xxx_P2";​
 +const char* password = "​xxxx";​
 +const char* mqtt_server = "​192.168.0.x";​
 +
 +// Création objet
 +WiFiClient espClient;
 +PubSubClient client(espClient);​
 +// DHT sensor
 +DHT dht(DHTPIN, DHTTYPE, 15);
 +
 +// Variables
 +int valeur = 0;  ​
 +float vin = 0;
 +char msg[50];
 +int value = 0;
 +unsigned long readTime;
 +//Buffer qui permet de décoder les messages MQTT reçus
 +char message_buff[100];​
 +long lastMsg = 0;   //​Horodatage du dernier message publié sur MQTT
 +long lastRecu = 0;
 +bool debug = false; ​ //Affiche sur la console si True
 +bool mess = false; ​ // true si message reçu
 +String sujet = "";​
 +String mesg = "";​
 +
 +// Initialize the OLED display using Wire library
 +SSD1306 ​ display(0x3c,​ 4, 5);
 +
 +//​========================================
 +void setup_wifi() {
 +  ​
 +  int cpt = 0;
 +  boolean ssid = true;
 +  delay(10);
 +  int ss = 1;
 +
 +  display.setTextAlignment(TEXT_ALIGN_LEFT);​
 +  display.setFont(ArialMT_Plain_10);​
 +  display.drawString(0,​ 0, "​Connexion au WiFi"​);​
 +
 +  // We start by connecting to a WiFi network
 +  while (WiFi.status() != WL_CONNECTED) {
 +    if (ssid) {
 +      WiFi.begin(ssid1,​ password);
 +    }
 +    else {
 +      ss = 2;
 +      WiFi.begin(ssid2,​ password);
 +    }
 +    if (debug) {
 +        Serial.println();​
 +        Serial.print("​Connecting to ");
 +        if (ss == 1) {
 +          Serial.println(ssid1);​
 +        } else {
 +          Serial.println(ssid2);​
 +        }
 +    }
 +  ​
 +    int counter = 0;
 +    while ((WiFi.status() != WL_CONNECTED) && (cpt <= 20)) {
 +      delay(500);
 +      Serial.print("​."​);​
 +      display.clear();​
 +      display.setTextAlignment(TEXT_ALIGN_LEFT);​
 +      display.drawString(24,​ 0, "​Connecting to WiFi"​);​
 +      display.drawXbm(46,​ 30, 8, 8, counter % 3 == 0 ? activeSymbole : inactiveSymbole);​
 +      display.drawXbm(60,​ 30, 8, 8, counter % 3 == 1 ? activeSymbole : inactiveSymbole);​
 +      display.drawXbm(74,​ 30, 8, 8, counter % 3 == 2 ? activeSymbole : inactiveSymbole);​
 +      display.display();​
 +
 +      counter++;
 +      cpt=cpt+1;
 +//      Serial.print("​."​);​
 +    }
 +    ​
 +    if (cpt >= 20) {
 +      if (ssid) {
 +        ssid=false;
 +      } else {
 +        ssid=true;
 +      }
 +    }
 +  }
 +
 +// Connexion au serveur MQTT
 +  display.clear();​
 +  display.setTextAlignment(TEXT_ALIGN_LEFT);​
 +  display.setFont(ArialMT_Plain_10);​
 +  display.drawString(32,​ 0, "WiFi connecté"​);​
 +  display.drawString(32,​ 20, "IP address"​);​
 +  // On récupère et on prépare le buffer contenant l'​adresse IP attibué à l'​ESP-01
 +  IPAddress ip = WiFi.localIP(); ​  
 +  String ipStr = String(ip[0]) + '​.'​ + String(ip[1]) + '​.'​ + String(ip[2]) + '​.'​ + String(ip[3]);​
 +  ipStr.toCharArray(buffer,​ 20);
 +  display.drawString(30,​ 30, String(ipStr));​
 +  display.display();​
 +  delay(2000);​
 +  display.clear();​
 +  display.setTextAlignment(TEXT_ALIGN_LEFT);​
 +  display.setFont(ArialMT_Plain_10);​
 +  display.drawString(25,​ 0, "​Connecting to MQTT"​);​
 +  display.drawString(32,​ 20, mqtt_server);​
 +  display.display();​
 +  delay(2000);​
 +  if ( debug ) {
 +    Serial.println(""​);​
 +    Serial.println("​WiFi connected"​);​
 +    Serial.print("​IP address: ");
 +    Serial.println(WiFi.localIP());​
 +
 +    Serial.print("​Connecting to ");
 +    Serial.println(mqtt_server);​
 +  }
 +/*  Serial.print("​ as ");
 +  Serial.println(clientName);​
 +*/  ​
 +}
 +
 +//​========================================
 +// Déclenche les actions à la réception d'un message
 +// D'​après http://​m2mio.tumblr.com/​post/​30048662088/​a-simple-example-arduino-mqtt-m2mio
 +void callback(char* topic, byte* payload, unsigned int length) {
 +
 +  // pinMode(lbp,​OUTPUT);​
 +  int i = 0;
 +  if ( debug ) {
 +    Serial.println("​Message recu =>  topic: " + String(topic));​
 +    Serial.print("​ | longueur: " + String(length,​DEC));​
 +  }
 +  sujet = String(topic);​
 +  // create character buffer with ending null terminator (string)
 +  for(i=0; i<​length;​ i++) {
 +    message_buff[i] = payload[i];
 +  }
 +  message_buff[i] = '​\0';​
 +  ​
 +  String msgString = String(message_buff);​
 +  mesg = msgString;
 +  if ( debug ) {
 +    Serial.println("​Payload:​ " + msgString);
 +  }
 +  mess = true;
 +  ​
 +}
 +
 +/*
 +void callback(char* topic, byte* payload, unsigned int length) {
 +  Serial.print("​Message arrived [");
 +  Serial.print(topic);​
 +  Serial.print("​] ");
 +  for (int i = 0; i < length; i++) {
 +    Serial.print((char)payload[i]);​
 +  }
 +  Serial.println();​
 +
 +  // Switch on the LED if an 1 was received as first character
 +  if ((char)payload[0] == '​1'​) {
 +    digitalWrite(BUILTIN_LED,​ LOW);   // Turn the LED on (Note that LOW is the voltage level
 +    // but actually the LED is on; this is because
 +    // it is acive low on the ESP-01)
 +  } else {
 +    digitalWrite(BUILTIN_LED,​ HIGH); ​ // Turn the LED off by making the voltage HIGH
 +  }
 +
 +}
 +*/
 +
 +//​========================================
 +void reconnect() {
 +  // Loop until we're reconnected
 +  int counter = 0;
 +  int compt = 0;
 +  boolean noconnect = true;
 +  // tant qu'il ne trouve pas un serveur affiche rond
 +  while ((!client.connected()) && (noconnect == true)) {
 +    display.clear();​
 +    display.setTextAlignment(TEXT_ALIGN_LEFT);​
 +    display.setFont(ArialMT_Plain_10);​
 +    display.drawString(0,​ 0, "​Attempting MQTT connection"​);​
 +    display.drawXbm(46,​ 30, 8, 8, counter % 3 == 0 ? activeSymbole : inactiveSymbole);​
 +    delay(500);
 +    display.drawXbm(60,​ 30, 8, 8, counter % 3 == 1 ? activeSymbole : inactiveSymbole);​
 +    delay(500);
 +    display.drawXbm(74,​ 30, 8, 8, counter % 3 == 2 ? activeSymbole : inactiveSymbole);​
 +    display.display();​
 +    counter++;
 +    delay(500);
 +
 +    if (debug ) {
 +      Serial.print("​Attempting MQTT connection..."​);​
 +    }
 +    // Attempt to connect
 +    if (client.connect("​ESP8266Client"​)) {
 +      display.clear();​
 +      display.setTextAlignment(TEXT_ALIGN_LEFT);​
 +      display.setFont(ArialMT_Plain_16);​
 +      display.drawString(23,​ 20, "​Connecté sur");
 +      display.drawString(18,​ 38, "​Serveur MQTT !");
 +      display.display();​
 +      if (debug ) {
 +        Serial.println("​connected"​);​
 +      }
 +      // Once connected, publish an announcement...
 +      client.publish("​cuisine",​ "hello world"​);​
 +      // ... and resubscribe
 +      client.subscribe("#"​);​
 +      noconnect=true;​
 +    } else {
 +      display.clear();​
 +      display.setTextAlignment(TEXT_ALIGN_LEFT);​
 +      display.setFont(ArialMT_Plain_10);​
 +      display.drawString(2,​ 0, "On réessaye dans 3 sec");
 +      display.setFont(ArialMT_Plain_16);​
 +      display.drawString(5,​ 20, "​Erreur !");
 +      display.drawString(0,​ 38, "Non Connecté !");
 +      display.display();​
 +      if ( debug ) {
 +        Serial.print("​failed,​ rc=");
 +        Serial.print(client.state());​
 +        Serial.println("​ try again in 5 seconds"​);​
 +      }  ​
 +      // Wait 5 seconds before retrying
 +      if (compt <= 3) {
 +        delay(3000);​
 +        counter=0;
 +        compt++;
 +      } else {
 +        noconnect=false;​
 +      }
 +    }
 +    ​
 +  }
 +  delay(1500);​
 +}
 +
 +//​========================================
 +void sensorRead() {
 +  readTime = millis();
 + // Reading temperature or humidity takes about 250 milliseconds!
 +  // Sensor readings may also be up to 2 seconds '​old'​ (its a very slow sensor)
 +
 +  float h = dht.readHumidity();​
 +  // Read temperature as Celsius (the default)
 +  float t = dht.readTemperature();​
 +  // Read temperature as Fahrenheit (isFahrenheit = true)
 + // float f = dht.readTemperature(true);​
 +
 +  // Check if any reads failed and exit early (to try again).
 +  if (isnan(h) || isnan(t)) { // || isnan(f)) {
 +    Serial.println("​Failed to read from DHT sensor!"​);​
 +    return;
 +  }
 +
 +  display.clear();​
 +  display.setTextAlignment(TEXT_ALIGN_LEFT);​
 +  display.setFont(ArialMT_Plain_10);​
 +  display.drawString(8,​ 0, "Temp + Humidité interne"​);​
 +  display.setFont(ArialMT_Plain_16);​
 +  display.drawString(6,​ 20, "​Température="​ + String(t)+"​ °C");
 +  display.drawString(10,​ 38, "​Humidité="​ + String(h)+"​ %");
 +  display.display();​
 + // delay(500);
 +    ​
 +  char buffer[20];
 +  strcpy(msg, "​Température ");
 +  dtostrf(t,​3,​ 2, buffer);
 +  // On concatene les 2 tab de char
 +  strcat(msg, buffer);
 +  client.publish("​cuisine",​msg);​
 +  //​Serial.println(buffer);​
 +  strcpy(msg, "​Humiditée ");
 +  dtostrf(h,​3,​ 2, buffer);
 +  strcat(msg, buffer);
 +  client.publish("​cuisine",​msg);​
 +  ​
 +  //​client.publish("​cuisine",​sprintf(buf,​ "​%f",​ h));
 +  /​*Serial.print("​Humidity:​ ");
 +  Serial.print(h);​
 +  Serial.print("​ %\t");
 +  Serial.print("​Temperature:​ ");
 +  Serial.print(t);​
 +  Serial.print("​ *C ");
 +  /​*Serial.print(f);​
 +  Serial.print("​ *F\t"​);​
 +  Serial.print("​Heat index: ");
 +  Serial.print(hic);​
 +  Serial.print("​ *C ");
 +  Serial.print(hif);​
 +  Serial.println("​ *F"); */
 +}
 +
 +//​========================================
 +void setup() {
 +  pinMode(haut,​ OUTPUT); ​    // Initialize le mvmt haut
 +  pinMode(arret,​ OUTPUT); ​    // Initialize le mvmt arret
 +  pinMode(bas,​ OUTPUT); ​    // Initialize le mvmt bas
 +  pinMode(lbp,​ INPUT); ​    // Initialize le BP
 +  Serial.begin(115200);​
 +  // Initialising the UI will init the display too.
 +  display.init();​
 +  display.clear();​
 +  ​
 +  //​delay(500);​
 +  ​
 +  display.flipScreenVertically();​
 +  display.setTextAlignment(TEXT_ALIGN_LEFT);​
 +  display.setFont(ArialMT_Plain_16);​
 +  display.drawString(30,​ 31, "​Bonjour"​);​
 +//  delay(1000);​
 +
 +  display.setFont(ArialMT_Plain_10);​
 +  display.drawString(32,​ 0, "Hello world"​);​
 +  display.display();  ​
 +  delay(1500);​
 +  ​
 +    ​
 +  setup_wifi();​
 +  client.setServer(mqtt_server,​ 1883);
 +  client.setCallback(callback);​
 +  dht.begin(); ​                     // initialize temperature sensor
 +  client.subscribe("​mod_cuisine"​);​
 +}
 +
 +//​========================================
 +void loop() {
 +  // test de connection, sinon reconnecte
 +  //int counter = 0;
 +  if (!client.connected()) {
 +    reconnect();​
 +  }
 +  client.loop();​
 +    //​Serial.println("​Lecture du capteur"​);  ​
 +
 +  // affiche message reçu en MQTT
 +  if ( mess ) {
 +    pinMode(lbp,​OUTPUT);​
 +    display.clear();​
 +    display.setTextAlignment(TEXT_ALIGN_LEFT);​
 +    display.setFont(ArialMT_Plain_10);​
 +    display.drawString(25,​ 0, "​Message de MQTT"​);​
 +    display.drawString(32,​ 20, sujet);
 +    display.drawString(32,​ 30, mesg);
 +    display.display();​
 +    delay(1500);​
 +    if ( sujet == "​mod_cuisine"​ ) {
 +      if ( mesg == "​ON"​ ) {
 +        digitalWrite(lbp,​HIGH);  ​
 +      } else {
 +        digitalWrite(lbp,​LOW);  ​
 +      }
 +    }
 +    pinMode(lbp,​INPUT);​
 +    mess = false;
 +  }
 +  ​
 +  ​
 +  // renvoie le niveau de la ldr tous les 10 sec
 +  long now = millis();
 +  if (now - lastMsg > 5000) {
 +    lastMsg = now;
 +    ++value;
 +    snprintf (msg, 50, "hello world #%ld", value);
 +    //​Serial.print("​Publish message: ");
 +    //​Serial.println(msg);​
 +    client.publish("​cuisine",​ msg);
 +
 +  // Lit l’entrée analogique A0 
 +    valeur = analogRead(port);​
 +    //​Serial.print("​valeur = ");
 +    //​Serial.println(valeur); ​  
 +  // convertit l’entrée en volt 
 +    vin = (valeur * 3.3) / 1024.0; ​
 +    //​Serial.print("​volt = ");
 +    //​Serial.println(vin); ​
 +    display.clear();​
 +    display.setTextAlignment(TEXT_ALIGN_LEFT);​
 +    display.setFont(ArialMT_Plain_10);​
 +    display.drawString(14,​ 0, "​Luminosité interne"​);​
 +    display.setFont(ArialMT_Plain_16);​
 +    display.drawString(25,​ 20, "​Niv="​ + String(valeur));​
 +    display.drawString(18,​ 38, "​Volts="​ + String(vin));​
 +    display.display();​
 +    delay(1500);​
 +    snprintf (msg, 50, "​Luminosité %ld", valeur);
 +    client.publish("​cuisine",​ msg);
 +    ​
 +    while (now - lastMsg > 10000) {
 +      Serial.print("​compteur:​ "+ (now-lastMsg));​
 +    }
 +        ​
 +    //​Serial.println("​Lecture du capteur"​); ​
 +    sensorRead();​
 +    delay(1500);​
 +  }
 +}
 +  ​
 +
 +/*
 +void DHT11() {
 +
 +    // Grab the current state of the sensor
 +    int humidity_data = (int)dht.readHumidity();​
 +    int temperature_data = (int)dht.readTemperature();​
 +
 +  // Publish data
 +    if (! temperature.publish(temperature_data))
 +      Serial.println(F("​Failed to publish temperature"​));​
 +    else
 +      Serial.println(F("​Temperature published!"​));​
 +
 +    if (! humidity.publish(humidity_data))
 +      Serial.println(F("​Failed to publish humidity"​));​
 +    else
 +      Serial.println(F("​Humidity published!"​));​
 +
 +    // Setup feeds for temperature & humidity
 +const char TEMPERATURE_FEED[] PROGMEM = AIO_USERNAME "/​feeds/​temperature";​
 +Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&​mqtt,​ TEMPERATURE_FEED);​
 +
 +const char HUMIDITY_FEED[] PROGMEM = AIO_USERNAME "/​feeds/​humidity";​
 +Adafruit_MQTT_Publish humidity = Adafruit_MQTT_Publish(&​mqtt,​ HUMIDITY_FEED);​
 +      ​
 +}
 +*/
 +
 +</​code>​
projets/automate2/prog.txt · Dernière modification: 2019/08/13 12:16 (modification externe)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0