{{tag>hardware dev esp8266 ide_arduino}}
====== WSKS: Weather Station Kit by ideaSpark ======
Station météo à monter soi-même. Elle est bâtie autour d'un devkit de type NodeMCU devKit version 3. Le pack contient:
* Une carte (devkit) de type NodeMCU 1.0 avec un module ESP12-E (intégrant un microcontrôleur ESP8266XE et 4MB de mémoire Flash). La carte est marquée HW-625
* un **DHT11**
* un circuit intégré **BMP180**
* un afficheur OLED I2C
* Installer l'IDE Arduino
* Installer la chaîne de compilation pour ESP8266
Configurer la cible en sélectionnant NodeMCU 1.0 parmi les cartes basées sur les microcontrôleurs ESP8266:
* Menu Outils -> Type de carte -> ESP8266 Boards -> NodeMCU 1.0(ESP-12E Module)
La documentation du kit IdeaSpark recommande de flasher le firmware:
* Ai-Thinker_ESP8266_DOUT_8Mbit_v1.5.4.1-a_20171130.bin contenu dans le fichier doc
On peut utiliser l'outil en ligne de commande **esptool** pour flasher le firmware:
$ esptool.py --port /dev/ttyUSB0 flash_id
esptool.py v2.8
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 50:02:91:e0:a2:de
Uploading stub...
Running stub...
Stub running...
Manufacturer: ef
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...
===== =====
cd /tmp
wget "https://github.com/GJKJ/WSKS/blob/master/WSK.rar"
===== Installation des bibliothèques =====
Lancer l'IDE Arduino:
* Menu **Croquis** -> **Inclure une bibliothèque** -> **Gérer les bibliothèques**
* Rechercher et installer **ESP8266 Weather Station** et sa dépendance **JSON Streaming Parser**
* Rechercher et installer **ESP8266 OLED Driver for SSD1306 display**
* Rechercher et installer **Adafruit BMP085 Library** ainsi que ses dépendances (Adafruit Unified Sensor et Adafruit BusIO)
===== Montage et tests unitaires =====
Pour faciliter la mise en service de la station, j'ai fait le choix de monter et tester chaque module indépendamment. Une fois le montage validé, le programme pourra être téléversé.
==== Flashage du firmware Espressif ====
==== Montage du capteur DHT11 ====
^ Devkit ^ DHT11 |
| D5 (GPIO14) | out |
| G | - |
| 3V | + |
==== Code de test ====
#define pin 14 // ESP8266-12E D5 read emperature and Humidity data
int temp = 0; //temperature
int humi = 0; //humidity
void readTemperatureHumidity();
void uploadTemperatureHumidity();
void setup() {
Serial.begin(115200);
}
void loop() {
readTemperatureHumidity();
delay(4000);
}
//read temperature humidity data
void readTemperatureHumidity(){
int j;
unsigned int loopCnt;
int chr[40] = {0};
unsigned long time1;
bgn:
delay(2000);
//Set interface mode 2 to: output
//Output low level 20ms (>18ms)
//Output high level 40μs
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(20);
digitalWrite(pin, HIGH);
delayMicroseconds(40);
digitalWrite(pin, LOW);
//Set interface mode 2: input
pinMode(pin, INPUT);
//High level response signal
loopCnt = 10000;
while (digitalRead(pin) != HIGH){
if (loopCnt-- == 0){
//If don't return to high level for a long time, output a prompt and start over
Serial.println("HIGH");
goto bgn;
}
}
//Low level response signal
loopCnt = 30000;
while (digitalRead(pin) != LOW){
if (loopCnt-- == 0){
//If don't return low for a long time, output a prompt and start over
Serial.println("LOW");
goto bgn;
}
}
//Start reading the value of bit1-40
for (int i = 0; i < 40; i++){
while (digitalRead(pin) == LOW){}
//When the high level occurs, write down the time "time"
time1 = micros();
while (digitalRead(pin) == HIGH){}
//When there is a low level, write down the time and subtract the time just saved
//If the value obtained is greater than 50μs, it is ‘1’, otherwise it is ‘0’
//And save it in an array
if (micros() - time1 > 50){
chr[i] = 1;
} else {
chr[i] = 0;
}
}
//Humidity, 8-bit bit, converted to a value
humi = chr[0] * 128 + chr[1] * 64 + chr[2] * 32 + chr[3] * 16 + chr[4] * 8 + chr[5] * 4 + chr[6] * 2 + chr[7];
//Temperature, 8-bit bit, converted to a value
temp = chr[16] * 128 + chr[17] * 64 + chr[18] * 32 + chr[19] * 16 + chr[20] * 8 + chr[21] * 4 + chr[22] * 2 + chr[23];
Serial.print("temp:");
Serial.print(temp);
Serial.print(" humi:");
Serial.println(humi);
}
==== Montage du capteur BMP185 ====
SCL -> D1
SDA -> D2
===== Montage capteur de luminosité =====
^ Devkit ^ BH1750FVI |
| 3V | VCC |
| D1 | SCL |
| D2 | SDA |
| G | GND |
#include
const int Light_ADDR = 0b0100011; // address:0x23
int tempLight = 0;
void readLight();
void setup() {
Serial.begin(115200);
Wire.begin();
//initialize light sensor
Wire.beginTransmission(Light_ADDR);
Wire.write(0b00000001);
Wire.endTransmission();
}
void loop() {
readLight();
delay(5000);
}
void readLight(){
// reset
Wire.beginTransmission(Light_ADDR);
Wire.write(0b00000111);
Wire.endTransmission();
Wire.beginTransmission(Light_ADDR);
Wire.write(0b00100000);
Wire.endTransmission();
// typical read delay 120ms
delay(120);
Wire.requestFrom(Light_ADDR, 2); // 2byte every time
for (tempLight = 0; Wire.available() >= 1; ) {
char c = Wire.read();
tempLight = (tempLight << 8) + (c & 0xFF);
}
tempLight = tempLight / 1.2;
Serial.print("light: ");
Serial.println(tempLight);
}
===== Montage de l'écran OLED =====
^ DevKit ^ OLED |
| 3V | Vcc |
| G | GND |
| D1 | SCL |
| D2 | SDA |
===== Références =====
* https://github.com/GJKJ/WSKS
* https://github.com/ThingPulse/esp8266-weather-station
* https://create.arduino.cc/projecthub/luciorocha/ai-thinker-ai-cloud-inside-esp8266-update-firmware-reviewed-3e306c
* https://www.esp8266.com/viewtopic.php?t=6260
* https://robertoostenveld.nl/esp8266-at-firmware/
* https://github.com/espressif/ESP8266_NONOS_SDK
* https://github.com/espressif/ESP8266_AT (n'est plus maintenu)
* https://docs.espressif.com/projects/esp-at/en/latest/
* https://docs.espressif.com/projects/esp-at/en/latest/Get_Started/Downloading_guide.html