Flasher et programmer un ESP8266-01

Voici un tout petit micro-contrôleur ESP8266-01 ainsi que son programmateur et un module DHT11 (humidité et température). Nous allons réaliser un sonde température/humidité qui peut poster les données vers une page internet, envoyer un mail si la température devient trop haute (ou trop basse) ou simplement afficher les informations à la manière d’un petit serveur.

Utiliser l’ESP avec un IDE Arduino

Pour rendre plus aisé la programmation de l’ESP, nous allons passer par l’IDE Arduino. Pour cela, il faut flasher le firmware de l’ESP pour le faire communiquer. La communauté à produit un firmware adapté. Pour le flasher :

  1. Ouvrir l’IDE Arduino
  2. Fichier -> Préférences, coller l’URL de gestionnaire de cartes supplémentaires : http://arduino.esp8266.com/stable/package_esp8266com_index.json (voir le projet Github pour plus d’info).
  3. Outils -> Type de carte -> Gestionnaire de cartes
  4. Rechercher « ESP8266 » et télécharger la configuration de la carte
  5. Plusieurs nouvelles cartes apparaissent maintenant dans le menu Outils -> Type de carte
  6. Choisir Generic ESP8266 Module
  7. Adapter la configuration comme suivante :

Modifier le programmateur pour le mettre en mode flash

Il est nécessaire de faire une petite adaptation de notre programmateur afin qu’il puisse flasher l’ESP. Il faut souder un jumper entre la masse (Ground) et le GPIO 0 (Io0 ou IO Zero). Pour éviter d’avoir à souder/dessouder notre jumper, nous allons faire un jumper amovible (cf. photo ci-dessous).

Photo

Plus d’info et autres méthode de flash avec des programmateurs différents sur ce lien (en anglais).

3, 2, 1, FLASHER !

Modifier les permissions d’accès à l’USB si vous êtes sous Linux Ubuntu

sudo usermod -a -G tty Nom_Utilisateur
sudo usermod -a -G dialout Nom_Utilisateur

On peut charger le code d’exemple Blink pour s’assurer du bon fonctionnement de l’ensemble. Normalement la LED embarquée soit clignoter, si ce n’est pas le cas, vérifier votre câblage et vos soudures.

Le sketch de base pour intégrer le capteur DHT11. Ne pas oublier de charger les deux librairies DHT et Adafruit_Sensor.

/* DHTServer - ESP8266 Webserver with a DHT sensor as an input

   Based on ESP8266Webserver, DHTexample, and BlinkWithoutDelay (thank you)

   Version 1.0  5/3/2014  Version 1.0   Mike Barela for Adafruit Industries
*/
#include 
#include 
#include 
#include 
#define DHTTYPE DHT22
#define DHTPIN  2

const char* ssid     = "YourRouterID";
const char* password = "YourRouterPassword";

ESP8266WebServer server(80);

// Initialize DHT sensor 
// NOTE: For working with a faster than ATmega328p 16 MHz Arduino chip, like an ESP8266,
// you need to increase the threshold for cycle counts considered a 1 or 0.
// You can do this by passing a 3rd parameter for this threshold.  It's a bit
// of fiddling to find the right value, but in general the faster the CPU the
// higher the value.  The default for a 16mhz AVR is a value of 6.  For an
// Arduino Due that runs at 84mhz a value of 30 works.
// This is for the ESP8266 processor on ESP-01 
DHT dht(DHTPIN, DHTTYPE, 11); // 11 works fine for ESP8266

float humidity, temp_f;  // Values read from sensor
String webString="";     // String to display
// Generally, you should use "unsigned long" for variables that hold time
unsigned long previousMillis = 0;        // will store last temp was read
const long interval = 2000;              // interval at which to read sensor

void handle_root() {
  server.send(200, "text/plain", "Hello from the weather esp8266, read from /temp or /humidity");
  delay(100);
}

void setup(void)
{
  // You can open the Arduino IDE Serial Monitor window to see what the code is doing
  Serial.begin(115200);  // Serial connection from ESP-01 via 3.3v console cable
  dht.begin();           // initialize temperature sensor

  // Connect to WiFi network
  WiFi.begin(ssid, password);
  Serial.print("\n\r \n\rWorking to connect");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("DHT Weather Reading Server");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/", handle_root);

  server.on("/temp", [](){  // if you add this subdirectory to your webserver call, you get text below :)
    gettemperature();       // read sensor
    webString="Temperature: "+String((int)temp_f)+" F";   // Arduino has a hard time with float to string
    server.send(200, "text/plain", webString);            // send to someones browser when asked
  });

  server.on("/humidity", [](){  // if you add this subdirectory to your webserver call, you get text below :)
    gettemperature();           // read sensor
    webString="Humidity: "+String((int)humidity)+"%";
    server.send(200, "text/plain", webString);               // send to someones browser when asked
  });

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

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

void gettemperature() {
  // Wait at least 2 seconds seconds between measurements.
  // if the difference between the current time and last time you read
  // the sensor is bigger than the interval you set, read the sensor
  // Works better than delay for things happening elsewhere also
  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis >= interval) {
    // save the last time you read the sensor 
    previousMillis = currentMillis;   

    // Reading temperature for humidity takes about 250 milliseconds!
    // Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor)
    humidity = dht.readHumidity();          // Read humidity (percent)
    temp_f = dht.readTemperature(true);     // Read temperature as Fahrenheit
    // Check if any reads failed and exit early (to try again).
    if (isnan(humidity) || isnan(temp_f)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }
  }
}

Accédez à l’adresse IP de votre ESP et vérifier le bon fonctionnement.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *