Ten post chciałbym poświęcić na opisanie sposobu zaprogramowania układu ESP32 za pomocą Arduino, tak aby wysyłał dane z dwóch czujników temperatury po interfejsie OneWire. Dane będą magazynowane przez darmowy serwis thingspeak.
W celu rozpoczęcia programowania pod Arduino należy wykonać kilka prostych czynności tak aby płytka była widoczna dla środowiska.
Na samym początku w zakładce preferencje, która pojawi się po rozwinięciu menu plik należy dodać ścieżkę do strony przez którą można pobrać sterowniki do płytki:
[Źródło: https://www.banggood.com/V3-NodeMcu-Lua-WIFI-Development-Board-p-992733.html]
ESP przez Arduino:
W celu rozpoczęcia programowania pod Arduino należy wykonać kilka prostych czynności tak aby płytka była widoczna dla środowiska.
Na samym początku w zakładce preferencje, która pojawi się po rozwinięciu menu plik należy dodać ścieżkę do strony przez którą można pobrać sterowniki do płytki:
W wersji do skopiowania: http://arduino.esp8266.com/staging/package_esp8266com_index.json
Następnie w menadżerze płytek instaluje się aktualnie dostępną wersję oprogramowania:
Jest on dostępny w zakładce Narzędzie->Płytka ...
Dalej pozostaje już wybranie odpowiedniej płytki, na którą nastąpi kompilacja. Parametry dla układu powinny wyglądać następująco:
Zostaje jeszcze kwestia sterowników pod windowsa itp. Je wystarczy pobrać pod tym linkiem, następnie wypakować i zainstalować.
Thingspeak:
Tutaj zakłada się konto oraz potwierdza jego założenie emailem. Następnie tworzy się nowy kanał i dodaje się ilość danych jakie mają być obserwowane
Jako kolejne pola można dodawać wszystkie dane które będą miały jakikolwiek sens gdy przedstawimy je na wykresie, czyli np. temperatura, wilgotność, odczyt z adc itp.
Po wgraniu programu i odpowiedniej konfiguracji thingspeak'a dane będą się prezentować następująco:
Program:
Program poniżej przedstawia przykładowy sposób przesłania danych z czujnika temperatury na serwer.
- #include <ESP8266WiFi.h>
- #include <DallasTemperature.h>
- #define ONE_WIRE_LINE 2
- OneWire ds18b20_OneWire(ONE_WIRE_LINE);
- DallasTemperature DS18B20(&ds18b20_OneWire);
- WiFiClient client;
- String apiKey = "keyFromInternet"; /* Key from internet */
- const char* server = "api.thingspeak.com"; /* Server adress */
- char ssid[] = "networkssid"; // your network SSID (name)
- char pass[] = "password"; // your network password
- void CheckTemp(float * data);
- void setup() {
- int connectTries = 0;
- WiFi.mode(WIFI_STA);
- WiFi.begin("networkssid", "password");
- /* Set serial port */
- Serial.begin(9600);
- while (!Serial) { }
- Serial.println("Serial port status OK");
- while(WiFi.status() != WL_CONNECTED){
- delay(100);
- connectTries++;
- if(connectTries > 3000){
- /* If connection fails then go into deep sleep */
- ESP.deepSleep(30000000);
- }
- }
- Serial.println("Wifi connected");
- }
- void loop() {
- float temp = CheckTemp();
- Serial.println("Serial port status OK");
- communicateWithServer(temp);
- }
- float CheckTemp(void)
- {
- float temp;
- DS18B20.requestTemperatures();
- delay(1000);
- temp = DS18B20.getTempCByIndex(0);
- return temp;
- }
- void communicateWithServer(float temp)
- {
- if(client.connect(server,80)){
- String dataToSend = apiKey;
- dataToSend += "&field1=";
- dataToSend += String(temp);
- Serial.println(postStr);
- dataToSend += "\r\n\r\n";
- client.print("POST /update HTTP/1.1\n");
- client.print("Host: api.thingspeak.com\n");
- client.print("Connection: close\n");
- client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
- client.print("Content-Type: application/x-www-form-urlencoded\n");
- client.print("Content-Length: ");
- client.print(dataToSend.length());
- client.print("\n\n");
- client.print(dataToSend);
- client.stop();
- delay(500);
- Serial.println("Data Send");
- delay(90000);
- }
- }
Kolejne dane dodaje się poprzez dodanie kolejnych pól w zmiennej dataToSend
W programie zamiast wywoływać zwykłe opóźnienie można uśpić urządzenie komendą deepsleep, co będzie bardzo przydatne podczas działania urządzenia na bateriach.
Poniżej screen z przykładowej odpowiedzi wygenerowanej przez program, na port szeregowy.