envoyer données lues d'un anémomète sur un écran LCD 16x2 avec Wemos D1 mini pro

Bonjour j'ai réalisé un minuscule montage anémomètre avec une carte arduino NANO qui donne la vitesse du vent sur le moniteur serie.

Le code ci-dessous fonctionne parfaitement. Je dispose depuis peu d'une carte WEMOS D1 mini pro et j'aurai souhaité transmettre la lecture du vent sur un LCD 16x2 dans ma cuisine.

Quelqu'un pourrait-il m'expliquer la procédure à suivre pour transmettre cette donnée par wifi?

Merci

const int m_time = 5;      //Meassuretime in Seconds
int wind_ct = 0;
float wind = 0.0;
unsigned long time = 0;


void setup()
{
  Serial.begin(9600);
  time = millis();
}

void loop()
{

  meassure();

  Serial.print("Windgeschwindigkeit: ");
  Serial.print(wind);       //Speed in Km/h
  Serial.print(" km/h - ");
  Serial.print(wind / 3.6); //Speed in m/s
  Serial.println(" m/s");

}

void countWind() {
  wind_ct ++;
}

void meassure() {
  wind_ct = 0;
  time = millis();
  attachInterrupt(1, countWind, RISING);
  delay(1000 * m_time);
  detachInterrupt(1);
  wind = (float)wind_ct / (float)m_time * 2.4;
}

Bonjour

Très grossièrement, wemos D1 c'est comme un arduino avec le wifi en plus.

En remplaçant ton arduino nano par un wemos, celui-ci pourra devenir un mini serveur web présent sur ton reseau local. Il aura une adresse ip, du genre 192.168.1.45 (selon la box) et il sera possible de l'interroger à distance depuis n'importe quel autre appareil connecté à ton réseau : un PC, un smartphone, une tablette, etc.

...et aussi depuis un second wemos D1, installé dans ta cuisine, et relié à un LCD.

...ou encore depuis un raspberry pi, où il y aura une base de donnée pour stocker l'historique des relevés anémométriques, ainsi qu'un serveur web un peu plus musclé permettant de restituer des courbes d'historique.

Merci donc il faut deux wemos si je veux réaliser mon projet, un émetteur et un récepteur si je puis dire.
Je vais chercher un projet de ce genre réalisé sur le web pour comprendre les bases.
Merci.

Oui

La première étape peut être mise en place indépendamment de la seconde. Commence par un wemos raccordé à ton anémomètre, qui retourne une simple page html contenant la valeur relevée.

Tu trouveras plein d'exemples sur le web, majoritairement avec des capteurs de température mais le principe est le même.

Et depuis ton PC (ou tablette & co), via un simple navigateur, il te suffira d'interroger l'adresse ip du wemos.

Voilà après recherche comme vous l’avez expliqué j’essaye d’afficher la vitesse du vent sur une page web. Malheureusement le "usigned long pose problème le wemos D1 mini ne l’accepte pas. Avez-vous une idée pour résoudre ce problème? Voici le code

#include <ESP8266WiFi.h>
 
const char* ssid = "xxxxxxx";
const char* password = "xxxxx";
WiFiServer server(80);

const int m_time = 5;      //Meassuretime in Seconds
int wind_ct = 0;
float wind = 0.0;
unsigned long time = 0;
 
void setup() {
  Serial.begin(9600);
  delay(10);
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  server.begin();
  Serial.println("Server started");
 
  // Print the IP address
  Serial.print("Use this URL : ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");

 //debut wind
time = millis();
 //fin wind
}
 
void loop() {
 WiFiClient client = server.available();

 meassure();

  client.print("vitesse du vent: ");
  client.print(wind);       //Speed in Km/h
  client.print(" km/h - ");
  client.print(wind / 3.6); //Speed in m/s
  client.println(" m/s");

}

void countWind() {
  wind_ct ++;
}

void meassure() {
  wind_ct = 0;
  time = millis();
  attachInterrupt(1, countWind, RISING);
  delay(1000 * m_time);
  detachInterrupt(1);
  wind = (float)wind_ct / (float)m_time * 2.4;
  
}

Bonsoir

unsigned long time = 0;

Malheureusement le "usigned long pose problème le wemos D1 mini ne l'accepte pas.

unsigned long ne pose aucun problème..... time par contre est un mot réservé , changer le nom de la variable

Bizarre pourquoi time est-il accepté avec arduino nano? Le code fonctionne sur arduino nano tel quel. Je ne comprends pas.

Bonjour La fonction time a été ajoutée en vue du protocole NTP (heure réseau) Il faut s'attendre, en raison de la prise en charge du WiFi, a quelques differences entre nano est ESP8266

Dans le message d'erreur de compilation avec ESP8266 il y avait probablement une indication de redéfinition de time, signe que time est déjà défini.

Au lieu d’emettre Une page web - utilisez une des plateformes IOT gratuite. Vous avez des librairies toutes faites pour cela, vous exportez vos données et ensuite ces plateformes ont diverses façons d’aller lire les data, éventuellement directement avec une petite appli smartphone ou interface web que vous concevez grâce à leurs outils. Ça vous permettra de lire votre anémomètre depuis n’importe où dans le monde, pas juste votre cuisine :)

Merci JML effectivement j’ai vu cette possibilité et j’ai trouvé pas mal de code pour y parvenir mais je dois bien avouer que ça me parait plus compliqué en fonction de mes connaissances en programmation. je ne dis pas que je n’y viendrai pas, mais dans un premier temps j’aimerai faire une simple page web pour apprendre ensuite je passerai à l’étape suivante.

Voilà al1fch concernant le time je l’ai modifié en timer et effectivement je n’ai plus ce problème mais j’en ai un autre qui lors de la compilation me renvoie l’erreur :
warning: espcomm_sync failed
error: espcomm_open failed
error: espcomm_upload_mem failed

Est ce que ce serait pcq mon wemos D1 mini n’a pas assez de mémoire? Je suis quand même étonné.
Comment résoudre ce problème?

le message d'erreur indique que la communication série par USB n'a pas pu être établie

pb de câble USB ? de driver ? de sélection du bon port serie virtuel ?

Driver à installer , ça dépend de la version de la carte et de sa provenance (originale ou copie)

S'il s'agit d'une D1 MIni Pro originale (produite par LoLin/ Wemos) voir au bas de cette page selon la version V1, V1.1 ou V2

S'il s'agit d'une copie le driver est très probablement celui de la puce CH340 (Vu le nombre de copies de ses productions la société à l'origine des cartes WEMOS abandonne cette marque pour la marque LOLIN )

Je reprends le problème à Zero, je fais le test avec le code attaché à ce post sur un arduino uno et tout fonctionne correctement. Mais j’aimerai savoir dans le code attaché quelle ligne attribue la borne 3 pour recevoir les impulsions venant de l’anémomètre pcq si cette borne a quelque chose de particulier sur quelle borne faut-il raccorder l’anémomètre sur un wemos D1 mini pro?
Merci pour votre aide.

raccordem_Anemo.JPG

Anemometer.ino (673 Bytes)

j'aimerai savoir dans le code attaché quelle ligne attribue la borne 3 pour recevoir les impulsions venant de l'anémomètre

c'est la ligne:

attachInterrupt(1, countWind, RISING);

L'interruption n°1 (premier paramètre de la fonction) sur ta carte Arduino est associée à la borne 3 Voir içi par exemple pour plus d'infos

N.B : La transposition du code vers ESP8266 , outre le renommage de la variable time, demandera un peu d'aptation . La syntaxe d'attachinterrupt est un peu différente. Voir içi un exemple pour la borne GPIO13 Sur ESP8266 tous les GPIO sauf GPIO16 peuvent servir en interruption

petite complication : tenir compte de la correspondance entre N° de GPIO et repérage D1, D2, D3..... Voir au bas de cette page

Merci beaucoup je vais étudier tout ça ce n'est pas si simple pour moi :o

Voilà j’ai étudié vos différents liens et en glanant à gauche et droite des bouts de code je suis arrivé à un résultat décevant. Le code fonctionne mais n’affiche pas la vitesse du vent en serial print mon problème vient de la correspondance de la borne 3 d’un arduino nano avec la borne D3 du wemos D1 mini. Ces bornes doivent supporter les interruptions mais ça ne fonctionne pas alors qu’elle devrait le supporter sur le wemos. Avez-vous une idée le code est ci-dessous. Merci

#include <ESP8266WiFi.h>


const int interruptPin = D3;

const int m_time = 5;      //Meassuretime in Seconds
int wind_ct = 0;
float wind = 0.0;
unsigned long timer = 0;


////////////////////////////////////////////////////////////////////////////////////////////////////////////

String apiKey = "xxxxxxxxx"; //API key from ThingSpeak channel
const char* ssid = "xxxxxxx"; //SSID of your wifi
const char* password = "xxxxxxx"; //password of your wifi
int duration=5;//delay between each data measure and uploading
////////////////////////////////////////////////////////////////////////////////////////////////////////////

const char* server = "api.thingspeak.com";


//DHT dht(DHTPIN, DHT11, 15);// Start DHT sensor
WiFiClient client; //Start clinet

void setup() {
  Serial.begin(9600);

//  dht.begin();

timer = millis();

  WiFi.begin(ssid, password);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
}

void loop() {
  {

  meassure();

  Serial.print("vitesse du vent: ");
  Serial.print(wind);       //Speed in Km/h
  Serial.print(" km/h - ");
  Serial.print(wind / 3.6); //Speed in m/s
  Serial.println(" m/s");

if (client.connect(server, 80)) {
    String postStr = apiKey;
    
    postStr += String(wind);
    postStr += "\r\n\r\n";

}
  } 
 
    //Uplad the postSting with temperature and Humidity information every
    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);

    
    Serial.println("% send to Thingspeak");
  }
//  client.stop();

//  Serial.println("Waiting…");
  // thingspeak needs minimum 15 sec delay between updates
//  delay(duration*1000);
void countWind() {
  wind_ct ++;
}

void meassure() {
  wind_ct = 0;
  timer = millis();
  attachInterrupt(D3, countWind, RISING);
  delay(1000 * m_time);
  detachInterrupt(1);
  wind = (float)wind_ct / (float)m_time * 2.4;
}

Faut utiliser des variables [url=https://www.arduino.cc/reference/en/language/variables/variable-scope--qualifiers/volatile/]volatile[/url] si elles sont partagées entre l’ISR et la loop => c’est le cas de wind_ct, non ?

Pas sûr pour le detachInterrupt(1)... c’est quoi ce 1 ?

Bonjour

comme indiqué plus haut la syntaxe de la fonction attachInterrupt() n'est pas la même sur ESP8266 et sur Arduino.

Le premier paramètre n'est pas le GPIO choisi mais [u]une fonction dont le paramètre est le GPIO chois*i*[/u]

[b]attachInterrupt[/b](digitalPinToInterrupt(GPIO), function, mode);

Voici un second exemple commenté

Bonjour JML le 1 si j'ai bien compris c'est la borne numéro 3 de l'arduino uno ou nano. Pour l'interrupt al1fch RISING est pourtant bien utilisable avec ESP8266 qui est sur le wemos d1 mini. Je ne comprends pas mais bon je ne suis pas un pro. Merci pour votre aide.

Pour l'interrupt al1fch RISING est pourtant bien utilisable avec ESP8266 qui est sur le wemos d1 mini.

Oui car pour le 'mode' il y a le choix entre RISING, FALLING et CHANGE (voir le lien que j'ai donné au message #12)

al1fch: Oui car pour le 'mode' il y a le choix entre RISING, FALLING et CHANGE (voir le lien que j'ai donné au message #12)

Effectivement c'est en consultant ce lien donné au message #12 que j'ai vu que RISING était compatible avec ESP8266 d'où mon incompréhension au dysfonctionnement?