ThingSpeak jest to platforma IoT typu open source do zbierania i pobierania danych z obiektów. Wykorzystuje ona protokołu HTTP oraz MQTT. Platforma umożliwia gromadzenie danych oraz późniejszą ich wizualizację.
Do korzystania z rozwiązania konieczne jest konto na platformie MathWorks.
Tworzenie kanału
Należy zalogować się do platformy "https://thingspeak.com/" za pomocą konta MathWorks.
Następnie należy przejść do zakładki "Chanels" => "My Channels" po czym wygrać opcję "New Channel".
Kanał musi zawierać nazwę, oraz odpowiednią ilość pól na dane.
Utworzony kanał widoczny jest w zakładce "My Channels"
W utworzonym kanale wizualizowane są zebrane dane.
Użytkownik może dostosować wykres do swoich potrzeb. Na podstawie danych można utworzyć widgety.
Przykład widgetu na podstawie aktualnej temperatury/
W celu wysłania danych poprzez kontroler ESP należy w kodzie programu podać:
- Chanel ID
- Write API Key
ThingSpeak jest występuje zarówno w wersji darmowej jak i jako płatna subskrypcja.
Ograniczenia wersji darmowej dotyczą:
- ograniczenia liczby wiadomości 3 miliony/rok oraz 8200/dzień,
- maksymalnej częstotliwości aktualizacji max co 15 sekund,
- ilość kanałów ograniczona do max 4,
- udostępnienie kanału prywatnego max 3.
Program
Dane wysyłane są na platformę ThingSpeak co 20 sekund. Przesyłane są dwa pola Odczyt temperatury z sensora oraz zmienna losowa.
Kod pobranie adresu czujnika
#include <OneWire.h>
#define ONE_WIRE_BUS D2
OneWire pin(ONE_WIRE_BUS);
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte addr[8];
if (!pin.search(addr)) {
Serial.println();
pin.reset_search();
delay(250);
return;
}
Serial.print(" ROM =");
for (i = 0; i < 8; i++) {
Serial.write(' ');
Serial.print(addr[i], HEX);
}
delay(5000);
}
Schemat
Wymagany rezystor 4,7kΩ
Kod Programu
#include "ThingSpeak.h"
#include "secrets.h"
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//obsługa Czujnika
#define ONE_WIRE_BUS D2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress sensor = { 0x28, 0xFF, 0x19, 0x4D, 0xB3, 0x17, 0x1, 0x3E };
//Dane logowania WiFi
char ssid[] = "ArduinoTestWiFi";
char pass[] = "12345678";
int keyIndex = 0;
WiFiClient client;
unsigned long myChannelNumber = 1120166;
const char * myWriteAPIKey = "V3J71LR4LN1TPZRZ";
// Inicjalizacja wartości
float number1 = 0;
int number2 = random(0,100);
String myStatus = "";
void setup() {
// Inicjowanie Serial Portu
Serial.begin(9600);
sensors.begin();
WiFi.mode(WIFI_STA);
// Inicjalizacja ThingSpeak
ThingSpeak.begin(client);
}
void loop() {
// Połączenie WiFi
if(WiFi.status() != WL_CONNECTED){
Serial.print("Łączenie z siecią: ");
Serial.println(SECRET_SSID);
while(WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, pass);
Serial.print(".");
delay(5000);
}
Serial.println("\nPołączono.");
}
//pobranie informacji z sensora
sensors.requestTemperatures();
number1 = sensors.getTempC(sensor);
number2 = random(0,100);
// Nadanie wartości polom do wysłania
ThingSpeak.setField(1, number1);
ThingSpeak.setField(2, number2);
// Wysłanie do kanału ThingSpeak
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if(x == 200){
Serial.println("Aktualizacja kanału powiodła się.");
}
else{
Serial.println("Błąd - " + String(x));
}
// Ustawienie statusu
ThingSpeak.setStatus(myStatus);
delay(20000); // Wysłanie danych co 20 sekund (minimum 15s)
}
Wizualizacja
Wizualizacja danych gromadzonych przez 5 godzin.