czwartek, 17 sierpnia 2017

[1] ESP8266 - Pomiar temperatury oraz prezentacja danych na thingspeak

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.

[Ź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.

  1. #include <ESP8266WiFi.h>
  2. #include <DallasTemperature.h>
  3. #define ONE_WIRE_LINE 2
  4. OneWire ds18b20_OneWire(ONE_WIRE_LINE);
  5. DallasTemperature DS18B20(&ds18b20_OneWire);
  6. WiFiClient client;
  7. String apiKey = "keyFromInternet";           /* Key from internet */
  8. const char* server = "api.thingspeak.com";    /* Server adress */
  9. char ssid[] = "networkssid";  // your network SSID (name)
  10. char pass[] = "password"; // your network password
  11. void CheckTemp(float * data);
  12. void setup() {
  13.   int connectTries = 0;
  14.   WiFi.mode(WIFI_STA);
  15.   WiFi.begin("networkssid", "password");
  16.   /* Set serial port */
  17.   Serial.begin(9600);
  18.   while (!Serial) { }
  19.   Serial.println("Serial port status OK");
  20.    
  21.   while(WiFi.status() != WL_CONNECTED){
  22.     delay(100);
  23.     connectTries++;
  24.     if(connectTries > 3000){
  25.       /* If connection fails then go into deep sleep */
  26.       ESP.deepSleep(30000000);
  27.     }
  28.   }
  29.   Serial.println("Wifi connected");
  30. }
  31. void loop() {
  32.   float temp = CheckTemp();
  33.   Serial.println("Serial port status OK");
  34.   communicateWithServer(temp);
  35. }
  36. float CheckTemp(void)
  37. {
  38.   float temp;
  39.   DS18B20.requestTemperatures();
  40.   delay(1000);
  41.   temp = DS18B20.getTempCByIndex(0);
  42.   return temp;
  43. }
  44. void communicateWithServer(float temp)
  45. {
  46.     if(client.connect(server,80)){
  47.     String dataToSend = apiKey;
  48.     dataToSend += "&field1=";
  49.     dataToSend += String(temp);
  50.    
  51.     Serial.println(postStr);
  52.    
  53.     dataToSend += "\r\n\r\n";
  54.     client.print("POST /update HTTP/1.1\n");
  55.     client.print("Host: api.thingspeak.com\n");
  56.     client.print("Connection: close\n");
  57.     client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
  58.     client.print("Content-Type: application/x-www-form-urlencoded\n");
  59.     client.print("Content-Length: ");
  60.     client.print(dataToSend.length());
  61.     client.print("\n\n");
  62.     client.print(dataToSend);
  63.     client.stop();
  64.     delay(500);
  65.     Serial.println("Data Send");
  66.     delay(90000);
  67.   }
  68. }

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.