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:
Configurer la cible en sélectionnant NodeMCU 1.0 parmi les cartes basées sur les microcontrôleurs ESP8266:
La documentation du kit IdeaSpark recommande de flasher le firmware:
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"
Lancer l'IDE Arduino:
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é.
Devkit | DHT11 |
---|---|
D5 (GPIO14) | out |
G | - |
3V | + |
#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); }
SCL → D1 SDA → D2
Devkit | BH1750FVI |
---|---|
3V | VCC |
D1 | SCL |
D2 | SDA |
G | GND |
#include <Wire.h> 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); }
DevKit | OLED |
---|---|
3V | Vcc |
G | GND |
D1 | SCL |
D2 | SDA |