Auteur Sujet: Wemos D1 ThingSpeak ArduinoOTA  (Lu 8642 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne demosat

  • Membre Héroïque
  • *****
  • Messages: 892
Wemos D1 ThingSpeak ArduinoOTA
« le: 24 mai 2017 à 18:39:53 »
Salut,
 
C'est un sujet qui n'a rien à voir avec le sat  ;D

Je me lance depuis peu suite à différentes lecture d'instructable sur l'Arduino, vers un future projet de gestion d'arrosage de mes plantations en serre et en extérieur.

Donc pour commencer je me lance sur un truc simple pour l'arrosage d'une partie des plantations de ma serre.
Ceci afin de bien piger le bidule de base.

La configuration est la suivante avec un Wemos D1, un capteur de température ambiante, un capteur d'humidité du sol, un relais et une électro vanne et un afficheur LCD keypad.

A ce jour le programme me permet de connaitre la température et l'humidité ambiante de la serre à titre d'information pour le moment,
j'envisage dans le future de profiter de ces données pour une commande de ventilation/chauffage,
les données du capteur d'humidité du sol sont utilisées pour commander le couple relais/électrovanne d'arrosage.

L'afficheur LCD lui m'informe de ces données, Température °C - Humidité de l'air % et Humidité du sol en %.



Il y a aussi une partie du programme pour un accès à un serveur distant (ThingPeak) me permettant de connaitre l'état des lieux sur mon smartphone et pc.




Jusque ici tout fonctionne bien... et puis je découvre la fonction OTA qui est disponible sur le Wemos D1 avec son esp8266 embarqué.
Du coup je me dis super je vais pouvoir faire les mises à jour du module Wemos D1 à distance.

Effectivement cela fonctionne pour OTA...sauf que j'ai un pépin que je n'arrive pas à solutionner et ne trouve pas de cas similaire sur le web.

Mon pépin et qu'après un flash du programme avec les variables de l'OTA je ne n'ai plus de données de mon capteur DTH, uniquement celle
du capteur de sol.



Si je flash a nouveau en commentant l'accès pour la partie ThingSpeak, les capteurs fonctionnent.

Y a t-il un œil averti dans l'assemblé pour me dire ce qui pêche
/****************************************************************
 * ArduPotager
 ****************************************************************/
#include <ESP8266WiFi.h>
//#include <ESP8266mDNS.h>                // for OTA updates uncomment if required
//#include <WiFiUdp.h>                    // for OTA updates uncomment if required
//#include <ArduinoOTA.h>                 // for OTA updates uncomment if required
#include <LiquidCrystal.h> // Librairie pour l'écran LCD
LiquidCrystal lcd(D8, D9, D4, D5, D6, D7); // Initialisation de l'écran LCD avec les numéros des pins utilisés

#include <DHT.h> // Include DHT Library

// replace with your channel’s thingspeak API key and your SSID and password
String apiKey = "***************";
const char* ssid = "***********";
const char* password = "*******";

// Sensor definitions
#define DHTPIN D3        // DHT data pin D3
#define DHTTYPE DHT11    // DHT 22 (if your sensor is the DHT 11, only change this line by: #define DHTTYPE DHT11)

const int SOIL_MOIST_1 = A0; // used for Soil Moisture Sensor Input
const int SOIL_MOIST_Power_1 = D14; // used for Soil Moisture Sensor "Power Supply" (VCC)
const int VANNE_RELAIS_1 = D2;

// Variables to be used by Sensor
int soilMoist_1;

float fltHumidity; //Pourcentage d'humidité mesuré
float fltTemperature; //Température mesurée en Celsius

// Initialize the DHT sensor
DHT dht(DHTPIN, DHTTYPE);

WiFiClient client;

/*************************************************************
* ---------------- Define Special Characters-----------------*
*  0=degré sign                                              *
*  1=thermometre                                             *
*  2=goute d'humidité                                        *
*  3=capteur d'humiditér soil moisture                       *
*  4=pump                                                    *
//************************************************************/
const uint8_t charBitmap[][8] =
{
  {
    // symbole du degré coorespondance char(223)
    B00110,  // --XX-
    B01001,  // -X--X
    B01001,  // -X--X
    B00110,  // --XX-
    B00000,  // -----
    B00000,  // -----
    B00000,  // -----
    B00000   // -----
    //  0x6, 0x9, 0x9, 0x6, 0, 0, 0, 0
  }
  ,
  {
    // thermometre
    B00100,  // --X--
    B01010,  // -X-X-
    B01010,  // -X-X-
    B01110,  // -XXX-
    B01110,  // -XXX-
    B11111,  // XXXXX
    B11111,  // XXXXX
    B01110   // -XXX-
  }
  ,
  {
    // goute humidité
    B00100,  // --X--
    B00100,  // --X--
    B01010,  // -X-X-
    B01010,  // -X-X-
    B10001,  // X---X
    B10001,  // X---X
    B10001,  // X---X
    B01110   // -XXX-
  }
  ,
  {
    // capteur humidité
    0b00100,  // --X--
    0b01110,  // -XXX-
    0b01010,  // -X-X-
    0b01010,  // -X-X-
    0b01010,  // -X-X-
    0b01010,  // -X-X-
    0b01010,  // -X-X-
    0b00000   // -----
  }
  ,
  {
    //pomp
    B01010,  // -X-X-
    B00100,  // --X--
    B00100,  // --X--
    B00100,  // --X--
    B11111,  // XXXXX
    B11011,  // XX-XX
    B11111   // XXXXX
  }
};

void setup()
{
  pinMode(SOIL_MOIST_1, INPUT);
  pinMode(SOIL_MOIST_Power_1, OUTPUT);
  pinMode(VANNE_RELAIS_1, OUTPUT);

  // Initialize Relay
  digitalWrite(VANNE_RELAIS_1, HIGH);

   // Setup LCD.
  lcd.begin(16, 2); //On indique le nombre de colonnes et de lignes de l'écran
 
  //upload defined characters to LCD
  int charBitmapSize = (sizeof(charBitmap ) / sizeof (charBitmap[0]));
  for ( int i = 0; i < charBitmapSize; i++ )
    {
      lcd.createChar ( i, (uint8_t *)charBitmap[i] );
    }
  lcd.clear();
  lcd.setCursor(0, 0); //Positionnement du curseur
  lcd.print("ArduPotager");

  dht.begin();
 
  // Setup serial monitor.
  Serial.begin(9600);
  Serial.println();
  Serial.println();
  Serial.println("ArduPotager");
  Serial.println();
  Serial.print("Connection au réseau ");
  Serial.println(ssid);
   
  WiFi.begin(ssid, password);
   
  while (WiFi.status() != WL_CONNECTED)
    {
    delay(500);
    Serial.print(".");
    }
  Serial.println();
  Serial.println("WiFi connecté");
  lcd.setCursor(0, 1); //Positionnement du curseur
  lcd.print("WiFi connected");
  delay(1500);

//  ArduinoOTA.begin();                   // for OTA updates uncomment if required

}

void loop()
{
//  ArduinoOTA.handle();                   // for OTA updates uncomment if required
  readSensors();
  printData();
  showDataLCD();
  thingspeak();
}

/***************************************************
*      Capture de la sonde de température DTH      *
***************************************************/
void readSensors(void)
{
  fltHumidity = dht.readHumidity();
  fltTemperature = dht.readTemperature();
 
  if (isnan(fltHumidity) || isnan(fltTemperature)){
            Serial.println( "Lecture impossible !");
      }else{
            printData();
     }
     
  soilMoist_1 = getSoilMoist_1();
}

/***************************************************
*      Capture Data du capteur d'humidité      *
***************************************************/
int getSoilMoist_1()
{
  int sensorValue1 = 0;
    digitalWrite(SOIL_MOIST_Power_1,HIGH);
    delay(5);
        sensorValue1 = analogRead(SOIL_MOIST_1);
        Serial.print(" sensorValue1 = ");
        Serial.print(sensorValue1);
    digitalWrite(SOIL_MOIST_Power_1,LOW);
sensorValue1 = constrain (sensorValue1, 150, 990);
sensorValue1 = map(sensorValue1, 990, 150, 0, 100); 
      if (sensorValue1 <= 30)
        { digitalWrite(VANNE_RELAIS_1,LOW); }
        else
        { digitalWrite(VANNE_RELAIS_1,HIGH); }
  return sensorValue1;
}

/***************************************************
* Affichage des informations sur le Serial Monitor *
***************************************************/
void printData(void)
{
  Serial.print("   Temp DHT = ");
  Serial.print(fltTemperature);
  Serial.print("°C  Hum DHT = ");
  Serial.print(fltHumidity);
  Serial.print("%  Soil Moisture 1 = ");
  Serial.println(soilMoist_1);
}

/*********************************************
* Affichage des informations sur l'écran LCD *
*********************************************/
void showDataLCD(void)
{
 
  lcd.clear(); //On efface tout ce qui se trouve sur l'écran
  lcd.setCursor(0, 0); //Positionnement du curseur
  lcd.print(char(1)); //Affichage du thermometre
  lcd.setCursor(2, 0);
  lcd.print(fltTemperature); //Affichage de la température
  lcd.setCursor(6, 0);
  lcd.print(char(0)); //Affiche le caractère ° (degrés)
  lcd.setCursor(7, 0);
  lcd.print("C");
  lcd.setCursor(9, 0);
  lcd.print(char(2)); //Affichage de la goute d'humidité
  lcd.setCursor(11, 0);
  lcd.print(fltHumidity); //Affichage de l'humidité
  lcd.setCursor(15, 0);
  lcd.print("%");
  lcd.setCursor(0, 1); // position curseur ligne 2
  lcd.print(char(3)); // capteur de sol
  lcd.setCursor(1, 1);
  lcd.print("1");
  lcd.setCursor(3, 1);
  lcd.print(soilMoist_1);
  lcd.setCursor(6, 1);
  lcd.print("%");   
}

/*********************************************
*            Prepare thingspeak              *
*********************************************/
void thingspeak(void)
{
    if (client.connect("api.thingspeak.com",80)) {
      String postStr = apiKey;
      postStr +="&field1=";
      postStr += String(fltTemperature);
      postStr +="&field2=";
      postStr += String(fltHumidity);
      postStr +="&field3=";
      postStr += String(soilMoist_1);
      postStr += "\r\n\r\n";
       
      client.print("POST /update HTTP/1.1\n");
      client.print("Host: api.thingspeak.com\n");
      client.print("Connection: close\n");
      client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
      client.print("Content-Type: application/x-www-form-urlencoded\n");
      client.print("Content-Length: ");
      client.print(postStr.length());
      client.print("\n\n");
      client.print(postStr);
      delay(100);
      Serial.println(" Transmission des Data vers Thingspeak");
      client.flush();
      client.stop();
    }

  Serial.println("Patienter 20 secs"); // Thingspeak a besoin d'un délai de 15 secondes entre les mises à jour
  delay(20000);
 
}



Hors ligne pr2

  • Modérateur
  • Membre Héroïque
  • *****
  • Messages: 1.781
Re: Wemos D1 ThingSpeak ArduinoOTA
« Réponse #1 le: 24 mai 2017 à 22:13:44 »
Pourquoi dans ce que tu postes tu as ceci?

#include <DHT.h> // Include DHT Library

Si la ligne qui fait l'include des librairies pour gérer ton DHT à mon avis celle-ci ne sont pas connue par ton programme et donc il ne fonctionne pas correctement.

Maintenant si tu fais une mise à jour OTA il faut aussi lire les changements relatif à cette nouvelle version, peut-être que la librairie DHT est devenue obsolète et remplacée par une nouvelle version ou a été inclue dans une autre librairie et du coup la ligne d'include a été commentée par la mise à jour pour attirer ton attention sur le fait que celle-ci a changé.

Pr2
VU+ Solo 4K: Astra 19.2E - Hotbird 13.0E - Eutelsat5A 5.0W + 2 * DVB-C/T/T2
Octagon SF-4008: 2*DVB-S2 + DVB-C
Zgemma H5C & H7C

Hors ligne Doume

  • The Boss
  • Administrateur
  • Membre Héroïque
  • *****
  • Messages: 6.185
  • Administrateur
    • Doume
Re: Wemos D1 ThingSpeak ArduinoOTA
« Réponse #2 le: 24 mai 2017 à 23:40:12 »
#include est une macro, pas un commentaire !

A l'issue d'une mise à jour OTA, le système relance la séquence init, qui doit resetter chaque GPIO, chaque module de gestion.
A mon avis, c'est de ce côté que tu dois chercher

Regarde la librairie libteleinfo, ou ESPEASY sketch, qui eux, gèrent correctement le redémarrage après mise à jour OTA
J'ai tous les droits, je suis chez moi.
Au moindre non-respect des règles, je vire les importuns.

Hors ligne demosat

  • Membre Héroïque
  • *****
  • Messages: 892
Re: Wemos D1 ThingSpeak ArduinoOTA
« Réponse #3 le: 25 mai 2017 à 00:22:43 »
Merci du conseil je vais regarder cela.

Hors ligne demosat

  • Membre Héroïque
  • *****
  • Messages: 892
Re: Wemos D1 ThingSpeak ArduinoOTA
« Réponse #4 le: 25 mai 2017 à 00:50:24 »
C'est en lisant ce passage Intégrer l'OTA à un programme existant de cette article ici
Que j'ai ajouté ces lignes (commentés dans le copier coller du post)

Donc je voulais profiter de la possibilité de la mise à jour du module en OTA plutôt que par le branchement de celui-ci via le port com du pc.

A l'issue d'une mise à jour OTA, le système relance la séquence init, qui doit resetter chaque GPIO, chaque module de gestion.

En faite je crois qu'il y a un conflit avec la partie ThingSpeak avec en prime moi le boulet devant le clavier ;)
Car lorsque que je commente la ligne thingspeak(); dans le Void loop j'ai bien les valeurs de température et humidité du DTH.







Hors ligne Doume

  • The Boss
  • Administrateur
  • Membre Héroïque
  • *****
  • Messages: 6.185
  • Administrateur
    • Doume
Re: Wemos D1 ThingSpeak ArduinoOTA
« Réponse #5 le: 25 mai 2017 à 09:21:30 »
Attention, sur Arduino ou Wemos, les séquences de gestion des périphériques et les timers sont des threads asynchrones...
Donc il n'est pas exclu que lors de ton 1er appel à thingspeak() , le thread de prélèvement de la mesure DHT n'ait pas encoré été activé, ou qu'il n'ait pas terminé sa mesure.
Tu peux peut-être essayer de différer le 1er appel à thingspeak ? afin de stabiliser les valeurs stockées dans des variables globales...

J'ai tous les droits, je suis chez moi.
Au moindre non-respect des règles, je vire les importuns.

Hors ligne demosat

  • Membre Héroïque
  • *****
  • Messages: 892
Re: Wemos D1 ThingSpeak ArduinoOTA
« Réponse #6 le: 25 mai 2017 à 11:36:26 »
Je suis en train de refaire le programme depuis le début étape par étape... et je suis sur la bonne voie.
1°) Wemos + DTH avec connexion au réseau domestique OK
2°) Wemos + DTH + Thingspeak => OK.
3°) wemos + DTH + Thingspeak + OTA => OK

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>                // for OTA updates uncomment if required
#include <WiFiUdp.h>                    // for OTA updates uncomment if required
#include <ArduinoOTA.h>                 // for OTA updates uncomment if required

#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN D3       // Digital pin du signal
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);

// WiFiClient client;
char ssid[] = "*******";       //  your network SSID (name)
char pass[] = "*******";          // your network password
String apiKey = "********";  // key ecriture ThingSpeak
WiFiClient client;                   // déclaration client ThingSpeak

int status = WL_IDLE_STATUS;         // the Wifi radio's status

int ThingSpeakTemp = dht.readHumidity();
int ThingSpeakHumid = dht.readTemperature();



void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);

  WiFi.begin(ssid, pass);
  
  while (WiFi.status() != WL_CONNECTED)
    {
    delay(500);
    Serial.print(".");
    }
  Serial.println();
  Serial.println("WiFi connecté");
  delay(1500);

  // you're connected now, so print out the data:
  Serial.print("You're connected to the network");
  printCurrentNet();
  printWifiData();
 
  Serial.println("DHT11 test!");
  dht.begin();
  
  ArduinoOTA.begin();                   // for OTA updates uncomment if required
}

void loop() {
  
  ArduinoOTA.handle();                   // for OTA updates uncomment if required
  
  delay(10000);
  mesureDTH();
  thingspeak();
}

void printWifiData() {
  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
  
  // print your MAC address:
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  Serial.print(mac[5], HEX);
  Serial.print(":");
  Serial.print(mac[4], HEX);
  Serial.print(":");
  Serial.print(mac[3], HEX);
  Serial.print(":");
  Serial.print(mac[2], HEX);
  Serial.print(":");
  Serial.print(mac[1], HEX);
  Serial.print(":");
  Serial.println(mac[0], HEX);

}

void printCurrentNet() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
}

 
void mesureDTH() {
  // 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;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.println();
  Serial.println("Data vers Monitor serie");
  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");
}

/*********************************************
*            Prepare thingspeak              *
*********************************************/
void thingspeak(void)
{
  
  ThingSpeakTemp = dht.readTemperature();
  ThingSpeakHumid = dht.readHumidity();
 
    if (client.connect("api.thingspeak.com",80)) {
      String postStr = apiKey;
      postStr +="&field1=";
      postStr += String(ThingSpeakTemp);
      postStr +="&field2=";
      postStr += String(ThingSpeakHumid);
      postStr += "\r\n\r\n";
      
      client.print("POST /update HTTP/1.1\n");
      client.print("Host: api.thingspeak.com\n");
      client.print("Connection: close\n");
      client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
      client.print("Content-Type: application/x-www-form-urlencoded\n");
      client.print("Content-Length: ");
      client.print(postStr.length());
      client.print("\n\n");
      client.print(postStr);
      delay(100);
      Serial.println();
      Serial.println(" Transmission des Data vers Thingspeak");
      Serial.print("Temperature: ");
      Serial.print(ThingSpeakTemp);
      Serial.print(" %\t");
      Serial.print("Humidity: ");
      Serial.print(ThingSpeakHumid);
      Serial.print(" %\t");
      Serial.println();
      client.flush();
      client.stop();
    }
  
}


Me reste à intégrer l'afficheur LCD, le capteur de sol et le relais.
Je vais pouvoir tester l'OTA pour l'ajout des éléments et surement revoir les temporisations pour l'envoi des data.

 

Hors ligne demosat

  • Membre Héroïque
  • *****
  • Messages: 892
Re: Wemos D1 ThingSpeak ArduinoOTA
« Réponse #7 le: 25 mai 2017 à 20:05:44 »
Voila c'est terminé pour cette partie, je ne suis pas pleinement satisfait mais cela semble fonctionner correctement depuis un bon moment (je n'ai pas vu le temps passé)  :P

Pour une première fois, je vais me satisfaire de cela ... moi qui n'y connais rien et qui fonce dedans les yeux fermés.
Encore un nouveau truc avec lequel je vais passé un peu .. beaucoup de temps.  :)

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>                // for OTA updates uncomment if required
#include <WiFiUdp.h>                    // for OTA updates uncomment if required
#include <ArduinoOTA.h>                 // for OTA updates uncomment if required
#include <LiquidCrystal.h>              // Librairie pour l'écran LCD
LiquidCrystal lcd(D8, D9, D4, D5, D6, D7); // Initialisation de l'écran LCD avec les numéros des pins utilisés

#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN D3                      // Digital pin du signal
#define DHTTYPE DHT11                  // DHT 11
DHT dht(DHTPIN, DHTTYPE);

const int SOIL_MOIST_1 = A0;        // used for Soil Moisture Sensor Input
const int SOIL_MOIST_Power_1 = D14; // used for Soil Moisture Sensor "Power Supply" (VCC)
const int VANNE_RELAIS_1 = D2;     

// WiFiClient client;
char ssid[] = "**********";       // your network SSID (name)
char pass[] = "********";          // your network password
String apiKey = "***********";  // key ecriture ThingSpeak
WiFiClient client;                   // déclaration client ThingSpeak

int status = WL_IDLE_STATUS;         // the Wifi radio's status

// Variables to be used by Sensor
int sensorValue1;
int ThingSpeakHumid = dht.readHumidity();
int ThingSpeakTemp = dht.readTemperature();

/*************************************************************
* ---------------- Define Special Characters----------------*/
const uint8_t charBitmap[][8] =
{
  { // symbole du degré coorespondance char(223)
    B00110, B01001, B01001, B00110, B00000, B00000, B00000, B00000
  }
  ,
  { // thermometre
    B00100, B01010, B01010, B01110, B01110, B11111, B11111, B01110
  }
  ,
  { // goute humidité
    B00100, B00100, B01010, B01010, B10001, B10001, B10001, B01110
  }
  ,
  { // capteur humidité
    B00100, B01110, B01010, B01010, B01010, B01010, B01010, B00000
  }
};


void setup() {

  pinMode(SOIL_MOIST_1, INPUT);
  pinMode(SOIL_MOIST_Power_1, OUTPUT);
  pinMode(VANNE_RELAIS_1, OUTPUT);

  // Initialize Relay
  digitalWrite(VANNE_RELAIS_1, HIGH);
 
  //Initialize serial and wait for port to open:
  Serial.begin(9600);

  WiFi.begin(ssid, pass);
   
  while (WiFi.status() != WL_CONNECTED)
    {
    delay(500);
    Serial.print(".");
    }
  Serial.println();
  Serial.println("WiFi connecté");
  delay(1500);

  // you're connected now, so print out the data:
  Serial.print("You're connected to the network");
  printCurrentNet();
  printWifiData();
 
  Serial.println("DHT11 test!");
  dht.begin();
 
  // Setup LCD.
  lcd.begin(16, 2); //On indique le nombre de colonnes et de lignes de l'écran
 
  //upload defined characters to LCD
  int charBitmapSize = (sizeof(charBitmap ) / sizeof (charBitmap[0]));
  for ( int i = 0; i < charBitmapSize; i++ )
    {
      lcd.createChar ( i, (uint8_t *)charBitmap[i] );
    }
  lcd.clear();
  lcd.setCursor(2, 0); //Positionnement du curseur
  lcd.print("ArduPotager");
   
  ArduinoOTA.begin();                   // for OTA updates uncomment if required
}

void loop() {
 
  ArduinoOTA.handle();                   // for OTA updates uncomment if required
 
  mesureDTH();
  thingspeak();

}

void printWifiData() {
  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
   
   
  // print your MAC address:
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  Serial.print(mac[5], HEX);
  Serial.print(":");
  Serial.print(mac[4], HEX);
  Serial.print(":");
  Serial.print(mac[3], HEX);
  Serial.print(":");
  Serial.print(mac[2], HEX);
  Serial.print(":");
  Serial.print(mac[1], HEX);
  Serial.print(":");
  Serial.println(mac[0], HEX);

}

void printCurrentNet() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
}

 
void mesureDTH() {

  // 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();
 
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println( "Lecture impossible !");
    return;
  }

   // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  sensorValue1 = 0;
    digitalWrite(SOIL_MOIST_Power_1,HIGH);
    delay(5);
        sensorValue1 = analogRead(SOIL_MOIST_1);
        // Serial.print("relevé capt./sol = ");
        // Serial.print(sensorValue1);
    digitalWrite(SOIL_MOIST_Power_1,LOW);
    sensorValue1 = constrain (sensorValue1, 150, 990);
    sensorValue1 = map(sensorValue1, 990, 150, 0, 100); 
      if (sensorValue1 <= 30)
        { digitalWrite(VANNE_RELAIS_1,LOW); }
        else
        { digitalWrite(VANNE_RELAIS_1,HIGH); }
 
  Serial.println();
    Serial.print("Température: ");
  Serial.print(t);
  Serial.print("°C\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print("°C\t");
  Serial.print("Humidité de l'air: ");
  Serial.print(h);
  Serial.print("%\t");
  Serial.print("Capteur de sol = ");
  Serial.print(sensorValue1);
  Serial.println("%\t");
 
  lcd.clear(); //On efface tout ce qui se trouve sur l'écran
  lcd.setCursor(0, 0); //Positionnement du curseur
  lcd.print(char(1)); //Affichage du thermometre
  lcd.setCursor(2, 0);
  lcd.print(t); //Affichage de la température
  lcd.setCursor(6, 0);
  lcd.print(char(0)); //Affiche le caractère ° (degrés)
  lcd.setCursor(7, 0);
  lcd.print("C");
  lcd.setCursor(9, 0);
  lcd.print(char(2)); //Affichage de la goute d'humidité
  lcd.setCursor(11, 0);
  lcd.print(h); //Affichage de l'humidité
  lcd.setCursor(15, 0);
  lcd.print("%");
  lcd.setCursor(0, 1); // position curseur ligne 2
  lcd.print(char(3)); // capteur de sol
  lcd.setCursor(1, 1);
  lcd.print("1");
  lcd.setCursor(3, 1);
  lcd.print(sensorValue1);
  lcd.setCursor(6, 1);
  lcd.print("%");

}



/*********************************************
*            Prepare thingspeak              *
*********************************************/
void thingspeak(void)
{
 
  ThingSpeakTemp = dht.readTemperature();
  ThingSpeakHumid = dht.readHumidity();
 
    if (client.connect("api.thingspeak.com",80)) {
      String postStr = apiKey;
      postStr +="&field1=";
      postStr += String(ThingSpeakTemp);
      postStr +="&field2=";
      postStr += String(ThingSpeakHumid);
      postStr +="&field3=";
      postStr += String(sensorValue1);
      postStr += "\r\n\r\n";
       
      client.print("POST /update HTTP/1.1\n");
      client.print("Host: api.thingspeak.com\n");
      client.print("Connection: close\n");
      client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
      client.print("Content-Type: application/x-www-form-urlencoded\n");
      client.print("Content-Length: ");
      client.print(postStr.length());
      client.print("\n\n");
      client.print(postStr);
      delay(100);
      Serial.println();
      Serial.println("Data vers Thingspeak");
      Serial.print("Température: ");
      Serial.print(ThingSpeakTemp);
      Serial.print(" %\t");
      Serial.print("Humidité de l'air: ");
      Serial.print(ThingSpeakHumid);
      Serial.print(" % \t");
      Serial.print("Humidité du sol: ");
      Serial.print(sensorValue1);
      Serial.print(" %");
      Serial.println();
      client.flush();
      client.stop();
    }
  delay(17000);
}


Hors ligne Doume

  • The Boss
  • Administrateur
  • Membre Héroïque
  • *****
  • Messages: 6.185
  • Administrateur
    • Doume
Re: Wemos D1 ThingSpeak ArduinoOTA
« Réponse #8 le: 25 mai 2017 à 20:44:40 »
Depuis que j'ai découvert les Wemos, j'ai adopté le truc...
J'en ai 8 en service chez moi !
Depuis la Teleinfo EDF, jusqu'aux capteurs de T°, humidité, et des relais
Le tout administré via le package Domoticz sur Raspberry Pi
Je me suis amusé à modifier le package ESPEASY (pour rajouter l'OTA)
Et quelques modifs dans Wifinfo

C'est d'une simplicité déroutante, ce truc Arduino IDE !
Et pour moins de 3€ par module, faut pas s'en priver !

Ma seule déception pour l'instant, c'est le manque de précision des capteurs DHT11
Mieux vaut opter pour des DHT22 !
J'ai tous les droits, je suis chez moi.
Au moindre non-respect des règles, je vire les importuns.

Hors ligne demosat

  • Membre Héroïque
  • *****
  • Messages: 892
Re: Wemos D1 ThingSpeak ArduinoOTA
« Réponse #9 le: 25 mai 2017 à 22:14:11 »
Oui j'ai aussi un DTH 22 mais déjà pris sur un Uno et j'attends d'autres bricoles Nano 3, ESP8266-esp01, nrfl2401, ds1820, bmp180 en commande pour compléter le début de la collection.
Je découvre et au fur et à mesure il me manque toujours un truc.

Je me suis mal documenté au départ sur le Wemos et mes deux Wemos D1 ne sont ni R2 ni mimi.

J'aurais bien aimer connaitre ces trucs 30 ans en arrière... :)


Hors ligne Doume

  • The Boss
  • Administrateur
  • Membre Héroïque
  • *****
  • Messages: 6.185
  • Administrateur
    • Doume
Re: Wemos D1 ThingSpeak ArduinoOTA
« Réponse #10 le: 25 mai 2017 à 22:51:55 »


J'aurais bien aimer connaitre ces trucs 30 ans en arrière... :)



Je me suis fait la même réflexion !
De tels modules n'existaient bien sûr pas, mais surtout les prix pratiqués sur les automates étaient dissuasifs !

Pour les Wemos, les versions R2, et Pro, bien que proposant 16M de flash, ne sont utilisés par Arduino IDE que sur 4 M !
Donc , à part des sketches monstrueux, on n'est pas prêt de les saturer !
J'ai tous les droits, je suis chez moi.
Au moindre non-respect des règles, je vire les importuns.

Hors ligne souldream

  • V.I.P.
  • Membre Complet
  • ****
  • Messages: 100
Re: Wemos D1 ThingSpeak ArduinoOTA
« Réponse #11 le: 17 juillet 2017 à 08:21:37 »
Il y a des kits tout faits ?

Là je me suis fait chié amusé à reversé le protocol Wireless utilisé par ma chaudière au charbon.
Entre la sonde sans fil et le récepteur de la chaudière.
Au départ pour la consommation, j'utilise une feuille pour savoir le nombre de sac dans la trémie chaque demi-semaine/semaine ...  mouaip faut pas rigoler :D

Les contraintes sont nombreuses :

* Pas de vérification en ligne ( téléphone ) alors que toute la maison est en CPL  ;D
* La sonde donne une valeur de températeur ambiante en rapport à une valeur virtuelle ( sais pas si je me suis fait comprendre ), en clair on prend la température de référence 23° ... et on soustrait ou ajoute par rapport à la vrai valeur ... sans oublier que si le module wireless avec les piles est out, elle se dérègle ... faut remettre à niveau ...
* L'horodateur est sur des blocks d'heures compléte, 1 semaine ... sur 1 température fixe ( example 21°c ) , donc avec l'envoie je peux créer moi même la températeur par minutes / jours / semaines et avoir plusieurs température de référence ( nuit / jour / weekend / absence / vacances ... / hiver ).

Donc ... j'ai sniffé le signal avec un module SDR , reversé le protocol ... et je me suis amusé avec 1 bout de fil ( mesuré sur la FREQ ) sur le GPIO du rapsberry Pi à émettre...donc j'ai les relevés ( extérieur / intérieur ) avec des graphs style snmp ....

Je devrais mettre le tout dans un beau boitier avec un OLED ... mais bon le temps , tic tac tic tac ... quand on aime trop de domaine on s'éparpille :-)

Mais si il y a plus facile :D

Hors ligne Doume

  • The Boss
  • Administrateur
  • Membre Héroïque
  • *****
  • Messages: 6.185
  • Administrateur
    • Doume
Re: Wemos D1 ThingSpeak ArduinoOTA
« Réponse #12 le: 17 juillet 2017 à 09:01:30 »
Franchement, monter un Wemos avec un DHT 22, flasher le soft , c'est maxi 1 heure, surtout pour souder les connecteurs sur la Wemos...
Après, tu l'interroges via une interface Web, ou une requête Json
J'ai tous les droits, je suis chez moi.
Au moindre non-respect des règles, je vire les importuns.

Hors ligne demosat

  • Membre Héroïque
  • *****
  • Messages: 892
Re: Wemos D1 ThingSpeak ArduinoOTA
« Réponse #13 le: 17 juillet 2017 à 14:12:47 »
Il en existe plusieurs de modules avec le wifi intégré.
http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family

Dans le genre gadget thermomètre wifi indispensable qui ne sert a rien, je m'en suis fait un à partir d'un ESP-01 et d'une sonde étanche DS18B20 pour ma piscine.