W tym poście chciałbym przedstawić szybki projekt układu pozwalającego na przesyłanie danych z czujników na platformę thinger io.
[Ź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.
OLED:
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:
Poniżej program obsługujący całość wspomnianych elementów:
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).
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:
- #include <SPI.h>
- #include <Wire.h>
- #include <OneWire.h>
- #include <DallasTemperature.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #include "DHT.h"
- #define SCREEN_WIDTH 128 // OLED display width, in pixels
- #define SCREEN_HEIGHT 64 // OLED display height, in pixels
- #define OLED_MOSI 19
- #define OLED_CLK 18
- #define OLED_DC 21
- #define OLED_CS 5
- #define OLED_RESET 13
- Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
- OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
- #define DHTTYPE DHT22 // DHT 22
- uint8_t DHTPin = 22;
- uint8_t DS18b20Pin = 4;
- OneWire oneWire(DS18b20Pin);
- DallasTemperature sensors(&oneWire);
- DHT dht(DHTPin, DHTTYPE);
- unsigned long previousMillis = 0;
- const long interval = 10000;
- float Humid_DHT22 = 0;
- float Temperature_DHT22 = 0;
- float Temperature_DS18B20 = 0;
- void setup() {
- Serial.begin(115200);
- if(!display.begin(SSD1306_SWITCHCAPVCC)) {
- Serial.println(F("SSD1306 allocation failed"));
- for(;;);
- }
- delay(2000);
- display.clearDisplay();
- display.setTextSize(2);
- display.setTextColor(WHITE);
- display.setCursor(0, 10);
- display.println("Program Starts:");
- display.display();
- Serial.println(F("Data displayed"));
- pinMode(DHTPin, INPUT);
- dht.begin();
- }
- void loop() {
- unsigned long currentMillis = millis();
- if (currentMillis - previousMillis >= interval)
- {
- previousMillis = currentMillis;
- Temperature_DHT22 = dht.readTemperature(); // Gets the values of the temperature
- Humid_DHT22 = dht.readHumidity(); // Gets the values of the humidity
- if(!isnan(Temperature_DHT22) && !isnan(Humid_DHT22))
- {
- Serial.print("Temp: ");
- Serial.print(Temperature_DHT22, 3);
- Serial.print(" st.C Humid: ");
- Serial.print(Humid_DHT22, 3);
- Serial.println(" %;");
- display.clearDisplay();
- display.setTextSize(2);
- display.setTextColor(WHITE);
- display.setCursor(0, 0);
- display.println("TD:" + String(Temperature_DHT22));
- display.setCursor(0, 20);
- display.println("HD:" + String(Humid_DHT22) + "%");
- }
- //DS18B20
- sensors.requestTemperatures();
- Temperature_DS18B20 = sensors.getTempCByIndex(0);
- Serial.print("Temp DS: ");
- Serial.print(Temperature_DS18B20, 3);
- Serial.println("st.C Humid: ");
- display.setCursor(0, 40);
- display.println("TS:" + String(Temperature_DS18B20));
- display.display();
- }
- }
Poniżej program obsługujący całość wspomnianych elementów:
- #include <SPI.h>
- #include <Wire.h>
- #include <OneWire.h>
- #include <DallasTemperature.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #include <ThingerESP32.h>
- #include "DHT.h"
- #define SCREEN_WIDTH 128 // OLED display width, in pixels
- #define SCREEN_HEIGHT 64 // OLED display height, in pixels
- #define OLED_MOSI 19
- #define OLED_CLK 18
- #define OLED_DC 21
- #define OLED_CS 5
- #define OLED_RESET 13
- #define USERNAME "USER_NAME"
- #define DEVICE_ID "DEVICEID"
- #define DEVICE_CREDENTIAL "GENERATED_CREDENTIALS"
- #define SSID "WIFI_SSID"
- #define SSID_PASSWORD "WIFI_PASSWORD"
- Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
- OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
- #define DHTTYPE DHT22 // DHT 22
- uint8_t DHTPin = 22;
- uint8_t DS18b20Pin = 4;
- OneWire oneWire(DS18b20Pin);
- DallasTemperature sensors(&oneWire);
- ThingerESP32 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);
- DHT dht(DHTPin, DHTTYPE);
- unsigned long previousMillis = 0;
- const long interval = 10000;
- float Humid_DHT22 = 0;
- float Temperature_DHT22 = 0;
- float Temperature_DS18B20 = 0;
- void setup() {
- Serial.begin(115200);
- if(!display.begin(SSD1306_SWITCHCAPVCC)) {
- Serial.println(F("SSD1306 allocation failed"));
- for(;;);
- }
- delay(2000);
- display.clearDisplay();
- display.setTextSize(2);
- display.setTextColor(WHITE);
- display.setCursor(0, 10);
- display.println("Program Starts:");
- display.display();
- Serial.println(F("Data displayed"));
- thing.add_wifi(SSID, SSID_PASSWORD);
- thing["humid_dht"] >> outputValue(Humid_DHT22);
- thing["temp_dht"] >> outputValue(Temperature_DHT22);
- thing["temp_ds18b20"] >> outputValue(Temperature_DS18B20);
- pinMode(DHTPin, INPUT);
- dht.begin();
- }
- void loop() {
- thing.handle();
- //DHT22
- unsigned long currentMillis = millis();
- if (currentMillis - previousMillis >= interval)
- {
- previousMillis = currentMillis;
- Temperature_DHT22 = dht.readTemperature(); // Gets the values of the temperature
- Humid_DHT22 = dht.readHumidity(); // Gets the values of the humidity
- if(!isnan(Temperature_DHT22) && !isnan(Humid_DHT22))
- {
- Serial.print("Temp: ");
- Serial.print(Temperature_DHT22, 3);
- Serial.print(" st.C Humid: ");
- Serial.print(Humid_DHT22, 3);
- Serial.println(" %;");
- display.clearDisplay();
- display.setTextSize(2);
- display.setTextColor(WHITE);
- display.setCursor(0, 0);
- display.println("TD:" + String(Temperature_DHT22));
- display.setCursor(0, 20);
- display.println("HD:" + String(Humid_DHT22) + "%");
- }
- //DS18B20
- sensors.requestTemperatures();
- Temperature_DS18B20 = sensors.getTempCByIndex(0);
- Serial.print("Temp DS: ");
- Serial.print(Temperature_DS18B20, 3);
- Serial.println("st.C Humid: ");
- display.setCursor(0, 40);
- display.println("TS:" + String(Temperature_DS18B20));
- display.display();
- }
- }
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: