Watchdog et wemos WIFI D1, WifiAccessPoint

Bonjour, je suis en train d'essayer de faire fonctionner sur ma carte WEMOS D1 le mode WifiAccessPoint.

Le but est que l'utilisateur tombe sur une page qui affiche un formulaire avec 2 champs, 1 pour le nom du point d'accé et un deuxieme pour le mot de passe du wifi.

Ceci seront ensuite utilisé pour se connecter au wifi et faire une requete internet sur un site comme google toutes les minutes, si la requete echoue ont active un relais pour redemarrer le routeur... (projet watch dog pour routeur)

Hors j'ai un problème, j'ai rentrée un nom de point d'accé wifi et un mot de passe, mais ceux ci ne sont pas pris en compte par le programme.

J'ai normalement cela:

#define APSSID "watchdog"
#define APPSK "test2"

Au lieu de sa je détecte un reseau wifi qui est: ESP-F82955

Et apparement je peux m'y connecter sans mot de passe.

Savez vous pourquoi?

Voici le code tiré de la librairie pour la carte wemos D1 (A peine modifié)

/*
   Copyright (c) 2015, Majenko Technologies
   All rights reserved.

   Redistribution and use in source and binary forms, with or without modification,
   are permitted provided that the following conditions are met:

 * * Redistributions of source code must retain the above copyright notice, this
     list of conditions and the following disclaimer.

 * * Redistributions in binary form must reproduce the above copyright notice, this
     list of conditions and the following disclaimer in the documentation and/or
     other materials provided with the distribution.

 * * Neither the name of Majenko Technologies nor the names of its
     contributors may be used to endorse or promote products derived from
     this software without specific prior written permission.

   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
   ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/* Create a WiFi access point and provide a web server on it. */

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

#ifndef APSSID
#define APSSID "watchdog"
#define APPSK "test2"
#endif

/* Set these to your desired credentials. */
const char *ssid = APSSID;
const char *password = APPSK;

ESP8266WebServer server(80);

/* Just a little test message.  Go to http://192.168.4.1 in a web browser
   connected to this access point to see it.
*/
void handleRoot() {
  server.send(200, "text/html", "<h1>Configuration du Watch dog</h1><form action=\"/\" method=\"get\"><li><label for=\"name\">wifi name:</label><input type=\"text\" id=\"wifi_name\" name=\"wifi_name\" /></li><li><label for=\"name\">wifi password:</label><input type=\"text\" id=\"wifi_password\" name=\"wifi_password\" /></li><button type=\"submit\">Envoyer</button></form>");

   


}

void setup() {
  delay(1000);
  Serial.begin(115200);
  Serial.println();
  Serial.print("Configuring access point...");
  /* You can remove the password parameter if you want the AP to be open. */
  WiFi.softAP(ssid, password);

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.on("/", handleRoot);
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}

essayez un

WiFi.disconnect();

juste avant le WiFi.softAP()

Je viens d'essayer, toujours le même problème. (connexion sans mot de passe et pas le bon nom du wifi )

L'exemple lui fonctionne, hors j'ai juste modifié le nom du wifi, le mot de passe et le contenu de la page html.

Bonsoir,
Essayez avec un mot de passe de plus de 8 caractères pour le SOFT_AP. Ca avait réglé mon problème. Je ne me souviens pas si j'avais trouvé la confirmation dans la doc...
Bonne bidouille,
MicroQuettas

Bonsoir

Oui , au moins 8 caractères , la doc indique pour le mot de passe du point d'accès : entre 8 et 64 caractères
https://arduino-esp8266.readthedocs.io/en/3.1.2/esp8266wifi/soft-access-point-class.html#softap

il est utile d'avoir sous le coude un lien vers la doc officielle du 'core' ESP266 pour IDE Arduino = infos de première mains :wink:

:point_right: Welcome to ESP8266 Arduino Core’s documentation! — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation

Merci , sa fonctionne, c'est effectivement sa! Je n'y aurais pas pensé.

Je cherche maintenant a recuperer le contenu de mon formulaire, auriez vous une piste?

Je reviens vers vous car je cherche a recuperer le contenu de mon formulaire (methode get), je n'est pas trouvé d'exemple dans ce mode (wifiAccessPoint)

Votre mode wifi n’a aucune importance, c’est la bibliothèque ESP8266WebServer qu’il faut utiliser

Il y a des tutos, en voici un pris au hasard

Merci je vais regarder

J'ai fait ce code qui marche:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

#ifndef APSSID
#define APSSID "watchdog"
#define APPSK "123456789"
#endif

/* Set these to your desired credentials. */
const char *ssid = APSSID;
const char *password = APPSK;

ESP8266WebServer server(80);

/* Just a little test message.  Go to http://192.168.4.1 in a web browser
   connected to this access point to see it.
*/





void handleGenericArgs() { //Handler

String message = "Number of args received:";
message += server.args();            //Get number of parameters
message += "<br>";
message += "\n";                            //Add a new line

for (int i = 0; i < server.args(); i++) {

message += "Arg num" + (String)i + " > ";   //Include the current iteration value
message += server.argName(i) + ": ";     //Get the name of the parameter
message += server.arg(i) + "\n"; 
message += "<br>";             //Get the value of the parameter

} 

message += "<br><br><h1>Configuration du Watch dog</h1><form action=\"/\" method=\"get\"><li><label for=\"name\">wifi name:</label><input type=\"text\" id=\"wifi_name\" name=\"wifi_name\" /></li><li><label for=\"name\">wifi password:</label><input type=\"text\" id=\"wifi_password\" name=\"wifi_password\" /></li><button type=\"submit\">Envoyer</button></form>";


server.send(200, "text/html", message);       //Response to the HTTP request


}


void setup() {
  delay(1000);
  Serial.begin(115200);
  Serial.println();
  Serial.print("Configuring access point...");
  WiFi.disconnect(); //   **********************************************
  WiFi.softAP(ssid, password);

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.on("/", handleGenericArgs); //Associate the handler function to the path

  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}

wifi_access_client

Comment faire pour modifier l'ip, j'ai 192.168.4.1 mais je ne sais pas d'ou elle est réglé?

Est t'il possible de faire une requete http vers un site comme google dans ce mode (wifiAccessPoint)

Ce que je voudrais faire c'est compiner les 2 codes que j'ai fait, je voudrais pouvoir passer d'un mode configuration (entrer les identifiant wifi) au mode watchdog ou l'on fait des requetes http sur un site web.

Le passage d'un mode a l'autre se faisant grace a un interrupteur branché sur une pin de la carte wemos D1.

Un peu compliqué a expliquer.

il faut un softAPConfig

cf Soft Access Point Class — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation

ben non, vous n'êtes pas connecté à internet. Vous avez juste créé vous même un réseau local (il faudrait une gateway qui se charge du routage, mais dans ce cas on ne prend généralement pas le mode AP, on se met en client du réseau)

je pense comprendre que vous voulez réinventer GitHub - tzapu/WiFiManager: ESP8266 WiFi Connection manager with web captive portal

(autant utiliser cette bibliothèque :slight_smile: )

Merci pour ces reponses...

Je suis en train de tester une pin sur ma carte wemos d1, le but est de pouvoir passer d'un mode a l'autre (access point client au mode client classique)

Je sais pas vraiement si je fais comme il faut!

Je fais ceci:

 const int ENTREE = 5;   // entree pour interrupteur
  

  pinMode(ENTREE, INPUT);   //Broche 13 en entree
  digitalWrite(ENTREE,HIGH); // activer pull up


 byte entree;
  entree = digitalRead(ENTREE);

  if (entree == 0){Serial.println("entree = 0 ");}else{Serial.println("entree = 1 ");}


Aurais je fais une erreur? Est ce que sa vous semble bon? Je ne parviens pas a avoir un fonctionnement correcte. J'affiche simplement l'etat de la pin sur le port serie, mais sa semble mal fonctionner, j'ai essayé différentes pin. Je sais que certaines pin correspondent a d'autre pin en interne.

Mon code complet:

//watch dog wifi configurable
//pour carte wemos d1
// interupteur relié entre D12 et le 5V




#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

#ifndef APSSID
#define APSSID "watchdog"
#define APPSK "123456789"
#endif

/* Set these to your desired credentials. */
const char *ssid = APSSID;
const char *password = APPSK;

ESP8266WebServer server(80);
IPAddress local_IP(192,168,4,10);
IPAddress gateway(192,168,4,1);
IPAddress subnet(255,255,255,0);

 const int ENTREE = 5;   // entree pour interrupteur
  

/* Just a little test message.  Go to http://192.168.4.1 in a web browser
   connected to this access point to see it.
*/





void handleGenericArgs() { //Handler

String message = "Number of args received:";
message += server.args();            //Get number of parameters
message += "<br>";
message += "\n";                            //Add a new line

for (int i = 0; i < server.args(); i++) {

message += "Arg num" + (String)i + " > ";   //Include the current iteration value
message += server.argName(i) + ": ";     //Get the name of the parameter
message += server.arg(i) + "\n"; 
message += "<br>";             //Get the value of the parameter

} 

message += "<br><br><h1>Mode ap client</h1><br><br><h1>Configuration du Watch dog</h1><form action=\"/\" method=\"get\"><li><label for=\"name\">wifi name:</label><input type=\"text\" id=\"wifi_name\" name=\"wifi_name\" /></li><li><label for=\"name\">wifi password:</label><input type=\"text\" id=\"wifi_password\" name=\"wifi_password\" /></li><button type=\"submit\">Envoyer</button></form>";


server.send(200, "text/html", message);       //Response to the HTTP request


}


void setup() {


  pinMode(ENTREE, INPUT);   //Broche 13 en entree
  digitalWrite(ENTREE,HIGH); // activer pull up

  delay(1000);
  Serial.begin(115200);
  Serial.println();
  Serial.print("Configuring access point...");
  WiFi.disconnect(); //   **********************************************
  WiFi.softAPConfig(local_IP, gateway, subnet);
  WiFi.softAP(ssid, password);

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.on("/", handleGenericArgs); //Associate the handler function to the path

  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();

  byte entree;
  entree = digitalRead(ENTREE);

  if (entree == 0){Serial.println("entree = 0 ");}else{Serial.println("entree = 1 ");}



}

Bonsoir @cyrilcarlita

pinMode(ENTREE, INPUT); //Broche 13 en entree
digitalWrite(ENTREE,HIGH); // activer pull up

ceci , pour activer un pull up sur une entrée est spécifique aux microcontrolleurs AVR

Un ESP8266 nécessite une autre méthode
https://arduino-esp8266.readthedocs.io/en/3.1.2/reference.html#digital-io

pinMode(ENTREE, INPUT_PULLUP);

J'ai perdu de vue les ESP8266, il faudrait vérifier le éventuelles particularités des GPIO que tu souhaite utiliser
https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/

Ok, merci pour l'info, je suis pas vraiement specialiste de cette carte.

Est ce que sa veux dire qu'il n'est pas possible d'utiliser de pullup ou pulldown sur cette carte?

Je vais regarder le lien.

je pense que tu peux faire

pinMode(ENTREE, INPUT_PULLUP);

pour les GPIOs disposant de pull up internes

je n'ai jamais utilisé cette carte préférant, à l'époque,la WEMOS D1 mini.

je me demande si cette ligne :

const int ENTREE = 5;   // entree pour interrupteur

ne positionne pas ENTREE sur la broche D15/D3/5 (SCL)

Je viens d'essayer ceci:

  pinMode(ENTREE, INPUT_PULLUP);   //Broche 13 en entree

Sa a l'air de marcher, merci encore de m'avoir mis sur la piste, je vais pouvoir poursuivre mon projet de watch dog!

Ca marche sur AVR pas forcément partout
Faites

pinMode(ENTREE, INPUT_PULLUP); // et pas de commentaire "idiot"

Et peut être sur cette carte il faut utiliser D5 et pas 5 comme Nº de pin

ÉDIT: je n’avais pas vu les autres réponses :wink:

Je suis en train de combiner mes 2 scriptes mais j'ai encore besoin de renseignement, sur un de mes scriptes j'ai ceci:

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

ESP8266WiFiMulti WiFiMulti;

A quoi sert la ligne :

ESP8266WiFiMulti WiFiMulti;

ESP8266WiFiMulti Vous permet de définir un certain nombre de réseaux wifi connus et si votre arduino perd la connexion en cours il essaye de se connecter à un autre réseau de la liste.

Cf Station — ESP8266 Arduino Core 3.1.2-21-ga348833 documentation