Ceci est une ancienne révision du document !
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