ESP01 - Arduino - Google Home

Bonjour à tous,

Dans le cadre d’un petit projet de domotique, je souhaiterais faire communiquer mon Google Home avec mon arduino (Uno ou méga). Pour cela j’utilise un ESP_01, que je souhaite d’une part faire dialoguer en MQTT avec un site type Adafruit ou Blynk (puis faire dialoguer Google avec le site via IFTTT), et d’autre part avec mon arduino pour que celle ci récupère l’information et puisse ensuite passer des signaux digitaux à HIGH.

Côté ESP_01, j’ai réussi à établir la connection avec, et à communiquer avec lui par le biais de l’IDE en commande AT.

Le problème que je rencontre survient lorsque je tente d’importer des exemples de codes trouvés sur internet. Voici ce que m’affiche le débugger :

Plusieurs bibliothèque trouvées pour "ESP8266WiFi.h"
Utilisé : /Users/theo/Documents/Arduino/libraries/ESP8266WiFi
In file included from /Users/theo/Documents/Arduino/libraries/ESP8266WiFi/src/ESP8266WiFi.h:33:0,
Non utilisé : /Users/theo/Documents/Arduino/libraries/ESP8266wifi-master
                 from /Users/theo/Documents/Arduino/sketch_feb16f/sketch_feb16f.ino:1:
/Users/theo/Documents/Arduino/libraries/ESP8266WiFi/src/ESP8266WiFiType.h:26:10: fatal error: queue.h: No such file or directory
 #include <queue.h>

          ^~~~~~~~~
compilation terminated.
exit status 1
Erreur de compilation pour la carte Arduino/Genuino Uno

Et voici le code importé :

#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
 
#define prelay1 D1
#define prelay2 D2
 
#define WLAN_SSID       "Votre SSID"
#define WLAN_PASS       "Votre mdp Wifi"
#define relay D1
 
#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883                   // use 8883 for SSL
#define AIO_USERNAME    "Votre nom d'utilisateur"
#define AIO_KEY         "Votre clé d'utilisateur"
 
 
WiFiClient client;
 
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
 
Adafruit_MQTT_Subscribe relay1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/lumiere1");
 
Adafruit_MQTT_Subscribe relay2 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/lumiere2");
 
 
 
 
void MQTT_connect();
 
void setup() {
  Serial.begin(115200);
  delay(10);
  pinMode(prelay1,OUTPUT);
  pinMode(prelay2,OUTPUT);
 
 
  Serial.println(F("Adafruit MQTT demo"));
 
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);
 
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
 
  Serial.println("WiFi connected");
  Serial.println("IP address: "); Serial.println(WiFi.localIP());
  mqtt.subscribe(&relay1);
   mqtt.subscribe(&relay2);
 
 
}
uint32_t x=0;
void loop() {
  MQTT_connect();
 
  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(5000))) {
   
    if (subscription == &relay1) {
      Serial.print(F("Got: "));
      Serial.println((char *)relay1.lastread);
      uint16_t state1 = atoi((char *)relay1.lastread);
      if(state1 == 1){
     digitalWrite(prelay1,LOW);
      }else{
        digitalWrite(prelay1,HIGH);
      }
     
    }
 
   
    if (subscription == &relay2) {
      Serial.print(F("Got: "));
      Serial.println((char *)relay2.lastread);
      uint16_t state2 = atoi((char *)relay2.lastread);
     
      if(state2 == 1){
     digitalWrite(prelay2,LOW);
      }else{
        digitalWrite(prelay2,HIGH);
      }
     
    }
  }
 
}
void MQTT_connect() {
  int8_t ret;
if (mqtt.connected()) {
    return;
  }
 
  Serial.print("Connecting to MQTT... ");
 
  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) {
       Serial.println(mqtt.connectErrorString(ret));
       Serial.println("Retrying MQTT connection in 5 seconds...");
       mqtt.disconnect();
       delay(5000);
       retries--;
       if (retries == 0) {
         while (1);
         
       }
  }
  Serial.println("MQTT Connected!");
}

Il semblerait donc qu’un problème se pose au niveau de mes bibliothèques. Néanmoins, malgré ce qu’indique le débugger, la librairie “queue.h” est bien présente dans mes librairies.

Je précise aussi que mes librairies ont été importées depuis Github.

Je m’en remets donc à vos connaissances pour m’aider !

Théo

Essaye de mettre cette ligne en commentaire (// en début de ligne)

Laquelle ?

#include <queue.h>

Merci pour le réponse.

J’ai placé la ligne #include <queue.h> en commentaire dans la librairie ESP86WifiType.h et voici ce que le débugger affiche :

Plusieurs bibliothèque trouvées pour "ESP8266WiFi.h"
Utilisé : /Users/theo/Documents/Arduino/libraries/ESP8266WiFi
In file included from /Users/theo/Documents/Arduino/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.h:28:0,
Non utilisé : /Users/theo/Documents/Arduino/libraries/ESP8266wifi-master
                 from /Users/theo/Documents/Arduino/libraries/ESP8266WiFi/src/ESP8266WiFi.h:34,
                 from /Users/theo/Documents/Arduino/sketch_feb16f/sketch_feb16f.ino:1:
/Users/theo/Documents/Arduino/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h:27:10: fatal error: functional: No such file or directory
 #include <functional>

          ^~~~~~~~~~~~
compilation terminated.
exit status 1
Erreur de compilation pour la carte Arduino/Genuino Uno

J’ai bien l’impression qu’un problème en amène un autre…

Bonsoir

compilation terminated.

exit status 1
Erreur de compilation pour la carte Arduino/Genuino Uno

La dernière ligne montre une erreur de désignation de la cible, le code envisagé (avec ses librairies) est destiné à être compilé pour tourner sur ESP8266, pas sur un micro AT Mega328 (carte UNO)

Ce n'est pas un code par lequel une carte UNO gère un ESP8266 'satellite' via des commandes AT mais un code pour un ESP8266 autonome, sans carte Arduino ...... un ESP8266 'libéré' comme nous le préférons bien souvent sur ce forum.

Si le projet reste axé sur la combinaison UNO + ESP01 avec son firmware AT il faut oublier toutes ces belles librairies :disappointed_relieved: et reprendre la gestion exclusive par des commandes AT.

En effet, je comprends mieux l'origine de ces messages d'erreurs...

J'ai bien compris au travers des différents forums/tuto que j'ai parcouru qu'il était préférable de faire fonctionner les modules ESP8266 de façon autonome. Cependant le projet sur lequel je travaille nécessite un nombre conséquent d'E/S, et même la NodeMCU dont je dispose n'en comporte pas suffisamment.

N'y-a-t-il aucun moyen d'implémenter un code sur l'ESP-01 qui dialoguerait avec le serveur Adafruit (par ex) et qui pourrait ensuite envoyer un signal à l'Arduino en Input ? Comme une passerelle ?
J'avoue qu'avec mes sommaires connaissances en commandes AT, je ne vois pas bien comment parvenir à mon objectif...

Et un petit MCP23008 (expander 8 GPIOs) ou MCP23017 (expander 16 GPIOs) I2C ?
Ou MCP23S08 (expander 8 GPIOs) ou MCP23S17 (expander 16 GPIOs) SPI ?

Et un petit MCP23008 (expander 8 GPIOs) ou MCP23017 (expander 16 GPIOs) I2C ?
Ou MCP23S08 (expander 8 GPIOs) ou MCP23S17 (expander 16 GPIOs) SPI ?

Je ne connais pas ces modules, de quoi s’agit-il ?

Des expanders de GPIOs.

les-extensions-de-gpios-de-larduino

On peut tous les alimenter en 3.3V

Pour que les choses soient plus claires, mon projet est le suivant : je souhaite construire un distributeur automatique de croquettes. Celui-ci comportera donc un stepper type 28byj-48 contrôlé par une petite carte ULN2003, un écran LCD 16x2 avec un bus I2C, un potentiomètre de réglage de vitesse de vis, un module RTC, quelques LED, quelques boutons poussoirs (notamment pour la marche forcée).

Pour la partie locale, pas trop de soucis. Mais je souhaite ensuite pouvoir actionner la vis en marche forcée depuis mon téléphone. Pour cela, n'ayant presque aucune connaissance réseau, j'ai pensé que profiter des protocoles de sécurité Google serait préférable plutôt que de créer un serveur avec une IP publique.

Maintenant que vous savez tout, je suis ouvert à toutes les suggestions qui se prêteraient mieux à mon projet qu'un module ESP_01.

Des expanders de GPIOs.

L'idée serait donc d'ajouter des GPIOs sur l'ESP_01 ou le NodeMCU ? En tant que novice sur Arduino, j'ai bien peur que cela complique énormément mon montage...

Pour que les choses soient plus claires

Tu aurais commencé par là ...
C'est ce que l'on constate souvent : peu de clarté dans la demande. Le demandeur expose un problème purement technique sans décrire le projet.

Un écran I2C peut se piloter avec un ESP01 : SDA = GPIO0, SCL = GPIO2

Un module RTC : idem

Un potentiomètre de réglage : là ça coince ... pas de pin ADC sur ESP01

quelques LED, quelques boutons poussoirs : un expander

Pourquoi un ESP01 ?
Un simple ESP-12E (NodeMCU) ou ESP32 te permettrait de tout faire sans aucun problème, sans ARDUINO, sans expander.

Mes excuses, j’espère que c’est plus clair maintenant.

A vrai dire je suis bien plus familier avec l’Arduino qu’avec le NodeMCU… Mais j’ai bien compris que la solution la plus simple serait celle-ci. Je vais donc plancher sur le sujet ! Une première question :

  • Le stepper, le module RTC et le LCD peuvent-ils fonctionner correctement en 3,3V ?

Merci beaucoup pour votre aide et votre temps. J’aurai sûrement de nombreuses autres questions à vous poser dans les jours qui viennent ! :slight_smile:

3.3V à priori OUI.

ULN2003 (moteur et ULN2003 en 5V)

RTC : dépend du module. Peu d'intérêt d'avoir un RTC en étant connecté en WIFI. Un client NTP plutôt.

LCD 16x2 : non. Le contraste sera mauvais.
Par contre le LCD pourrait être alimenté en 5V comme le moteur et être piloté en I2C 3.3V.

Tu pourrais sincèrement envisager un SSD1306 (I2C aussi) :

Autrement plus confortable, petit et esthétique.

Merci pour ces conseils. Je vais donc m'orienter vers une solution NodeMCU avec une alimentation 5V (sur le Vin).

J'ai cependant une question : a en croire ce schéma Schéma, il semblerait que le NodeMCU dispose de 13 GPIO. Néanmoins les pins S2 et S3 sont elles utilisables comme de simples GPIO ?

Non, il vaut mieux éviter d’y toucher si on ne sait pas exactement ce qu’on fait (voir ici)

Ok c'est noté. Je vais donc avoir besoin d'un extender. Que pensez-vous du PCF8574AN ? (celui-ci)

Pour le branchement, j'ai lu que celui-ci fonctionnait en I2C. Je vais donc le relier aux PIN D1 et D2 du NodeMCU (SCL et SDA) + une alimentation 3,3V sur le VCC.
Or, mon projet intègre aussi un LCD fonctionnant en I2C. Or si mes broches SCL et SDA sont déjà utilisées par l'extender, comment brancher mon écran ?

Merci à vous !

Le lien que j'ai signalé proposait le MCP23017 , 16 ports, aussi en I2C.

L'intérêt de l'I2C est que c'est un bus : il permet de faire communiquer plusieurs devices sur les mêmes fils. Donc tous les devices qui communiquent sur le même bus I2C sont connectés en parallèle. il faut ajouter des résistances de rappel à VCC des lignes SDA et SCL. Si elles sont déjà présentes sur l'un des modules que tu utilises, il n'est pas nécessaire d'en ajouter. Des 4700 Ohms feront l'affaire.

Super merci pour toutes ces connaissances !

Un module comme celui-ci dispose bien de résistance de rappel ?