czwartek, 7 listopada 2019

[5] ESP32 - Odczyt danych z czujników DHT22 oraz DS18B20 z zapisem w Thinger.io

W tym poście chciałbym przedstawić szybki projekt układu pozwalającego na przesyłanie danych z czujników na platformę thinger io. 

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

Program:


Całość projekt została oparta o czujnik DHT22, czujnik DS18B20, wyświetlacz OLED 0,96 sterowany przez SPI.

Podłączenie:


OLED:

  • GND - GND
  • VCC - 3V3
  • SCL - SPI CLK pin 18
  • SDA - SPI MOSI pin 19
  • RST -  pin 13
  • D/C - 21

DS18B20:

Linia danych podłączona pod pin D4 na ESP32.

DHT22:

Linia danych podłączona pod pin D22 na ESP32.

Poniżej program do obsługi wyświetlacza oraz czujników DS18B20 i DHT22. W poniższym programie nie uwzględniłem obsługi Thinger.io:

  1. #include <SPI.h>
  2. #include <Wire.h>
  3. #include <OneWire.h>
  4. #include <DallasTemperature.h>
  5. #include <Adafruit_GFX.h>
  6. #include <Adafruit_SSD1306.h>
  7. #include "DHT.h"
  8.  
  9. #define SCREEN_WIDTH 128 // OLED display width, in pixels
  10. #define SCREEN_HEIGHT 64 // OLED display height, in pixels
  11.  
  12. #define OLED_MOSI  19
  13. #define OLED_CLK   18
  14. #define OLED_DC    21
  15. #define OLED_CS    5
  16. #define OLED_RESET 13
  17.  
  18. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  19.   OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
  20.  
  21. #define DHTTYPE DHT22   // DHT 22
  22. uint8_t DHTPin = 22;
  23.  
  24. uint8_t DS18b20Pin = 4;
  25. OneWire oneWire(DS18b20Pin);
  26.  
  27. DallasTemperature sensors(&oneWire);
  28.  
  29. DHT dht(DHTPin, DHTTYPE);    
  30.  
  31. unsigned long previousMillis = 0;  
  32. const long interval = 10000;  
  33.  
  34. float Humid_DHT22 = 0;
  35. float Temperature_DHT22 = 0;
  36. float Temperature_DS18B20 = 0;
  37.  
  38. void setup() {
  39.   Serial.begin(115200);
  40.  
  41.   if(!display.begin(SSD1306_SWITCHCAPVCC)) {
  42.     Serial.println(F("SSD1306 allocation failed"));
  43.     for(;;);
  44.   }
  45.  
  46.   delay(2000);
  47.   display.clearDisplay();
  48.  
  49.   display.setTextSize(2);
  50.   display.setTextColor(WHITE);
  51.   display.setCursor(010);
  52.  
  53.   display.println("Program Starts:");
  54.   display.display();
  55.  
  56.   Serial.println(F("Data displayed"));
  57.  
  58.   pinMode(DHTPin, INPUT);
  59.   dht.begin();
  60. }
  61.  
  62. void loop() {
  63.   unsigned long currentMillis = millis();
  64.   if (currentMillis - previousMillis >= interval)
  65.   {
  66.     previousMillis = currentMillis;
  67.     Temperature_DHT22 = dht.readTemperature(); // Gets the values of the temperature
  68.     Humid_DHT22 = dht.readHumidity(); // Gets the values of the humidity
  69.      
  70.     if(!isnan(Temperature_DHT22) && !isnan(Humid_DHT22))
  71.     {
  72.       Serial.print("Temp: ");
  73.       Serial.print(Temperature_DHT22, 3);
  74.       Serial.print(" st.C Humid: ");
  75.       Serial.print(Humid_DHT22, 3);
  76.       Serial.println(" %;");
  77.  
  78.       display.clearDisplay();
  79.       display.setTextSize(2);
  80.       display.setTextColor(WHITE);
  81.       display.setCursor(00);
  82.       display.println("TD:" + String(Temperature_DHT22));
  83.  
  84.       display.setCursor(020);
  85.       display.println("HD:" + String(Humid_DHT22) + "%");
  86.     }
  87.  
  88.     //DS18B20
  89.     sensors.requestTemperatures();
  90.     Temperature_DS18B20 = sensors.getTempCByIndex(0);
  91.     Serial.print("Temp DS: ");
  92.     Serial.print(Temperature_DS18B20, 3);
  93.     Serial.println("st.C Humid: ");
  94.  
  95.  
  96.     display.setCursor(040);
  97.     display.println("TS:" + String(Temperature_DS18B20));
  98.     display.display();
  99.   }
  100. }

Poniżej program obsługujący całość wspomnianych elementów:

  1. #include <SPI.h>
  2. #include <Wire.h>
  3. #include <OneWire.h>
  4. #include <DallasTemperature.h>
  5. #include <Adafruit_GFX.h>
  6. #include <Adafruit_SSD1306.h>
  7. #include <ThingerESP32.h>
  8. #include "DHT.h"
  9. #define SCREEN_WIDTH 128 // OLED display width, in pixels
  10. #define SCREEN_HEIGHT 64 // OLED display height, in pixels
  11. #define OLED_MOSI  19
  12. #define OLED_CLK   18
  13. #define OLED_DC    21
  14. #define OLED_CS    5
  15. #define OLED_RESET 13
  16. #define USERNAME            "USER_NAME"
  17. #define DEVICE_ID           "DEVICEID"
  18. #define DEVICE_CREDENTIAL   "GENERATED_CREDENTIALS"
  19. #define SSID                "WIFI_SSID"
  20. #define SSID_PASSWORD       "WIFI_PASSWORD"
  21. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  22.   OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
  23. #define DHTTYPE DHT22   // DHT 22
  24. uint8_t DHTPin = 22;
  25. uint8_t DS18b20Pin = 4;
  26. OneWire oneWire(DS18b20Pin);
  27. DallasTemperature sensors(&oneWire);
  28. ThingerESP32 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);
  29. DHT dht(DHTPin, DHTTYPE);    
  30. unsigned long previousMillis = 0;  
  31. const long interval = 10000;  
  32. float Humid_DHT22 = 0;
  33. float Temperature_DHT22 = 0;
  34. float Temperature_DS18B20 = 0;
  35. void setup() {
  36.   Serial.begin(115200);
  37.   if(!display.begin(SSD1306_SWITCHCAPVCC)) {
  38.     Serial.println(F("SSD1306 allocation failed"));
  39.     for(;;);
  40.   }
  41.   delay(2000);
  42.   display.clearDisplay();
  43.   display.setTextSize(2);
  44.   display.setTextColor(WHITE);
  45.   display.setCursor(010);
  46.   display.println("Program Starts:");
  47.   display.display();
  48.   Serial.println(F("Data displayed"));
  49.   thing.add_wifi(SSID, SSID_PASSWORD);
  50.   thing["humid_dht"] >> outputValue(Humid_DHT22);
  51.   thing["temp_dht"] >> outputValue(Temperature_DHT22);
  52.   thing["temp_ds18b20"] >> outputValue(Temperature_DS18B20);
  53.   pinMode(DHTPin, INPUT);
  54.   dht.begin();
  55. }
  56. void loop() {
  57.   thing.handle();
  58.   //DHT22
  59.   unsigned long currentMillis = millis();
  60.   if (currentMillis - previousMillis >= interval)
  61.   {
  62.     previousMillis = currentMillis;
  63.     Temperature_DHT22 = dht.readTemperature(); // Gets the values of the temperature
  64.     Humid_DHT22 = dht.readHumidity(); // Gets the values of the humidity
  65.      
  66.     if(!isnan(Temperature_DHT22) && !isnan(Humid_DHT22))
  67.     {
  68.       Serial.print("Temp: ");
  69.       Serial.print(Temperature_DHT22, 3);
  70.       Serial.print(" st.C Humid: ");
  71.       Serial.print(Humid_DHT22, 3);
  72.       Serial.println(" %;");
  73.       display.clearDisplay();
  74.       display.setTextSize(2);
  75.       display.setTextColor(WHITE);
  76.       display.setCursor(00);
  77.       display.println("TD:" + String(Temperature_DHT22));
  78.       display.setCursor(020);
  79.       display.println("HD:" + String(Humid_DHT22) + "%");
  80.     }
  81.     //DS18B20
  82.     sensors.requestTemperatures();
  83.     Temperature_DS18B20 = sensors.getTempCByIndex(0);
  84.     Serial.print("Temp DS: ");
  85.     Serial.print(Temperature_DS18B20, 3);
  86.     Serial.println("st.C Humid: ");
  87.     display.setCursor(040);
  88.     display.println("TS:" + String(Temperature_DS18B20));
  89.     display.display();
  90.   }
  91. }

Dane w serwisie prezentują się w następujący sposób:


Aplikacja na androida (thinger.io oraz Thinger.io) są dosyć podobne, niestety są też wyjątkowo proste. Nie ma tam zbytnich wodotrysków, a jedyne co można zrobić to dołożyć urządzenie przez wygenerowany kod QR (Devices->Select Device->Device Tokens->Add).


Całe urządzenie prezentuje się w następujący sposób: