niedziela, 23 czerwca 2019

[2] ESP32 - Arduino - ThingSpeak DHT22

W tym poście chciałbym opisać przykładową aplikację przesyłającą dane z czujnika DHT22 na serwer Thingspeak.

Znalezione obrazy dla zapytania arduino esp32
[Źródło: http://paulobrien.co.nz/2017/03/16/esp32-programming-with-arduino-on-windows/]

Program:


Na samym początku przetestuję obsługę czujnika DHT22:

  1. #include <WiFi.h>
  2. #include "DHT.h"
  3. #define DHTTYPE DHT22   // DHT 22
  4. uint8_t DHTPin = 4;
  5. unsigned long previousMillis = 0;  
  6. const long interval = 10000;  
  7. DHT dht(DHTPin, DHTTYPE);                
  8. float Temperature;
  9. float Humidity;
  10. void setup() {
  11.   Serial.begin(115200);
  12.   delay(100);
  13.   pinMode(DHTPin, INPUT);
  14.   dht.begin();
  15.                
  16.   Serial.println("Program start");
  17. }
  18. void loop() {
  19.   unsigned long currentMillis = millis();
  20.   if (currentMillis - previousMillis >= interval) {
  21.       previousMillis = currentMillis;
  22.       Temperature = dht.readTemperature(); // Gets the values of the temperature
  23.       Humidity = dht.readHumidity(); // Gets the values of the humidity
  24.       if(!isnan(Temperature) && !isnan(Humidity))
  25.       {
  26.         Serial.print("Temp: ");
  27.         Serial.print(Temperature, 3);
  28.         Serial.print(" st.C Humid: ");
  29.         Serial.print(Humidity, 3);
  30.         Serial.println(" %;");
  31.       }
  32.       else
  33.       {
  34.         Serial.println("Temp: 0 st.C Humid: 0%;");
  35.       }
  36.   }
  37. }

Program powyżej pobiera dane z czujnika DHT co 10 sekund. Na samym początku definiuje zmienne oraz klasę z funkcjami od czujnika. Pin danych podłączony został do linii 4 (D4)

Pomiar czasu wykonywany jest za pomocą funkcji millis(), która zwraca czas od uruchomienia układu ESP32.

Podłączenie do serwera ThingSpeak polega na połączeniu się z istniejącą siecią wifi oraz podpięciu się pod serwer thingspeak na porcie 80.

  1.    if(client.connect(serverAddress,80)){
  2.         String dataToSend = apiKey;
  3.         dataToSend += "&field1=";
  4.         dataToSend += String(temp);
  5.         dataToSend += "&field2=";
  6.         dataToSend += String(humid);
  7.    
  8.         Serial.println(dataToSend);
  9.         dataToSend += "\r\n\r\n";
  10.         client.print("POST /update HTTP/1.1\n");
  11.         client.print("Host: api.thingspeak.com\n");
  12.         client.print("Connection: close\n");
  13.         client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");
  14.         client.print("Content-Type: application/x-www-form-urlencoded\n");
  15.         client.print("Content-Length: ");
  16.         client.print(dataToSend.length());
  17.         client.print("\n\n");
  18.         client.print(dataToSend);
  19.         delay(500);
  20.   }

Dodatkowo w związku z tym, że urządzenie działa z baterii dodałem wprowadzanie ESP w stan uśpienia, po którym następuje ponowna inicjalizacja zmiennych.. Układ zostaje uśpiony na 50 sekund.

Pełny program:

  1. #include <WiFi.h>
  2. #include "DHT.h"
  3. #define uS_TO_S_FACTOR 1000000  
  4. #define TIME_TO_SLEEP  50      
  5. #define DHTTYPE DHT22   // DHT 22
  6. uint8_t DHTPin = 4;
  7. #define ONE_WIRE_LINE 2
  8. String apiKey = "THINGSPEAK_API_KEY";    
  9. const char* serverAddress = "api.thingspeak.com";  
  10. char ssid[] = "SSID";
  11. char pass[] = "PASSWORD";
  12. unsigned long previousMillis = 0;  
  13. const long interval = 10000;  
  14. float Temperature;
  15. float Humidity;
  16. WiFiClient client;
  17. DHT dht(DHTPin, DHTTYPE);
  18. void setup() {
  19.   Serial.begin(115200);
  20.   delay(100);
  21.   pinMode(DHTPin, INPUT);
  22.   dht.begin();
  23.      
  24.   int connectTries = 0;
  25.   WiFi.mode(WIFI_STA);
  26.   WiFi.begin(ssid, pass);
  27.    
  28.   while(WiFi.status() != WL_CONNECTED){
  29.     delay(100);
  30.     connectTries++;
  31.     if(connectTries > 30){
  32.       ESP.deepSleep(30000000);
  33.     }
  34.   }
  35.   Serial.println("Wifi connected");
  36.   esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  37. }
  38. void loop() {
  39.   unsigned long currentMillis = millis();
  40.   if (currentMillis - previousMillis >= interval) {
  41.       previousMillis = currentMillis;
  42.       Temperature = dht.readTemperature(); // Gets the values of the temperature
  43.       Humidity = dht.readHumidity(); // Gets the values of the humidity
  44.       if(!isnan(Temperature) && !isnan(Humidity))
  45.       {
  46.         Serial.print("Temp: ");
  47.         Serial.print(Temperature, 3);
  48.         Serial.print(" st.C Humid: ");
  49.         Serial.print(Humidity, 3);
  50.         Serial.println(" %;");
  51.       }
  52.       else
  53.       {
  54.         Serial.println("Temp: 0 st.C Humid: 0%;");
  55.         Temperature = 0.0;
  56.         Humidity = 0.0;
  57.       }
  58.       communicateWithServer(Temperature, Humidity);
  59.   }
  60. }
  61. void communicateWithServer(float temp, float humid)
  62. {
  63.     if(client.connect(serverAddress,80)){
  64.         String dataToSend = apiKey;
  65.         dataToSend += "&field1=";
  66.         dataToSend += String(temp);
  67.         dataToSend += "&field2=";
  68.         dataToSend += String(humid);
  69.    
  70.         Serial.println(dataToSend);
  71.         dataToSend += "\r\n\r\n";
  72.         client.print("POST /update HTTP/1.1\n");
  73.         client.print("Host: api.thingspeak.com\n");
  74.         client.print("Connection: close\n");
  75.         client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");
  76.         client.print("Content-Type: application/x-www-form-urlencoded\n");
  77.         client.print("Content-Length: ");
  78.         client.print(dataToSend.length());
  79.         client.print("\n\n");
  80.         client.print(dataToSend);
  81.         delay(500);
  82.   }
  83.   esp_deep_sleep_start();
  84. }