Ordre de branchement des broches de l'ESP8266

Bonsoir ou bonjour,

J'ai réalisé un montage destiné à domotiser des volets roulants. J'ai énormément de mal à relier l'ESP 8266.
Il semblerait qu'il faille respecter un certain ordre dans les branchements, du genre :

    • 3.3v
  • GND
  • CH_PD
  • GPIO2
  • GPIO3
    autrement le wifi ne fonctionne pas. Le voyant Wifi est allumé très très fortement en permanence et souvent je n'ai d'autre solution que des recharger le croquis Arduino. Autrement, si l'on fait un RST, je suppose que cela efface tout ?
    Merci par avance de vos réponses.
    Christian

Votre ESP est en mode commandes AT / port série ou vous avez installé la version arduino dessus?

J-M-L:
Votre ESP est en mode commandes AT / port série ou vous avez installé la version arduino dessus?

Bonjour,
Il est en mode Arduino avec un programme (croquis) assez lourd.

ChristiaM:
Autrement, si l'on fait un RST, je suppose que cela efface tout ?

Non, on relance simplement le programme depuis le début.

Bonjour

Pas d'effacement au Reset parce que le code 'téléversé' est conservé dans une mémoire Flash (externe) accompagnant l'ESP8266

Au reset l'ESP8266 recharge en RAM son code à partir de la mémoire Flash SPI à condition que GPIO0 et GPIO2 soient à l'état haut (entrées). Par la suite GPIO0 et GPIO2 sont disponibles pour un autre usage.

Dans ce sens il y une contrainte temporelle pour GPIO2 pour l'éxécution du code : le laisser en entrée à l'état haut à la mise sous tension. Si , par exemple, ton montage comporte actuellement un bouton poussoir au repos à l'état bas sur GPIO2 tu empêches l'ESP8266 de booter son code.

al1fch:
...
Au reset l'ESP8266 recharge en RAM son code à partir de la mémoire Flash SPI à condition que GPIO0 et GPIO2 soient à l'état haut (entrées). Par la suite GPIO0 et GPIO2 sont disponibles pour un autre usage.

Dans ce sens il y une contrainte temporelle pour GPIO2 pour l'éxécution du code : le laisser en entrée à l'état haut à la mise sous tension. Si , par exemple, ton montage comporte actuellement un bouton poussoir au repos à l'état bas sur GPIO2 tu empêches l'ESP8266 de booter son code.
...

Merci pour ta réponse et ton explication.
J'ai essayé de remplacer les GPIO0 et GPIO2 par les GPIO1 et GPIO3, mais le programme dont code ci-dessous ne fonctionne pas (aménagement du programme Relais Wifi ici Relais Wi-fi avec ESP8266 | Oui Are Makers)


#include <ESP8266WiFi.h>
#include <aREST.h>
#include <aREST_UI.h>

// créer aREST instance
aREST_UI rest = aREST_UI();

// WiFi parameters
const char* ssid = "Livebox-D41A";
const char* password = "password";

// port conncetions TCP
#define LISTEN_PORT 80

// créer un serveur
WiFiServer server(LISTEN_PORT);
void setup(void)
{
Serial.begin(115200);

// créer UI
rest.title("Relay 1 ");rest.button(2); //GPIO2 du module
rest.title("Relay 2 ");rest.button(0); //GPIO0

// donne nom et ID au module
rest.set_id("1");
rest.set_name("esp8266");

// connecte au wifi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connecté");

// initialise le serveur
server.begin();
Serial.println("Demarage du serveur...");

// imprimme l'adresse IP donné par votre routeur
Serial.println(WiFi.localIP());

}

void loop() {

WiFiClient client = server.available();
if (!client) {
return;
}
while(!client.available()){
delay(1);
}
rest.handle(client);

}

Pourquoi ?

al1fch:
...
Au reset l'ESP8266 recharge en RAM son code à partir de la mémoire Flash SPI à condition que GPIO0 et GPIO2 soient à l'état haut (entrées). Par la suite GPIO0 et GPIO2 sont disponibles pour un autre usage.

Dans ce sens il y une contrainte temporelle pour GPIO2 pour l'éxécution du code : le laisser en entrée à l'état haut à la mise sous tension. Si , par exemple, ton montage comporte actuellement un bouton poussoir au repos à l'état bas sur GPIO2 tu empêches l'ESP8266 de booter son code.
...

Merci pour ta réponse et ton explication.
J'ai essayé de remplacer les GPIO0 et GPIO2 par les GPIO1 et GPIO3, mais le programme dont code ci-dessous ne fonctionne pas (aménagement du programme Relais Wifi ici http://ouiaremakers.com/posts/tutoriel-diy-relais-wi-fi-avec-esp8266)


#include <ESP8266WiFi.h>
#include <aREST.h>
#include <aREST_UI.h>

// créer aREST instance
aREST_UI rest = aREST_UI();

// WiFi parameters
const char* ssid = "Livebox-D41A";
const char* password = "password";

// port conncetions TCP
#define LISTEN_PORT 80

// créer un serveur
WiFiServer server(LISTEN_PORT);
void setup(void)
{
Serial.begin(115200);

// créer UI
rest.title("Relay 1 ");rest.button(2); //GPIO2 du module
rest.title("Relay 2 ");rest.button(0); //GPIO0

// donne nom et ID au module
rest.set_id("1");
rest.set_name("esp8266");

// connecte au wifi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connecté");

// initialise le serveur
server.begin();
Serial.println("Demarage du serveur...");

// imprimme l'adresse IP donné par votre routeur
Serial.println(WiFi.localIP());

}

void loop() {

WiFiClient client = server.available();
if (!client) {
return;
}
while(!client.available()){
delay(1);
}
rest.handle(client);

}

Pourquoi ?

ChristiaM:
Merci pour ta réponse et ton explication.
J'ai essayé de remplacer les GPIO0 et GPIO2 par les GPIO1 et GPIO3, mais le programme dont code ci-dessous ne fonctionne pas

Bonjour
Déjà est ce que chez toi çà compile OK ?
perso , pas chez moi (meme avec les libs arest... )

Artouste:
Bonjour
Déjà est ce que chez toi çà compile OK ?
perso , pas chez moi (meme avec les libs arest... )

Bonjour,
Oui, pas de problème de compilation.
ça fait des dizaines d'heures que je passe sur ce code pour cette application ; un coup ça marche, 10 minutes après ça ne marche plus ! J'en suis à me demander si la solution Wifi est la meilleure. En réfléchissant, les ports 0 et 2 sont utilisés pour les bootloaders et reset, les port 1 et 3 (TX et RX), ben justement ... pour les TX/RX ! Faudrait peut-être que je passe sur un esp8266-07 ?

ChristiaM:
... un coup ça marche, 10 minutes après ça ne marche plus !

Si ça "marche" 10 minutes meme de temps en temps , c'est donc que l'upload fonctionne ?

Artouste:
Si ça "marche" 10 minutes meme de temps en temps , c'est donc que l'upload fonctionne ?

Oui l'upload fonctionne, mais il y a 2 soucis :

  • de temps en temps, quand j'upload le croquis, la lumière bleu reste fortement allumée ? (j'utilise un FTDI232) à partir de là, le programme ne fonctionne pas.

  • si LED bleue est faiblement allumée, cela fonctionne, mais au bout d'un moment (3 ou 4 requêtes) le programme ne fonctionne plus.

C'est cela mon problème.

ChristiaM:
C'est cela mon problème.

Ok , mais ton probleme n'est pas du tout un probleme d'upload comme tu le laisse entendre ! :grin:

ton esp8266 est alimenté comment/par quoi ?

Artouste:
Ok , mais ton probleme n'est pas du tout un probleme d'upload comme tu le laisse entendre ! :grin:

ton esp8266 est alimenté comment/par quoi ?

Je n'ai pas l'impression d'avoir dit que j'avais un problème d'upload, mais un problème de fonctionnement.
Excuse moi si je me suis mal exprimé.

Mon ESP8266 est alimenté par 2 piles AA neuves

Pour résumer ce que je cherche à faire : mes volets roulants télécommandés n'étant pas domotisables, je simule l'appui sur les boutons de la télécommande par l'intermédiaire de 2 optocoupleurs.

Je tente de joindre un lien vers mon croquis :

Autrement une image :

Les LED rouge et verte remplace la montée et la descente du volet

Bonsoir

L'alimentation (tension correcte et courant suffisant) est un facteur clef pour le bon fonctionnement des modules à ESP8266.

Deux piles d'1,5V en série ne permettent pas un fonctionnement continu garanti.

Amener à l'ESP8266 une tension régulée de 3,3V (plus ou moins 0,2V)
Lui fournir le courant demandé (on observe à l'oscilloscope des pics de 300mA dus à l'émission radio WiFi). L'upload demandant moins de courant il n'est pas surprenanat ques les ennuis apparaissent avec la mise en route du WiFi.
Un condensateur des plusieurs centaines de µF en parallèle sur l'alimentation peut en partie permettre d'aider l'alimentation à répondre aux brèves et intenses pointes de courant.

Faute de courant suffisant l'ESP8266 resette et démarre 'de travers'.

Tous les modules complets (Nodemcu, Olimex, Adafruit, Sparkfun, Wemos.....) comportent un régulateur 3,3V de 300 ou 500mA et des condensateurs. le fonctionnement est alors sans faille..... si le code est bon.

ChristiaM:
Je n'ai pas l'impression d'avoir dit que j'avais un problème d'upload, mais un problème de fonctionnement.
Excuse moi si je me suis mal exprimé.

Mon ESP8266 est alimenté par 2 piles AA neuves

comme indiqué par al1fch 2 piles AA c'est très limite en V et en debit instantané
fais tes test avec une vraie alim 3.3V capable de debiter en continu mini 500 mA

accessoirement un petit sketch "sans lib externe " gerant 2 sorties

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>


const char* ssid = "SSID";                //  SSID of LAN/WLAN
const char* password = "PASS";        //  password



const int port = 80;                           //  port to serve pages through

const int led0 = 13;
const int led1 = 12;
const int led2 = 14;

int v1 = 0;
int v2 = 0;
unsigned long da1 = 149;
WiFiServer server(port);
IPAddress ip(192, 168, 1, 190); // OK IP BOX ORANGE
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);


void setup() {



  Serial.begin(115200);
  confap();
  //  start serial for debug



  delay(10);
  scannw();
  Serial.println();
  Serial.print("Flash Size = ");
  Serial.println(ESP.getFlashChipSize());
  pinMode(led0, OUTPUT);                       //  all outputs for LEDs
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  digitalWrite(led0, 0);                       //  all LEDs off to start
  digitalWrite(led1, 0);
  digitalWrite(led2, 0);
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);
  //  connect to WiFi network
  while (WiFi.status() != WL_CONNECTED) {        //  wait until connected
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  server.begin();                                // Start the server
  Serial.println("Server started");
  Serial.println(WiFi.localIP());                // Print the servers IP address
  WiFi.printDiag(Serial);
  Serial.println(WiFi.macAddress());
  Serial.println(WiFi.localIP());
  Serial.println(WiFi.softAPmacAddress());

  Serial.println(WiFi.softAPIP());
}
void loop() {
  WiFiClient client = server.available();        // Check if a client has connected
  if (!client) {
    return;
  }
  Serial.println("New client");                  // Wait until the client sends some data
  while (!client.available()) {
    delay(1);
  }
  String req = client.readStringUntil('\r');     // Read the first line of the request
  Serial.println(req);
  client.flush();
  if (req.indexOf("/led1/0") != -1)              //  if req = /led1/0
    v1 = 0;                                      //  set flag to turn LED1 off
  else if (req.indexOf("/led1/1") != -1)         //  if req = /led1/1
    v1 = 1;                                      //  set flag to turn LED1 on
  else if (req.indexOf("/led2/0") != -1)         //  if req = /led2/0
    v2 = 0;                                      //  set flag to turn LED2 off
  else if (req.indexOf("/led2/1") != -1)         //  if req = /led2/1
    v2 = 1;                                      //  set flag to turn LED2 on
  else {
    Serial.println("Invalid request");           //  URL not recognised
    String r = HTMLHeader();                     //  display home page
    r += HTMLPage();
    r += HTMLFooter();
    client.print(r);                              //  send page to clients browser
    client.stop();                                //  disconnect client
    return;
  }
  digitalWrite(led1, v1);                         //  set LED1 according to v1
  digitalWrite(led2, v2);                         //  set LED2 according to v2
  client.flush();
  String s = HTMLHeader();                        //  display page
  s += HTMLPage();
  s += HTMLFooter();
  digitalWrite(led0, 1);                          //  page is being sent
  client.print(s);                                //  send the response to the client
  client.stop();                                  //  disconnect client
  digitalWrite(led0, 0);                          //  finished sending page
  Serial.print("A0= ");
  Serial.println(analogRead(A0));
  delay(1);
  Serial.println("Client disconnected");
  Serial.println("");
}

String HTMLHeader() {                             //  standard HTML header
  String h = "HTTP/1.1 200 OK\r\n";
  h += "Content-Type: text/html\r\n\r\n";
  h += "<meta http-equiv=refresh content=5>\r\n";

  h += "<!DOCTYPE HTML>";
  h += "<html>\n";
  h += "<body>\n";
  return h;
}
String HTMLFooter() {                            //  standard HTML footer
  String f = "<table width=\"100%\" bgcolor=\"green\" cellpadding=\"12\" border=\"0\">\n";
  f += "<tr><td><p style = \"color: white; background: black;font-size: 0.8em;";
  f += "font-weight: bold; text-align: center; margin: 0px 10px 0px 10px;\">\n";
  f += "<a href = \"HANGAR </a> &copy; 2015</p></td></tr>";
  f += "</table>";
  f += "</body>\n";
  f += "</html>\n";
  return f;
}

String HTMLPage() {                        //   main HTML for page, edit to suit your application
  String p = "<h1>DELESTEUR SECTORIEL </h1>\n";
  p += "<p>HANGAR 76520 1 ET 2</b></p>\n";
  da1 = millis() / 1000;
  p += (da1);
  p += "<p>DELESTAGE</b> HANGAR 76520</p>\n";
  //  display links depending on current state of LEDs 1 & 2
  p += (v1) ? "<p><a href = \"/led1/0\">DESACTIVER DELESTEUR 1 </a></p>\n" : "<p><a href = \"/led1/1\">ACTIVER DELESTEUR 1 </a></p>\n";
  p += (v2) ? "<p><a href = \"/led2/0\">DESACTIVER DELESTEUR 2</a></p>\n" : "<p><a href = \"/led2/1\">ACTIVER DELESTEUR 2</a></p>\n";
  return p;
}


void scannw()
{
  // scan network

  Serial.println("scan start");

  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0)
    Serial.println("no networks found");
  else
  {
    Serial.print(n);
    Serial.println(" networks found");
    for (int i = 0; i < n; ++i)
    {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
      delay(10);
    }
  }
}

void confap() {

  const char *apssid = "76520 H1 H2";
  const char *appassword = "";
  Serial.println();
  Serial.print("SOFTAP SSID = ");
  Serial.println(apssid);
  Serial.print("SOFTAP PASSWORD = ");
  Serial.println(appassword);

  Serial.print("Configuring access point...");
  IPAddress APIp(189, 32, 16, 8);  // ok IP SOFT AP
  IPAddress NMask(255, 255, 255, 0);

  WiFi.softAPConfig(APIp, APIp, NMask);
  WiFi.softAP(apssid, appassword);

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);

}

al1fch:
Deux piles d'1,5V en série ne permettent pas un fonctionnement continu garanti.

J'ai choisi ce mode d'alimentation pour l'autonomie vis à vis d'une prise de courant secteur (lieu d'implantation dépourvu de prise et indépendance vis à vis des coupures)

al1fch:
Tous les modules complets (Nodemcu, Olimex, Adafruit, Sparkfun, Wemos.....) comportent un régulateur 3,3V de 300 ou 500mA et des condensateurs. le fonctionnement est alors sans faille..... si le code est bon.

Oui, mais on alimente tout de même en 3.3V pendant le fonctionnement en autonome ?

Artouste:
accessoirement un petit sketch "sans lib externe " gerant 2 sorties

Merci pour ce code.
Maintenant il faut que je le digère.

Accessoirement toujours :wink: , aurais-tu un ou des liens vers des tutos concernant les instructions Wifi. Je recopie le code bêtement et j'aimerais bien comprendre. (Par exemple, pourquoi écrit-on "if (req.indexOf("/led1/0") != -1) plutôt que if (req.indexOf("/led1/0") = 0))

la documentation de indexOf --> c'est une méthode que vous appelez sur une instance de la classe String qui retourne l'index sur la chaîne que vous cherchez ou -1 si pas trouvée (rien à voir avec le wifi donc)

donc if ([b][color=blue]req[/color].indexOf([color=red]"/led1/0"[/color])[/b] != -1) {duCode} ça veut dire si le résultat de l'appel de la méthode n'est pas -1 (ie si je n'ai pas trouvé la sous chaîne

"/led1/0"

dans

req

) alors exécuter duCode

bien sûr if (req.indexOf("/led1/0") [color=red]= 0[/color])) ne veut rien dire car vous ne pouvez pas effectuer une affectation au résultat d'une fonction qui retourne un nombre. je suppose que vous vouliez dire == 0 --> dans ce cas vous testeriez si vous avez trouvé la sous chaîne et qu'elle commence au tout début de req (puisque l'index serait 0)