![]() |
Fiche mémo ESP8266 |
Janvier 2019 |
Tout commence par un schéma. Il y a quelques années construire un module doté des mêmes fonctions aurai
demandé des connaissances poussées en électronique, aujourd'hui avec l'intégration de fonctions complexes
dans des modules tout prêt, simplifies considérablement la démarche. Pour réaliser un PCB de petite taille
le logiciel eagles vous permet de le faire avec une version de démonstration, je vous invite à découvrir
ce logiciel fantastique. Les modules utilisés n’étaient pas présent dans la bibliothèque d'origine du logiciel
on peut en trouver en téléchargement sur internet et ainsi enrichir la bibliothèque du logiciel. Dans ce schéma
j'ai cherché à pouvoir réutiliser au maximum le circuit imprimé. On voit par exemple qu'il est possible d'utiliser
la carte avec deux types d'alimentation, si vous avez une alimentation en 3.3v (pile par exemple) vous n'avez pas
besoin de souder une alim DD/DD elle ne sera pas utilisée. Les entrées/sorties du cpu sont toutes sortie et suivant
les projets elles pourront être exploitées sur des petits connecteurs... J'ai choisi d'implanter l'ESP coté composant
et non coté cuivre, il suffit donc de passer des petits fils à travers le circuit et le PCB et de les souder de chaque coté.
L'ESP n'est pas au pas de 2.54 il faut donc vérifier lors du routage qu'il n'y a pas de piste qui passe entre
ses pattes (trop peu de place).
Il faut également veiller à la dimension des pistes des contacts des relais
qui sont supposer laisser passer une intensité bien supérieur au reste du montage.
De nombreuses tentatives de
routage sont nécessaires pour arriver au résultat voulu.
L'interface de routage du logiciel eagles :
Le PCB nu avec un essai de routage inabouti :
Une option est téléchargeable dans eagles, elle permet de créer une sortie en "gravure à l'anglaise'.
C'est indispensable pour travailler avec une CNC. L'idée est de découper le minimum de cuivre autour des pistes.
La piste cuivrée et les pastilles se retrouvent entourées par des tranchées qui les isolent du reste du circuit.
C'est là que ma nouvelle CNC est intervenue, je vous invite à visiter la partie CNC de mon site pour comprendre
de quoi je vous parle...
Dans cette version elle est équipée en entrée d'un capteur de température / humidité
et de deux relais pour pouvoir commander un luminaire et la pompre d'une fontaine dans mon jardin.
Les deux sorties
de relais sont protégées par des fusibles.
Le wifi a une bonne portée d'environ 30m + traversée fenêtre (volets alu)
+ 5m en intérieur.
Un bouton de reset du processeur est dispo sur le PCB.
Il y a également un bouton qui permet de
basculer du mode programmation au mode execution de l'ESP.
Le dernier bouton est simplement un marche / arret.
Comme on peut le voir sur le côté soudures à force de souder et dessouder sur les petites pastilles des transistors (suite à la recherche d'un problème qui était en réalité logiciel !) j'ai fini par décoller certaines pastilles et j'ai été obligé de réaliser quelques straps ! (je n'en suis pas très fier !)
Ici on voit mieux les soudures sur les pattes de l'ESP côté composant.
Le code (perfectible je n'en doute pas !) à modifier selon vos besoins (j'ai utilisé la mémoire secondaire de l'esp pour afficher l'image).
Attention vous devez entrer dans le programme le nom réseau de votre box et sa clé (à la place des xxxx).
L'esp se programme directement avec l'interface arduino ce qui facilite grandement la manip...
:
// Carte PCB1 avec :
// - Capteur température et humidité
// - Capteur courant
// - 2 relais
//
#include "ESP8266WiFi.h"
#include "WiFiClient.h"
#include "ESP8266WebServer.h"
#include "ESP8266mDNS.h"
#include "Wire.h"
#include "SSD1306.h"
#include "DHT.h"
#define DHTTYPE DHT22
const char* box = "Livebox-xxxx"; // Nom de la box
const char* m_passe = "xxxxxxxxxxxxxxxxxxx"; // Passe WiFi
ESP8266WebServer server(80);
#define REL_1 14
#define REL_2 4
#define DHTPIN 5 // GPIO5
#define ANAL_IN A0 // ADC entrée analogique du capteur de courant
DHT dht(DHTPIN, DHTTYPE); // déclaration objet DHT22
float v_temp = 0; // temperature
float v_temp_f = 0; // temperature Fahrenheit
float v_humid = 0; // humidité
double val_ic= 0; // valeur capteur courant
int mv_par_amp = 185; // Milli volt par Ampere (ACS712 : 100 pour 20A ou 66 pour 30A)
int ACS712_offset = 2500;
int relais[4]; // Etat des relais
unsigned long temp_lect = 0; // calcul du temps entre les lectures
String page_fab(){
String page = "<html lang=fr-FR><head><meta http-equiv='refresh' content='10'/>";
page += "<title>ESP METEO</title>";
page += "<style> body { background-color: #fffff; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style>";
page += "</head><body>";
page += "<h1>LA ROCHELLE</h1>";
// Donnée météo
page += "<h3>Données météo</h3>";
page += "<ul><li>Température : ";
if(isnan(v_temp)) page += "Lecture en cours..."; else page += String(v_temp);
page += " ºC ( Ressentie : ";
if(isnan(v_temp_f)) page += "Lecture en cours..."; else page += String(v_temp_f);
page += " ºC )</li>";
page += "<li>Humidité : ";
if(isnan(v_humid)) page += "Lecture en cours..."; else page += String(v_humid);
page += " %</li></ul>";
// Consomation courant
page += "<h3>Consomation</h3>";
page += "<ul><li>Valeur courant : ";
if(isnan(val_ic)) page += "Lecture en cours..."; else page += String(val_ic,3);
page += " mA</li></ul>";
// Etat des relais
page += "<h3>ETAT DES RELAIS</h3>";
page += "<form action='/meteo' method='POST'>";
page += "<ul>";
page += "<li>Relais 1 : "; page += relais[1]==0?"OFF":"ON"; page += "</li>";
page += "<li>Relais 2 : "; page += relais[2]==0?"OFF":"ON"; page += "</li>";
page += "</ul>";
// Actualiser
page += "<br><INPUT type='submit' value='Actualiser'>";
page += "</body></head>";
return page;
}
//---------------------Effectue une requete sur le capteur que si un délai de 2 secondes est respecté
void get_data_dht() {
const long interval = 2000; // interval de 2 secondes
unsigned long sec_act = millis();
if(sec_act - temp_lect >= interval){
temp_lect = sec_act;
v_humid = dht.readHumidity(); // Lecture du taux d'humidité
v_temp = dht.readTemperature(); // Lecture de la température en Celcius
v_temp_f = dht.readTemperature(true); // Lecture température en Fahrenheit
v_temp_f = dht.convertFtoC(dht.computeHeatIndex(v_temp_f, v_humid)); // Calcul de la température ressentie
int lect_val_ic = analogRead(ANAL_IN); // Lecture courant
double voltage = (lect_val_ic / 1024) * 5000; // valeur en mV
val_ic = ((voltage - ACS712_offset) / mv_par_amp);
/*
courant = (float)(valeur_senseur-zero_senseur)/1024*5/ACS712_RAPPORT*100000;
// Courant efficace en mA
courant_efficace = courant / 1.414; // divisé par racine de 2
// Calcul de la puissance.
// On divise par 1000 pour transformer les mA en Ampère
puissance_efficace = (courant_efficace * tension_efficace/1000);
*/
if (isnan(v_humid) || isnan(v_temp)){
return;
}
}
}
void setup(void){
//Serial.begin(115200);
pinMode(REL_1, OUTPUT); digitalWrite(REL_1, 0); relais[1] = 0;
pinMode(REL_2, OUTPUT); digitalWrite(REL_2, 0); relais[2] = 0;
//pinMode(DHTPIN, INPUT_PULLUP);
dht.begin(); //démarrage du capteur dht11
// Cnx WiFi
WiFi.begin(box, m_passe);
//Serial.println("");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
//Serial.print(".");
}
// Affichage adr IP (DHSCP) sur interface série pour joindre le serveur
// Serial.println("");
// Serial.print("Adr IP : ");
// Serial.println(WiFi.localIP());
//Serial.println(page_fab());
// Traitement des requetes
server.on("/r1_off", [](){ digitalWrite(REL_1, LOW); relais[1] = 0; server.send(200, "text/html", page_fab()); });
server.on("/r1_on", [](){ digitalWrite(REL_1, HIGH); relais[1] = 1; server.send(200, "text/html", page_fab()); });
server.on("/r2_off", [](){ digitalWrite(REL_2, LOW); relais[2] = 0; server.send(200, "text/html", page_fab()); });
server.on("/r2_on", [](){ digitalWrite(REL_2, HIGH); relais[2] = 1; server.send(200, "text/html", page_fab()); });
server.on("/meteo", [](){ get_data_dht(); server.send(200, "text/html", page_fab()); });
server.begin();
}
void loop(){
server.handleClient();
//if(not isnan(v_temp))
//if(not isnan(v_humid))
}
Comme on peut le voir l'interface est facilement accessible à l'aide d'une adresse locale
ou si vous l'autorisez depuis le web. On voit ici une copie d'écran de mon Iphone. Je sais il fait trop chaud chez moi,
j'ai des problèmes avec mon chauffage par le sol ! c'est tout l'un ou tout l'autre ! Grrrrrrrrrrr
Les données concernant l'anémomètre et la consommation du montage ne font pas partie de cette présentation.
Ici c'est une photo de l'interface sur mon micro.
J'espere que cette petite présentation vous aura donné l'envie de vous lancer... Le prix d'un Esp-8266e12 n'est que de 3 ou 4 euros.