esp8266 webserveur et Thinkspeak ..soucis WiFi Config .....

Bonjour,

J’ai créer un nichoir connecté et j’ai une page web intégrée à ma nodeMCU qui m’affiche le nombre de passage de l’oiseau, la température dans le nichoir …
tout cela fonctionne (voir le sketch)

D’autre part j’ai un compte sur Thingspeak avec des fieds de programmé .
J’ai fait l’essai avec un sketch2, l’incrémentation se fait bien sur Thingspeak

toutefois je n’arrive pas à faire cohabiter les 2 scketchs ensemble …
Il me semble que qu’il faudrait que l’esp soit client et serveur en meme temps …

pourriez vous m’aider pour cette cohabitation ?
merci d’avance

sketch2.txt (1.88 KB)

sketch.txt (24.4 KB)

Bonsoir

client et serveur, oui. (le premier ponctuellement , le second permanent)

Définis dans le programme ‘barrière IR + serveur’ le moment où tu veux envoyer les données vers ThingSpeak (un évènement lié à la barrière ? à une mise à jour de l’EEPROM ? …)

Une fois localisé dans le code de la barrière IR ce moment précis (ou ces moments ) y insérer l’envoi des données vers ThinkSpeak

al1fch: Bonsoir

client et serveur, oui. (le premier ponctuellement , le second permanent)

Définis dans le programme 'barrière IR + serveur' le moment où tu veux envoyer les données vers ThingSpeak (un évènement lié à la barrière ? à une mise à jour de l'EEPROM ? .....)

Une fois localisé dans le code de la barrière IR ce moment précis (ou ces moments ) y insérer l'envoi des données vers ThinkSpeak

Re, J'ai réalisé un essai mais qui ne fonctionne pas.... je suis pas chez moi, mais je posterais le sketch d'essai en soirée...

voici le bout de code que l’ai mis à l’endroit ou je souhaite faire l’envoi sur Thingspeak ( dans loop )

// lecture T&H et envoie sur Thingspeack ( mise en place du client et retour au serveur )
     if (millis() - chronoTH > durationTH) {
        chronoTH = millis();
        analogWrite(D5, 0);     // extinction 38Khz
      //  delay(2); // laisse le temps d'eteindre le 38Khz pas utile a priori
        Temperature = dht.readTemperature(); // Mesure de la temperature
        Humidity = dht.readHumidity(); // Mesure de l'hygrométrie

    WiFiClient client;
    Serial.println("client started");
    ThingSpeak.begin(client);
        ThingSpeak.writeField(myChannelNumber, 1,ajout, myWriteAPIKey); //Update in ThingSpeak
        //ThingSpeak.writeField(myChannelNumber, 4,Humidity, myWriteAPIKey); //Update in ThingSpeak
        Serial.print("Thingspeak mis à jour");
    client.stop();    
    server.begin();
    Serial.println("HTTP server started");    
        analogWrite(D5, 512);   // redémarrage 38Khz
        delay(2); // laisse le temps de redemarrer le 38Khz

      }

Qu’elle est mon erreur ?

Bonsoir

voici un petit exemple (sans prétention) de combinaison serveur + client ThingSpeak juste pour montrer un exemple de combinaison serveur HTTP + client ThingSpeak

Pour tester la combinaison serveur HTTP + client ThingSpeak je suis parti de deux exemples simples disponibles dans l’IDE :

-WiFiManualWebServer (sert une page permettant d’agir sur la LED de la carte)
-WriteSingleField (mise à jour d’une donnée unique sur ThingSpeak)

Je les ai pris tels quels et combinés pour qu’à chaque mise à jour de l’état de la LED son état 1 ou 0 soit transmis à ThingSpeak (içi le champ 6 d’un canal)

-En début du code on crée les instances du serveur ET du client
-Dans le setup() on initialise le WiFI en mode STATION, on initialise ThingSpeak puis on se connecte au point d’accès
-Dans loop() on attend la connection d’un client, on examine sa requête et si elle est valide on actualise l’état de la LED Aussitôt après on envoie la donnée (0 ou 1) à ThingSpeak
-Enfin on renvoie la page HTTP au client

/*
    This sketch demonstrates how to set up a simple HTTP-like server.
    The server will set a GPIO pin depending on the request
      http://server_ip/gpio/0 will set the GPIO2 low,
      http://server_ip/gpio/1 will set the GPIO2 high
    server_ip is the IP address of the ESP8266 module, will be
    printed to Serial when the module is connected.
*/

#include <ESP8266WiFi.h>
#include "ThingSpeak.h"

#ifndef STASSID
#define STASSID "*****"
#define STAPSK  "*****"
#endif

//Accès Box
const char* ssid = STASSID;
const char* password = STAPSK;

// Accès ThingSpeak
unsigned long myChannelNumber = ****;
const char * myWriteAPIKey = "****" ;

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);
// Création instance client
WiFiClient  client;


void setup() {

  Serial.begin(115200);

  // prepare LED
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, 0);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print(F("Connecting to "));
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

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

  // Start the server
  server.begin();
  Serial.println(F("Server started"));

  // Print the IP address
  Serial.println(WiFi.localIP());

  ThingSpeak.begin(client);  // Initialize ThingSpeak

}



void loop() {
    
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  Serial.println(F("new client"));

  client.setTimeout(5000); // default is 1000

  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(F("request: "));
  Serial.println(req);

  // Match the request
  int val;
  if (req.indexOf(F("/gpio/0")) != -1) {
    val = 0;
  } else if (req.indexOf(F("/gpio/1")) != -1) {
    val = 1;
  } else {
    Serial.println(F("invalid request"));
    val = digitalRead(LED_BUILTIN);
  }

  // Set LED according to the request
  digitalWrite(LED_BUILTIN, val);


   // Write to ThingSpeak. There are up to 8 fields in a channel, allowing you to store up to 8 different
  // pieces of information in a channel.  Here, we write to field 1.
  int x = ThingSpeak.writeField(myChannelNumber, 6, val, myWriteAPIKey);
  if (x == 200) {
    Serial.println("Channel update successful.");
  }
  else {
    Serial.println("Problem updating channel. HTTP error code " + String(x));
  }



  // read/ignore the rest of the request
  // do not client.flush(): it is for output only, see below
  while (client.available()) {
    // byte by byte is not very efficient
    client.read();
  }

  // Send the response to the client
  // it is OK for multiple small client.print/write,
  // because nagle algorithm will group them into one single packet
  client.print(F("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now "));
  client.print((val) ? F("high") : F("low"));
  client.print(F("

Click <a href='http://"));
  client.print(WiFi.localIP());
  client.print(F("/gpio/1'>here</a> to switch LED GPIO on, or <a href='http://"));
  client.print(WiFi.localIP());
  client.print(F("/gpio/0'>here</a> to switch LED GPIO off.</html>"));

  // The client will actually be *flushed* then disconnected
  // when the function returns and 'client' object is destroyed (out-of-scope)
  // flush = ensure written data are received by the other side
  Serial.println(F("Disconnecting from client"));
}

test OK avec parfois quelques rejets de la part de ThingSpeak (peut être à certains moments une cadence trop rapide de mise à jour…)

merci de ton retour , je vais observer le code …

@ bientot ! merci !!

Bonsoir,

J’ai fait plusieurs essai mais rien 'y fait il y a une incohérence … surement lié à mon ignorance… :confused:

1/ J’ai tester le code que tu m’as fais suivre, OK, pas de soucis incrémentation correcte sur Thingspeak.

2/ J’ai remarqué que sur l’exemple, le serveur est WiFiServer server(80); alors que sur mon sketch j’ai ESP8266WebServer server(71);

3/ J’ai modifié mon code ainsi :

  • j’ai ajouté :
#include "ThingSpeak.h"
   unsigned long myChannelNumber = xxx; 
   const char * myWriteAPIKey = "xxx";
WiFiClient  client;

dans setup :

  • j’ai ajouté :
WiFi.mode(WIFI_STA);
 ThingSpeak.begin(client);  // Initialize ThingSpeak

dans loop à l’endroit ou je veux faire l’incrementation :
-j’ai ajouté :

 int x = ThingSpeak.writeField(myChannelNumber, 1, ajout, myWriteAPIKey);
  if (x == 200) {
  Serial.println("Channel update successful.");
  }
  else {
  Serial.println("Problem updating channel. HTTP error code " + String(x));
  }

mais effectivement dans le moniteur il me met problem updating…

le code entier est en PJ

peux-tu encore m’aiguiller un peu ?,Merci

V16.txt (26.1 KB)

re,

en décortiquant tout mon code et grâce au modèle j'ai remarqué que la ligne : WiFi.config(ip, gateway, subnet);

empêchait le fonctionnement de l'envoie sur Thingspeak ! plus haut j'ai :

// NETWORK: Static IP details...  
   IPAddress ip(192, 168, 0, 72);
   IPAddress gateway(192, 168, 0, 1);
   IPAddress subnet(255, 255, 255, 0);

en commentant cette ligne "WiFi.config(ip, gateway, subnet);" tout est OK...mais POURQUOI ??? J'ai besoin de l'IP fixe pour la redirection a distance.... qq peux-til m'éclairer ?

Bonsoir

je manque de disponibilité pour entrer dans ton code :frowning:

Concernant l’IP fixe je viens de reprendre le programme donné en exemple au message #4 et j’ai inséré un WiFI.config() entre WiFi.mode et WiFi.begin

Le programme fonctionne de la même manière que celui donné en exemple mais avec une IP fixe, le client fonctionne et l’envoi vers ThinSpeak se produit suite à une requête reçue par la partie serveur.

 WiFi.mode(WIFI_STA); 
 WiFi.config(IPAddress(192, 168, 1, 20), IPAddress(192, 168, 1, 254), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 1, 254));
 WiFi.begin(ssid, password);

(Remarque le 4ème paramètre de WiFi.config , le dns, est optionnel)

lol .... je me reponds a moi même ...!!

le DNS !!! il faut ajouter "IPAddress dns(8, 8, 8, 8);" et modifier "WiFi.config(ip, gateway, subnet, dns);"....

au fait "WiFi.mode(WIFI_STA);" sert a quoi ? car cela fonctionne sans ? .....

al1fch: (Remarque le 4ème paramètre de WiFi.config est optionnel)

a priori necessaire chez moi ..... c'est le DNS. MErci pour ton aide !

au fait "WiFi.mode(WIFI_STA);" sert a quoi ? car cela fonctionne sans ? .

ça sert à fixer le fonctionnement en mode STAtion par opposition à AP (Point d'accès) La box étant le point d'accès (AP) il faut être en Station pour s'y raccorder.

Si cela fonctionne sans cette ligne c'est parce que l'ESP8266 a gardé trace d'une configuration antérieure (qui n'est pas effacée lors du téléversement d'un nouveau code) En fait l'ESP8266 a été conçu pour se reconnecter rapidement au dernier point d'accès avec lequel il a été connecté avec succés précédement

Ok. Compris Merciiiiiiii !

J'ai écris que le paramètre DNS est optionnel en me basant sur la doc .... et aussi sur le souvenir d'avoir testé avec 3 paramètres seulement .

https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/station-class.html#config

Au final , c'est maintenant OK ?

Ton code : -gère la barrière infra rouge -se connecte à ta box -sert une page Web -se connecte en client à ThingSpeak pour l'envoi des données 'dans le cloud'

Hello !

Oui à présent mon petit bout de code :

  • gère les barrières infrarouges en 38Khz
  • génère une page web avec les informations et les commandes
  • se connecte a ma box pour envoyer les données à Thingspeak
  • sait décaller les envois à Thingspeak avec une intervalle de 20s en cas de passages trop rapprochés
  • enregistre les données dans l'eeprom
  • mesure et exploite les température et hygrométries
  • .....

Merci à vous tous pour vos contributions!