Hrajeme si WeMos D1 – ThingSpeak I

Při hraní s Wemos D1, nebo dalšími zařizeními pracující s ESP8266 v kombinaci s neveřejnou IP adresou narazíme na problém, kdy chceme sledovat stav (teplotu, tlak či jakékoliv jiné hodnoty) z místa mimo naši domácí síť. Máme několik způsobů jak problém vyřešit. Jedním z nich je naprogramování nějakého webového systému s databází kam budeme údaje z našeho zařízení odesílat. To je velmi zdlouhavá práce a znalosti k tomu potřebné nemá každý.

Řešení můžeme nalézt u již hotových webových služeb a různých cloudových aplikací. Já jsem probral několik a jako nejlepší řešení jsem pro tento návod vybral ThingSpeak. Jedná se již o prověřené řešení a nabízené možnosti jako zasílání nastavených události na Twitter nebo MATLAB analýza je příjemným přídavkem.

Na začátku si tedy založíme účet na ThingSpeak.com. Registrací se nebudeme zabývat je docela intuitivní. Po registraci vybereme záložku „Channells“ -> „My channel“ a pomocí tlačítka vybereme „New channel“

screen-shot-11-03-16-at-12

Poté se nám objeví volby pro náš kanál.

screen-shot-11-03-16-at-13

Vyplnění popisků jsem zvolil jednoduše. Name: Arduino 8. Musí se jednat o unikátní název s tím, že ho ještě nikdo nepoužil. Description je popis kanálu a je nepovinný. Potom již vidíme pole Field 1 až Field 8. Já mám zaškrtnuto pouze Field 1 to znamená, že u tohoto kanálu budu používat pouze jednu hodnotu (zatím). Jednoduchý název test u hodnoty ani není důležitý, ale zobrazuje se potom u výpisu a grafu nasbíraných hodnot. Můžete si ho tedy zaměnit třeba za „Vnitřní teplota“ atd. Další nastavení kanálu nebudu popisovat – necháme bez úprav, snad jen volba „Make Public“ způsobí, že náš kanál bude veřejný a k hodnotám bude mít přístup každý. Nakonec si kanál uložíme pomocí tlačítka „Save Channel“.

Kanál máme vytvořený a připravíme si buď tedy Wemos D1 nebo nějaké jiné s ESP8266. Pro začátek si nebudeme připojovat žádné čidla a vyzkoušíme si pouze samotnou komunikaci s odesláním nastavené hodnoty. Základní program po odeslání hodnoty na ThingSpeak je zde:

Nezapomeňte si změnit název (SSID) Vaší Wifi a heslo pro přístup k ní. Další co je třeba nastavit je „Write API Key“. Po kliknutí v našem vytvořeném kanálu na záložku API Keys opíšete nebo zkopírujete hodnotu Write API Key do programu.

screen-shot-11-07-16-at-02

Teď už jenom zbývá program nahrát do Wemos a zapnout si SerialMonitor. V případě úspěchu se v SerialMonitoru objeví toto:

screen-shot-11-07-16-at-03

A na ThingSpeak:

screen-shot-11-07-16-at-07

Když se podíváme na výpis SerialMonitoru uvidíme kromě hlavičky, že ThingSpeak nám vrátilo číslo 1. Neznamenáto ovšem, že jsme jedničky, ale pozici zápisu hodnoty nebo počet zápisů pole, které jsme obsahuje. Je to náš první zápis proto číslo 1.  Pokud se objeví v SerialMonitoru toto

screen-shot-11-07-at-02

 

zřejmě jsme udělali chybu v zápisu Write API Key, protože nám ThingSpeak odpovídá kódem 400 (špatný požadavek).

Tak základní komunikaci jsme zprovoznili. Nyní si uvedeme přiklad jak odesílat např. údaje o teplotě. Použijeme levné čidlo DS18B20 a jako v předchozím díle si ho k Wemos (nebo co zrovna s ESP8266 používáte).

IMG_2239

Kód upravíme tak, aby údaje o teplotě odesílalo naše zařízení každých 20 vteřin. Nezapomeňte si změnit řádky 3,4 a 7 podle Vašeho nastavení.

Nyní již výstup na ThingSpeak bude vypadat takto:

screen-shot-11-07-16-at-100

Pomocí IFrame si můžete dát Vaše data na kteroukoliv stránku:

Snad se Vám to povedlo a další drobnosti a vychytávky s ThingSpeak zveřejníme příště.

10 Komentářů

  1. hlupenov

    Ve druhém scriptu chybí napojení čidla DS18.

  2. Administrátor (Autor)

    Ano chybička se vloudila, opraveno. 🙂

  3. ondra186

    Ahoj
    byl by velkej problém to přepsat na senzor DHT22 🙂

    1. Administrátor (Autor)

      No problém to vůbec není. Je potřeba rada?

  4. speedy25

    zdravím

    Chci se zeptat ohledně senzoru ds18b20

    často odpovídá hodnotami 0 nebo 2

    jak by se dal tento problém odstranit

    Předem děkuji za odpověď

  5. speedy25

    Zdravím

    Ještě se chci zeptat Pokoušel jsem se doplnit kód o možnost více teplotních senzorů na jedné sběrnici

    Problém je v tom, že nepravidelně odpovídá na TS hodnotu 0 na místo teploty a nevím proč

    Můj pokus:

    #include
    #include
    #include

    #define ONE_WIRE_BUS D6
    #define TempRes 10

    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);

    DeviceAddress OutTemp = { 0x28, 0xFF, 0x60, 0x8C, 0x46, 0x16, 0x03, 0xD6 };
    DeviceAddress GarageTemp = { 0x28, 0xFF, 0x4A, 0x67, 0x53, 0x14, 0x01, 0x1C };

    String apiKey = „WQWF800STDMDSS4S“;
    const char* ssid = „STASANET_OB“;
    const char* password = „gines2016“;

    const char* server = „api.thingspeak.com“;

    WiFiClient client;

    void setup() {
    Serial.begin(115200);
    delay(10);

    sensors.begin();

    sensors.setResolution(OutTemp, TempRes);
    sensors.setResolution(GarageTemp, TempRes);

    WiFi.begin(ssid, password);

    Serial.println();
    Serial.println();
    Serial.print(„Connecting to „);
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(„.“);
    }
    Serial.println(„“);
    Serial.println(„WiFi connected“);

    }

    void loop() {

    sensors.requestTemperatures();

    float OT = sensors.getTempC(OutTemp);
    Serial.print(„Teplota venku je: „);
    Serial.print(OT);
    Serial.print(„C: „);
    Serial.print(„\n\r“);

    float GT = sensors.getTempC(GarageTemp);
    Serial.print(„Teplota v garazi je: „);
    Serial.print(GT);
    Serial.print(„C: „);
    Serial.print(„\n\r“);

    if (client.connect(server,80)) {
    String postStr = apiKey;
    postStr +=“&field3=“;
    postStr += String(OT);
    postStr +=“&field4=“;
    postStr += String(GT);
    postStr += „\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(postStr.length());
    client.print(„\n\n“);
    client.print(postStr);

    Serial.print(„Temperature: „);
    Serial.print(OT);
    Serial.print(“ Temperature: „);
    Serial.print(GT);
    Serial.println(“ send to Thingspeak“);
    }
    client.stop();

    Serial.println(„Waiting…“);

    delay(60000);
    }

    1. ALFicek84

      1) nezapisoval bych nastavení rozlišení senzoru při každém spuštění. rozlišení se dá zapsat do EEPROM. Sensor si nastavení pamatuje do dalšího přepisu tzn. stačí nastavit jednou třeba tímto postupem http://mydomotic.blogspot.cz/2015/10/configure-ds18b20-resolution-and-save.html

      2) „nepravidelně odpovídá na TS hodnotu 0“ senzor data vyčte normálně, ale na TS se odešle chyba? Pokud se data chybně vyčtou už ze senzoru dal bych za sensors.requestTemperatures(); ještě delay(200); protože DS18B20 při rozlišení 10bit potřebuje 187,5ms na konverzi dat. Není to nutné ale zlepší to spolehlivost. Jak to vypadá s Pull-up resistorem? hodnota?

  6. mbartak

    Funguje to bezvadne. Slo by to udelat i obracene? Napr. druhy wemos by stahoval posledni udaje z thingspeaku a zobrazoval by je na oled?

  7. mbartak

    Tak musim rici, ze jsem to malinko zakrikl, v pripade preruseni wifi se Wemos jiz nedokaze znova pripojit.
    Doporucuji pridat do loopu: if (WiFi.status() != WL_CONNECTED) {WIFI_Connect()}; (nadefinovat si pripojeni jako funkci viz priklad, nebo pridat znova cely process pripojeni), aby se wemos v pripade vypadku znovu pripojil….

  8. mbartak

    Tak nakonec jsem funkci WIFICON(), kterou volam v loopu, udelal takto:

    void WIFICON(){
    Serial.println(„Connecting to Wifi „);
    WiFi.disconnect(); //pro vsechny pripady nejprve diskonect, mel jsem problemy s duplikatnim wifi.begin
    blikej(2); // volani funkce blikani po dobu 2 sekund
    if (WiFi.status() != WL_CONNECTED) {WiFi.begin(ssid, password);}
    blikej(10); // volani funkce blikani po dobu 10 sekund
    if (WiFi.status() != WL_CONNECTED) { WIFICON();} //pokud wifi stale neni dostupna, tak opakovat dokola
    }

    void blikej(int x){
    for(int y = 1; y < x; y = y + 1){
    digitalWrite(LED_WIFI_CONN, HIGH);
    delay(500);
    digitalWrite(LED_WIFI_CONN, LOW);
    delay(500);
    }
    }

    Jinak radeji jsem se vyhnul while na blikani pro pripojeni v setupu – v pripade vypadku proudu se to muze na teto podmince zacyklit, pokud wemos nabehne po zapnuti elekriny drive nez wifina…

Napsat komentář

Translate »