[HELP] nodemcu en mode client ET serveur

Bonjour à vous,

depuis quelques jours maintenant je cherche à faire fonctionner mon Nodemcu ESP12E en mode serveur mais aussi client.

Le projet est une centrale d'affichage météo qui reçois des données de plusieurs satellites avec des BMP280. Ca c'est la partie serveur, la centrale écoute les requêtes des satellites.

Quand un des satellite n'envoi plus de données depuis un certains temps j'ai besoin d'envoyer une url a ifttt pour recevoir une notification sur mon portable. c'est cette partie qui ne fonctionne pas.

je test actuellement avec ce code:

//---declaration des bibliotheques---
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
#include <ESP8266HTTPClient.h>

//---configuration du reseau---
const char* ssid = "xxxxx";
const char* password = "xxxxxxxx";

IPAddress ip(192, 168, 1, 60);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

//---demarrage du server sur port 80
WiFiServer server(80);

String req;

String  httpurl;
HTTPClient http;

void setup() {

  Serial.begin(9600);

  //---connexion au reseau domestique---
  WiFi.mode(WIFI_STA);
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);
  Serial.print("connexion au reseau");

  while (WiFi.status() != WL_CONNECTED) {  //attente de la connexion
    delay(500);
    Serial.print(".");
  }

  Serial.println("connection : OK");

  //---initialisation et configuration de l'interface de MAJ en WIFI---
  ArduinoOTA.setHostname("essai");
  ArduinoOTA.begin();

  //---demarrage du serveur et declaration des pages d'appel---
  server.begin();
  Serial.println("Server started");
  Serial.println(WiFi.localIP());
  Serial.println("");
}

void loop() {

  //---ecoute du reseau pour MAJ en WIFI---
  ArduinoOTA.handle();

  //---ecoute des requetes sur le reseau---
  WiFiClient client = server.available();

  if (client) {
    while (!client.available()) {
      delay(1);
    }
    req = client.readStringUntil('\r');
    Serial.println(req);
    client.flush();


    if (req.indexOf("gpio") != -1) {
      String e = req.substring(10, 14);
      Serial.println(e);
      String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nOK!!! ";
      s += "</html>\n";

      client.print(s);
      client.flush();
      delay(20);
    }
  }

  if (req != "") {

    req = "";
    httpurl = "http://maker.ifttt.com/trigger/erreur1/with/key/XXXXXXXXXXX";

    http.begin(httpurl);
    int r= http.GET();
    Serial.println(r);
    http.end();
    delay(20);
  }
}

Quand je tappe dans mon naviguateur http://192.168.1.60/gpio=12.7 j'obtient cette réponse:

connexion au reseau.connection : OK
Server started
192.168.1.60

GET /gpio=12.7 HTTP/1.1
12.7
-1
GET /favicon.ico HTTP/1.1
-1

la partie serveur fonctionne, j'obtient bien le "12.7" mais l'envoi de l'url plante :frowning: .

Auriez-vous une idée ?

Merci

Bon voilà,

j'ai trouvé un truc qui fonctionne mais je ne sais pas pourquoi :o .

Quand je me connecte à ma box le serveur fonctionne mais pas le client. Quand je passe en mode AP sur l'ESP le serveur ET le client fonctionne.

Le souci c'est que je ne sais pas comment il arrive a joindre un serveur extérieur comme ifttt alors qu'il n'as pas de connexion à internet dans ce mode ????? (enfin je pense)

Voilà mon code (dans le Setup il y a une zone délimiter, quand je suis en WiFi.SoftAP c'est OK, quand je passe WiFi.begin pour me connecter à mon réseau c'est KO)

//---declaration des bibliotheques---
#include <Wire.h>
#include <ESP8266WiFi.h>
//#include <ArduinoOTA.h>
#include <ESP8266WebServer.h>
#include <LiquidCrystal_I2C.h>
#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>

//---initialisation du lcd---
LiquidCrystal_I2C lcd(0x27, 16, 2);

//---configuration du reseau---
const char* ssid = "xxxxx";
const char* password = "xxxxxx";
/*
IPAddress ip(192, 168, 1, 49);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);*/

//---demarrage du server sur port 8080
ESP8266WebServer server(8080);

//--declaration des variables de fonctionnement
unsigned long lastmillis = 0;
unsigned long lastmillis_lcd = 0;
unsigned long tempo_secu = 610;  // tempo de securite en sec
boolean secu = 0;
int tempo_lcd = 10;  //en sec
boolean variable = 0;

String  httpurl;
HTTPClient http;

void setup() {

  //---initialisation de la pin 15 pour la remise à zero de la memoire de l'emetteur---
  pinMode(15, INPUT);
  digitalWrite(15, LOW);
  pinMode(13, INPUT);
  digitalWrite(13, LOW);
  Serial.begin(9600);
  lcd.begin();
  lastmillis_lcd = millis();
  lcd.print("Recepteur");
  delay(1000);
  lcd.clear();
  lcd.print("connection");
  lcd.setCursor(0, 1);
  lcd.print(ssid);

  //---connexion au reseau domestique----------------------------------------------------
  /*WiFi.mode(WIFI_STA);
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {  //attente de la connexion
    delay(500);
    lcd.print(".");
  }*/

  WiFi.softAP("my-network");

  //-------------------------------------------------------------------------------------
  
  lcd.clear();
  lcd.print("connection : OK");
  delay(1000);
  lcd.clear();

  //---initialisation et configuration de l'interface de MAJ en WIFI---
  //ArduinoOTA.setHostname("Recepteur");
  //ArduinoOTA.begin();

  //---demarrage du serveur et declaration des pages d'appel---
  server.on("/index", handle_index);
  server.begin();
}

void loop() {

  //---ecoute du reseau pour MAJ en WIFI---
  //ArduinoOTA.handle();

  //---bascule pour la remise a zero de l'emetteur---
  if (digitalRead(15) == 1) {
    variable = 1;
    lcd.setCursor(11, 1);
    lcd.print("-");
  }

  if (digitalRead(13) == 1){
    lastmillis_lcd = millis();
    lcd.backlight();
    lcd.display();
  }

  if ((millis() - lastmillis_lcd) > (tempo_lcd * 1000)){
    lcd.noBacklight();
    lcd.noDisplay();
  }
  
  //---ecoute des requetes sur le reseau sur le port 8080---
  server.handleClient();

  //---bloc de securité si l'emetteur n'emet plus---
  if ((millis() - lastmillis) > (tempo_secu * 1000) && secu == 0) {
    lcd.clear();
    lcd.print("erreur capteur:");
    lcd.setCursor(0, 1);
    lcd.print("192.168.4.53");

    httpurl = "http://maker.ifttt.com:80/trigger/erreur1/with/key/xxxxxxxxxxxx";

    http.begin(httpurl);
    Serial.println(http.GET());
    http.end();
    
    secu = 1;
  }
}

void handle_index() {

  //---bloc appelé si la requette commence par "/index"
  lastmillis = millis();
  secu = 0;
  //mise en memoire des variables
  String t = server.arg("temp");
  String h = server.arg("hum");
  String tmini = server.arg("tmini");
  String tmax = server.arg("tmax");
  String hmini = server.arg("hmini");
  String hmax = server.arg("hmax");

  //---bloc de decision, si variable à "1" alors envoi du message "remise a zero"---
  if (variable == 1) {
    server.send(210, "text/plain", "remise a zero");
    variable = 0;
  } else {
    server.send(200, "text/plain", "Transission effectuee");
  }

  String data = "http://api.thingspeak.com:80/update?api_key=xxxxxxxx&field1=";
  data += t;
  data += "&field2=";
  data += h;
  
  http.begin(data);   //envoi du message "data"
  int recu = http.GET();
  Serial.println("envoi thingspeak");
  Serial.println(data);
  Serial.println(recu);
  http.end();  

  //---affichage des variables recuperees---
  affichage(t, h, tmini, tmax, hmini, hmax);
}

void affichage(String t, String h, String tmini, String tmax, String hmini, String hmax) {

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(String(t));
  lcd.print((char)223);
  lcd.print("C");
  lcd.setCursor(6, 0);
  lcd.print("|");
  lcd.setCursor(7, 0);
  lcd.print(String(tmini));
  lcd.setCursor(11, 0);
  lcd.print("|");
  lcd.setCursor(12, 0);
  lcd.print(String(tmax));
  lcd.setCursor(1, 1);
  lcd.print(String(h));
  lcd.print("%");
  lcd.setCursor(6, 1);
  lcd.print("|");
  lcd.setCursor(8, 1);
  lcd.print(String(hmini));
  lcd.setCursor(11, 1);
  lcd.print("|");
  lcd.setCursor(13, 1);
  lcd.print(String(hmax));
}

Je viens de faire un debug WIFI et j'obtient ceci:

SDK:2.2.1(cfd48f3)/Core:2.4.2/lwIP:2.0.3(STABLE-2_0_3_RELEASE/glue:arduino-2.4.1-13-g163bb82)/BearSSL:6d1cefc
wifi evt: 2
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 2
cnt 

connected with Livebox-68F0, channel 1
dhcp client start...
wifi evt: 0
ip:192.168.1.60,mask:255.255.255.0,gw:192.168.1.1
wifi evt: 3
[AP] softap config unchanged
[hostByName] request IP for: maker.ifttt.com
[hostByName] Host: maker.ifttt.com IP: 54.84.157.250
200

Il se connecte bien a ma box mais je ne sais pas comment.