Internet věcí pro začátečníky: Postavte si bezdrátový teploměr za pár korun

Internet věcí (Internet of Things, zkratka IoT) je pojem, se kterým se začínáme v poslední době setkávat stále častěji. Dle Wikipedie je IoT označení pro propojení vestavěných zařízení s Internetem. Propojení zařízení by mělo být zejména bezdrátové a mělo by přinést nové možnosti vzájemné interakce nejen mezi jednotlivými systémy a též přinést nové možnosti jejich ovládání, sledování a zajištění pokročilých služeb.

Na trhu je již celá řada věcí, počínaje od WiFi zásuvek, přes termostaty a různá čidla až po sady pro zabezpečení domácnosti. Většinou se však jedná o produkty, jejichž cena je nastavená poměrně vysoko. V dnešním článku si ale ukážeme, jak si postavit jednoduchý bezdrátový teploměr za pár korun. Nebudete potřebovat navíc v podstatě žádné znalosti a zprovoznit takovýto teploměr zvládne opravdu každý.

Potřebné komponenty

Základem teploměru je levná vývojářská deska NodeMCUm která je vybavena Wi-Fi. K té budeme potřebovat teplotní čidlo DS18B20 a také rezistor s odporem 4,7K Ω. Na Ebay se dá sehnat malý plošný spoj s rezistorem, do kterého stačí poté jen zapojit teplotní čidlo DS18B20 a to následně připojit k NodeMCU.

nodemcu

NodeMCU se dá na Ebay sehnat za 75 korun, teplotní čidlo stojí 25 korun, za plošný spoj s rezistorem zaplatíte 20 korun. Za základní díly tak zaplatíte kolem 120 korun. Pokud nevlastníte páječku, tak je ještě potřeba počítat s drátovými propojkami (sada stojí přibližně 50 korun) a samozřejmě nesmíme zapomenout také na napájení. Deska NodeMCU je vybavena konektorem microUSB, takže můžete použít například starou nabíječku od telefonu. V případě potřeby také můžete dokoupit nějakou krabičku.

Zapojení

Zapojení je opravdu velmi jednoduché. Stačí pouze osadit teplotní čidlo do zmiňovaného plošného spoje s rezistorem a z toho následně připojit tři kabely k NodeMCU. Zapojení je doufám dobře patrné z tohoto schématu.

snimek-obrazovky-14

Kam budeme vysílat data?

Ještě než se vrhneme na programování NodeMCU, musíme se rozmyslet, kam budeme data vysílat. NodeMCU disponuje Wi-Fi, takže nemusíte nikam natahovat další síťový kabel a jediné co budete potřebovat je napájení. Možností, kam nahrávat zaznamenaná data je celá řada. Já jako naprostý laik jsem se rozhodl jít co nejjednodušší cestou, takže jsem využil službu ThingSpeak.

snimek-obrazovky-19

Tato služba je přímo určená pro shromažďování data a jejich následným zobrazováním. Podobných služeb je více, ThingSpeak mě ale zaujal svojí jednoduchostí. Zaznamenané údaje si můžete nechat snadno vykreslit do grafů a na své si přijdou i náročnější uživatelé.

snimek-obrazovky-18

Před samotným nahráváním kódu je tedy potřeba zřídit si účet u ThingSpeak. Po zaregistrování je nutné nejprve vytvořit nový kanál, kde stačí zadat pár základních údajů a jsme téměř připraveni. Posledním krokem je získání API klíče. Ten najdete v nově vytvořeném kanálu na záložce s názvem API Keys. Nás bude nyní zajímat klíč pro zápis (Write API Key).

Programujeme

Jak jsem se již zmínil, v programování jsem naprostý laik a většinou se řídím metodou pokus-omyl. Zdrojový kód tedy není dokonalý, ale co je hlavní – funguje.

snimek-obrazovky-22

Pro nahrání kódu jsem využil rozhraní Arduino IDE. To je potřeba doplnit o podporu NodeMCU. Návodů je na internetu celá řada (např. zde), takže se postupem nebudu zdržovat. Po správné konfiguraci Arduino IDE a připojení NodeMCU k počítači je ještě potřeba nahrát tři knihovny které budeme potřebovat. Ty můžete stáhnout na tomto odkazu. Po jejich stažení je rozbalte do složky libraries ve složce s Arduino IDE (nejčastěji c:\Program Files (x86)\Arduino\libraries\).

Tento kód můžete jednoduše zkopírovat do nového okna v Arduino IDE. Je potřeba doplnit jen tři údaje – váš API klíč a název a heslo Wi-Fi sítě, ke které se má NodeMCU připojit. Poté již stačí stisknout šipku v horní liště programu a kód se nahraje do zařízení.

Zobrazujeme data

Pokud zařízení funguje tak, jak má, měly by se vám po chvilce objevit na ThingSpeak první naměřené výsledky. Kód je upraven tak, že teploměr odesílá naměřenou hodnotu každých 15 sekund. Na stránce ThingSpeak klikněte v horní liště na položku Channels -> My channels a následně na předem vytvořený kanál.

snimek-obrazovky-17

Poté již stačí kliknout na tlačítko Add Visualizations a zvolit si Field 1 Chart. Do zobrazeného grafu se automaticky načítají naměřené hodnoty. Graf si můžete samozřejmě upravovat dle své libosti.

Závěr

Doufám, že se vám tento článek líbil. Se součástkami za necelé dvě stovky můžete postavit jednoduchý teploměr, k jehož datům máte přístup odkudkoliv z internetu. V budoucnu mám v plánu postavit venkovní sondu, která by měl kromě teploměru obsahovat také vlhkoměr a barometr. V případě zájmu bych mohl také zpracovat podobný článek o stavbě této venkovní stanice.

22 komentářů

  • szkandi 12.11.2016 Odpovědět

    dobrý den,
    tak jsem vyzkoušel… bohužel při kompilaci jsem narazil na chybu, mohu se zeptat co je špatně? Vyzkoušel jsem jiný zdrojový kód pro ESP8266 – teploměr a prošlo…

    děkuji

    Arduino: 1.6.12 (Windows 10), Board: \“Generic ESP8266 Module, 80 MHz, 40MHz, DIO, 115200, 512K (64K SPIFFS), ck, Disabled, None\“

    teplomer_02beran:79: error: \’sent\‘ does not name a type

    sent++;

    ^

    teplomer_02beran:80: error: \’client\‘ does not name a type

    client.stop();

    ^

    teplomer_02beran:81: error: expected declaration before \‘}\‘ token

    }

    ^

    exit status 1
    \’sent\‘ does not name a type

    This report would have more information with
    \“Show verbose output during compilation\“
    option enabled in File -> Preferences.

    • berazde 12.11.2016 Odpovědět

      Dobrý den,

      máte pravdu, chyběla mi tam jedna závorka. Nyní by měl být již kód funkční.

  • szkandi 13.11.2016 Odpovědět

    děkuji! kompilace proběhla v pořádku, teď jen čekám na ebay balíček… snad se povede naprogramovat napoprvé, je pravdou že je nutno GPIO0 uzemnit při programování?

    • berazde 13.11.2016 Odpovědět

      Já jsem jej nijak neuzemňoval a vše proběhlo v pořádku 🙂

  • szkandi 13.11.2016 Odpovědět

    to zní fajn, děkuji

  • pavel 22.11.2016 Odpovědět

    Ahoj.
    Protože jsem laik, tak se ptám. Lze připojit více čidel DS18B20. U jiných zapojení jsem viděl u čidla odpor 4k7, tady není potřeba?
    Díky

  • szkandi 8.12.2016 Odpovědět

    mohu maly dotaz, cinan jiz poslal a tak testuji

    https://thingspeak.com/channels/182041

    jak ziskam bych mel informaci o teplote co 5 minut? Z kodu hadam ze je to delay(1000) a melo by to byt v milisekundach cili 300 000… avsak nejak se mi to nedari.

    Dekuji!

    void loop() {
    float temp;
    DS18B20.requestTemperatures();
    temp = DS18B20.getTempCByIndex(0);
    Serial.print(String(sent)+“ Temperature: „);
    Serial.println(temp);
    sendTeperatureTS(temp);
    int count = myPeriodic;
    while(count–)
    delay(1000);
    }

    • berazde 8.12.2016 Odpovědět

      Mělo by stačit na 9. řádku kódu změnit #define myPeriodic 15 na #define myPeriodic 300

  • szkandi 8.12.2016 Odpovědět

    nepomohlo… opet po 10minutach

    https://thingspeak.com/channels/182041

    • berazde 8.12.2016 Odpovědět

      Tak musí být chyba v nastaveni kanalu na Thingspeak. Klikněte na tužku vpravo nahoře u grafu a tam někde budete mít nastavené zobrazování hodnot po 10 minutách. Stačí to změnit na prázdné pole a melo by to fungovat.

  • szkandi 8.12.2016 Odpovědět

    ANO!

    dekuji

  • Mira 31.1.2017 Odpovědět

    bylo by možno doplnit info jak kód doplnit na 4 čidla? Díky.

  • Pavel 22.2.2017 Odpovědět

    také bych se přiklonil k verzi na více čidel.Díky

  • Zdeněk 21.10.2017 Odpovědět

    Jaké je zapojení čidla a odporu, když nemám a nechci někde shánět zmiňovaný plošný spoj?
    Díky

  • Szkandi 21.12.2017 Odpovědět

    Zdravím,
    Byla by možnost zozsirit zdrojový kód na více čidel? Jak již někdo zmiňoval? Děkuji

  • jozef 21.2.2018 Odpovědět

    arduino+ENC28J60,,,4x senzor to je dva su na jednom pine a dva na druhom–to je dak som 2x 1-wire zbernicu,,,kod stači zmeniť a pridať pre ESP82666
    zmeňte si SPI key,,,,,idem pozrieť kod pre ESP8266
    ————————–
    /*
    |
    | arduino nano, 4x sensor ds18b20 on PIN6/PIN7 , used is 2x 1-wire bus
    | arduino program 1.6.4
    | Post 4 temperatures from a DS18B20 to ThingSpeak using the Ethercard interface based on the
    | ENC28J60 chip. ethercard from master
    | Based on the Ethercard example from http://www.jeelabs.org

    | enc28j60 CS is pin 8
    | library ethercard from master , ethercardmaster.zip
    | Phil Grant Jan 2014

    */
    #include
    // change these settings to match your own setup
    #define APIKEY \“C06FVBVE5DCU0UK1A \“ // plug your API KEY
    #include
    #include
    #include //DS18B20 support
    // =========== Setup the Temperature sensor details =================

    #define TEMPERATURE_PRECISION 9
    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    OneWire oneWireA (6) ; // 2 sensor on pin6
    OneWire oneWireB (7) ; // 2 sensor on pin7
    // Pass our oneWire reference to Dallas Temperature.

    DallasTemperature sensorsA (&oneWireA) ;
    DallasTemperature sensorsB (&oneWireB) ;
    // Insert the ID of your temp sensor here, for the sketch, visit here
    // http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html
    DeviceAddress inside = { 0x28, 0xFF, 0x1F, 0x8A, 0x4E, 0x04, 0x00, 0x67 };
    DeviceAddress outside = { 0x28, 0xFF, 0x03, 0x4A, 0x33, 0x04, 0x00, 0xFC };
    DeviceAddress dogHouse = { 0x28, 0xFF, 0xE2, 0x44, 0x31, 0x04, 0x00, 0xB1 };
    DeviceAddress cathouse = { 0x28, 0xFF, 0xED, 0x89, 0x4E, 0x04, 0x00, 0xCA };

    // ethernet interface mac address, must be unique on the LAN
    byte mymac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

    const char website[] PROGMEM = \“api.thingspeak.com\“;

    byte Ethernet::buffer[700];
    uint32_t timer;
    Stash stash;

    void setup () {
    Serial.begin(57600);
    Serial.println(\“\\n[webClient]\“);

    if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println( \“Failed to access Ethernet controller\“);
    if (!ether.dhcpSetup())
    Serial.println(\“DHCP failed\“);

    ether.printIp(\“IP: \“, ether.myip);
    ether.printIp(\“GW: \“, ether.gwip);
    ether.printIp(\“DNS: \“, ether.dnsip);

    if (!ether.dnsLookup(website))
    Serial.println(\“DNS failed\“);

    ether.printIp(\“SRV: \“, ether.hisip);
    }

    void loop () {
    ether.packetLoop(ether.packetReceive());

    if (millis() > timer) {
    timer = millis() + 15000; //Transmit every minute
    // themperatures from all sensors
    sensorsA.requestTemperatures();
    sensorsB.requestTemperatures();
    // save themperatures to values
    float aThermometer = sensorsA.getTempC(inside);
    float aThermometer1 = sensorsA.getTempC(outside);
    float aThermometer2 = sensorsB.getTempC(dogHouse);
    float aThermometer3 = sensorsB.getTempC(cathouse);
    delay(200);
    // generate two fake values as payload – by using a separate stash,
    // we can determine the size of the generated message ahead of time
    byte sd = stash.create();
    // create text with values for THINGSPEAK with more fields
    stash.print(\“field1=\“);
    stash.println(aThermometer);
    stash.print(\“&field2=\“);
    stash.println(aThermometer1);
    stash.print(\“&field3=\“);
    stash.println(aThermometer2);
    stash.print(\“&field4=\“);
    stash.println(aThermometer3);

    stash.save();

    // generate the header with payload – note that the stash size is used,
    // and that a \“stash descriptor\“ is passed in as argument using \“$H\“
    Stash::prepare(PSTR(\“POST /update HTTP/1.1\“ \“\\r\\n\“
    \“Host: $F\“ \“\\r\\n\“
    \“Connection: close\“ \“\\r\\n\“
    \“X-THINGSPEAKAPIKEY: $F\“ \“\\r\\n\“
    \“Content-Type: application/x-www-form-urlencoded\“ \“\\r\\n\“
    \“Content-Length: $D\“ \“\\r\\n\“
    \“\\r\\n\“
    \“$H\“),
    website, PSTR(APIKEY), stash.size(), sd);

    // send the packet – this also releases all stash buffers once done
    ether.tcpSend();
    }
    }

  • jozef 21.2.2018 Odpovědět

    kód pre esp8266 verzia ESP-12 s viac pinmi ,,alebo aj iné ale zmeniť čísla pinov,,,ak sú nejaké chyby v ARDUINO IDE,,tak správnu verziu knižníc či verziu ARDUINO IDE
    2x 1-wire pre dva samostatné DS18B20,,1x na pin D6(MISO),1x na pin D7(MOSI)
    v hornom príklade pre arduino sú senzory podľa adries,,pre ESP8266 si zisti samo,,,stači zmeniť kód pre viac senzorov podľa arduina
    stačí zlúčiť premene pre teploty alebo si doplniť vlkosť,osvetlenie,otvorenie dveri,,a poslať na thingspeak,,,dá sa posielať aj text do chatu pre thingspeak,,,sé aj iné serveri na záznam hodnôt

    ————–
    // tested in ARDUINO IDE 1.6.7
    // boards http://arduino.esp8266.com/package_esp8266com_index.json
    //
    // ESP8266 E12 settings ADAFRUIT HUZZAH ESP8266 40MHz SERIAL 80MHz 4M ck 115200 com? AVRSIPmkll
    // or NODEMCU V 0.1 — NODEMCU 0.9 , 80MHz 4M 11520 com? AVRSIPmkll
    // name of project:esp8266_2xds18b20_2xwire_thingspeak

    #include
    #include
    #include
    #include
    #include
    #include

    // replace with your channel’s thingspeak API key,
    String apiKey = „X274FW5NIT3BAHSA“; //váš api key
    const char* ssid = „virginmedia“; // meno wifi
    const char* password = „aaaa“; //heslo router
    const char* server = „api.thingspeak.com“;

    int ledState = LOW;

    // DS18B20 plug to pin GPIO12 ESP8266-12
    #define ONE_WIRE_BUSA 12 // sensor on pin D6 SPI Bus MISO
    #define ONE_WIRE_BUSB 13 // sensor on pin D7 SPI Bus MOSI
    // define resolution for sensors 9bit/0.5 10bit/0.25 11bit/0.125 12bit/0.0625
    #define TEMPERATURE_PRECISION 11

    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    OneWire oneWireA(ONE_WIRE_BUSA);
    OneWire oneWireB(ONE_WIRE_BUSB);

    // Pass our oneWire reference to Dallas Temperature.
    DallasTemperature sensors1(&oneWireA);
    DallasTemperature sensors2(&oneWireB);
    // arrays to hold device addresses
    DeviceAddress insideThermometer, outsideThermometer;

    float teplota;
    String termOUT;
    String termIN;

    WiFiClient client;

    void setup() {
    Serial.begin(115200);
    delay(10);
    WiFi.begin(ssid, password);
    Serial.println(„“);
    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“);

    Serial.println(„“);
    Serial.print(„Connected to „);
    Serial.println(ssid);
    Serial.print(„IP address: „);
    Serial.println(WiFi.localIP());

    // Start up the library
    sensors1.begin();
    sensors2.begin();
    // locate devices on the bus A
    Serial.print(„A Found „);
    Serial.print(sensors1.getDeviceCount(), DEC);
    Serial.println(“ devices.“);
    // locate devices on the bus B
    Serial.print(„BFound „);
    Serial.print(sensors2.getDeviceCount(), DEC);
    Serial.println(“ devices.“);
    // report parasite power requirements
    Serial.print(„Parasite power is: „);
    if (sensors1.isParasitePowerMode()) Serial.println(„ON“);
    else Serial.println(„OFF“);
    // search for devices on the bus and assign based on an index.
    if (!sensors1.getAddress(insideThermometer, 0)) Serial.println(„Unable to find address for Device 0“);
    if (!sensors2.getAddress(outsideThermometer, 0)) Serial.println(„Unable to find address for Device 1“);

    // set the resolution to 9 bit
    sensors1.setResolution(insideThermometer, TEMPERATURE_PRECISION);
    sensors2.setResolution(outsideThermometer, TEMPERATURE_PRECISION);

    Serial.print(„Device 0 Resolution: „);
    Serial.print(sensors1.getResolution(insideThermometer), DEC);
    Serial.println();

    Serial.print(„Device 1 Resolution: „);
    Serial.print(sensors2.getResolution(outsideThermometer), DEC);
    Serial.println();
    }

    // function to print a device address
    void printAddress(DeviceAddress deviceAddress)
    {
    for (uint8_t i = 0; i < 8; i++)
    {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
    }
    }

    // function to print the temperature for a device
    void printTemperature(DeviceAddress deviceAddress)
    {
    if (ledState == LOW) {
    float tempC = sensors1.getTempC(deviceAddress);
    Serial.print("Temp C: ");
    Serial.print(tempC);
    Serial.print(" Temp F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
    } else if(ledState == HIGH){
    float tempC = sensors2.getTempC(deviceAddress);
    Serial.print("Temp C: ");
    Serial.print(tempC);
    Serial.print(" Temp F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
    }
    }

    void printResolution(DeviceAddress deviceAddress)
    {
    if (ledState == LOW) {
    Serial.print("Resolution: ");
    Serial.print(sensors1.getResolution(deviceAddress));
    Serial.println();
    } else if(ledState == HIGH){
    Serial.print("Resolution: ");
    Serial.print(sensors2.getResolution(deviceAddress));
    Serial.println();
    }
    }

    // main function to print information about a device
    void printData(DeviceAddress deviceAddress)
    {
    Serial.print("Device Address: ");
    printAddress(deviceAddress);
    Serial.print(" ");
    printTemperature(deviceAddress);
    Serial.print(" ");
    printResolution(deviceAddress);
    Serial.println();

    }

    void loop(void)
    {

    // call sensors.requestTemperatures() to issue a global temperature
    // request to all devices on the bus
    Serial.print("Requesting temperatures…");
    sensors1.requestTemperatures();
    sensors2.requestTemperatures();
    Serial.println("DONE");
    // print the device information
    Serial.print("Teplota vnutri: ");
    ledState = LOW;
    printData(insideThermometer);
    ledState = HIGH;
    Serial.print("Teplota vonku: ");
    printData(outsideThermometer);
    float tint = sensors1.getTempC(insideThermometer);
    float tout = sensors2.getTempC(outsideThermometer);
    if (client.connect(server,80)) { // "184.106.153.149" or api.thingspeak.com
    String postStr = apiKey;
    postStr +="&field1=";
    postStr += String(tint);
    postStr +="&field2=";
    postStr += String(tout);
    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);
    }
    client.stop();

    Serial.println("Waiting…");
    // thingspeak needs minimum 15 sec delay between updates
    delay(20000);

    }

  • jozef 21.2.2018 Odpovědět

    arduino nano a 4x DS18B20 na 1-wire zbernici pomocou adries,,,nie autodetekcia
    adresy si zistite v programe i2c scanner.ino


    // This Arduino sketch reads DS18B20 „1-Wire“ digital
    // temperature sensors.
    // Copyright (c) 2010 Mark McComb, hacktronics LLC
    // License: http://www.opensource.org/licenses/mit-license.php (Go crazy)
    // Tutorial:
    // http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html

    #include
    #include

    // Data wire is plugged into pin 3 on the Arduino
    #define ONE_WIRE_BUS 7

    // Setup a oneWire instance to communicate with any OneWire devices
    OneWire oneWire(ONE_WIRE_BUS);

    // Pass our oneWire reference to Dallas Temperature.
    DallasTemperature sensors(&oneWire);

    // Assign the addresses of your 1-Wire temp sensors.
    // See the tutorial on how to obtain these addresses:
    // http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html

    DeviceAddress insideThermometer = { 0x28, 0xFF, 0x15, 0x43, 0x31, 0x04, 0x00, 0xC0 };
    DeviceAddress outsideThermometer = { 0x28, 0xFF, 0x03, 0x4A, 0x33, 0x04, 0x00, 0xFC };
    DeviceAddress dogHouseThermometer = { 0x28, 0xFF, 0x73, 0x05, 0x34, 0x04, 0x00, 0x91 };
    DeviceAddress cathouseThermometer = { 0x28, 0xFF, 0x1F, 0x8A, 0x4E, 0x04, 0x00, 0x67 };

    void setup(void)
    {
    // start serial port
    Serial.begin(9600);
    // Start up the library
    sensors.begin();
    // set the resolution to 10 bit (good enough?)
    sensors.setResolution(insideThermometer, 10);
    sensors.setResolution(outsideThermometer, 10);
    sensors.setResolution(dogHouseThermometer, 10);
    sensors.setResolution(cathouseThermometer, 10);
    }

    void printTemperature(DeviceAddress deviceAddress)
    {
    float tempC = sensors.getTempC(deviceAddress);
    if (tempC == -127.00) {
    Serial.print(„Error getting temperature“);
    } else {
    Serial.print(„C: „);
    Serial.print(tempC);
    Serial.print(“ F: „);
    Serial.print(DallasTemperature::toFahrenheit(tempC));
    }
    }

    void loop(void)
    {
    delay(2000);
    Serial.print(„Getting temperatures…\n\r“);
    sensors.requestTemperatures();

    Serial.print(„Inside temperature is: „);
    printTemperature(insideThermometer);
    Serial.print(„\n\r“);
    Serial.print(„Outside temperature is: „);
    printTemperature(outsideThermometer);
    Serial.print(„\n\r“);
    Serial.print(„Dog House temperature is: „);
    printTemperature(dogHouseThermometer);
    Serial.print(„\n\r“);
    Serial.print(„cat temperature is: „);
    printTemperature(cathouseThermometer);
    Serial.print(„\n\r\n\r“);
    }

  • jozef 21.2.2018 Odpovědět

    zistenie verejnej IP adresy ak to neumožňuje router,,,lebo DDNS sú platené
    môžte zmeniť kód a odoslať na thingspeak či email a pod.
    je to dobré pre IP KAMERY, WOL pre PC,,ovládanie zariadeni doma napr. SATELIT atď ak sa zmení IP ADRESA
    -ESP8266 –adresa v termináli ako príklad
    Ak si presmerujete port v routri pre ESP8266 a ten nastavite ako server tak móžte na jeho webovú stránku pristupovať mimo domova a ovladať piny,,,,platí to aj pre Arduino s LAN MODULOM
    dajú sa nájsť aj iné stránky na zistenie IP ,,odpoveď je ako TEXT, JSON a pod.
    v príklade je api.ipify.org
    —————————————-

    #include

    // zde si nastavte jmeno site a heslo, pokud heslo nemá zadejte „“
    const char *ssid = „virginmedia“; //meno wifi
    const char *password = „aaaaaaa“; //heslo pre wifi

    //vytvori instanci objektu WifiServer na portu 80
    WiFiServer server(80);

    void setup() {

    Serial.begin(115200);
    delay(10);

    // Vypisuje na serial monitor udaje o pripojovani
    Serial.println();
    Serial.println();
    Serial.print(„Connecting to „);
    Serial.println(ssid);

    WiFi.begin(ssid, password); // samotný proces pripojeni k siti

    while (WiFi.status() != WL_CONNECTED) { // dokud není pripojeno
    delay(50);
    }

    // zapnni sever
    server.begin();
    Serial.println(„Server started“);

    // vypise pridelenou IP adresu routerem
    Serial.print(„Server IP: „);
    Serial.println(WiFi.localIP());

    }

    void loop() {

    while (WiFi.status() != WL_CONNECTED) { // dokud není pripojeno
    delay(50);
    }

    // kontroluj zda se nekdo pripojil
    WiFiClient client = server.available();
    if (client.connect(„api.ipify.org“, 80)) {
    //Serial.println(„connected“);
    client.println(„GET /?format=txt HTTP/1.0“);
    client.println(„Host: api.ipify.org“);
    client.println();
    } else {
    Serial.println(„connection failed“);
    }
    delay(50);
    int a = 1;
    while (client.connected()) {
    a = a + 1;
    String line = client.readStringUntil(‚\n‘);

    Serial.println(line);

    }
    }

  • jozef 21.2.2018 Odpovědět

    email nie je pravý
    odoslanie teploty na thingspeak s ESP8266 a zistenie verejnej IP adresy a príklad na čítanie poslednej hodnoty z thingspeak z jedného grafu=kánalu
    netreba adresy pre 2x DS18B20 v tomto príklade,,autodetekcia
    IP adresa na seriový port,,,,,dá sa rozdeliť na štyri časti a poslať na thingspeak alebo ako text na email
    zmeňte číslo kánalu podľa svojho,,,najdite toto v kóde:
    ——/channels/17994444/fields/1/last

    ——-
    // ARDUINO IDE 1.6.7,,,scratch mDNS_Web_Server
    // temperature on thingspeak
    // read from thingspeak– no complet
    // find out public ip
    #include

    /*
    ESP8266 mDNS responder sample

    This is an example of an HTTP server that is accessible
    via http://esp8266.local URL thanks to mDNS responder.

    Instructions:
    – Update WiFi SSID and password as necessary.
    – Flash the sketch to the ESP8266 board
    – Install host software:
    – For Linux, install Avahi (http://avahi.org/).
    – For Windows, install Bonjour (http://www.apple.com/support/bonjour/).
    – For Mac OSX and iOS support is built in through Bonjour already.
    – Point your browser to http://esp8266.local, you should see a response.

    */

    #include
    #include
    #include

    // boards http://arduino.esp8266.com/package_esp8266com_index.json
    // GENERIC ESP8266 MODULE
    // settings QIO 40MHz SERIAL 80MHz 4M ck 115200 com? AVRSIPmkll

    #include
    #include

    // replace with your channel’s thingspeak API key,
    String apiKey = „X274FW5NIT3BAHSA“; //váš api key
    const char* ssid = „virginmedia“; // meno wifi
    const char* password = „aaaa“; //heslo router

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

    // DS18B20 plug to pin GPIO12 ESP8266-12
    #define ONE_WIRE_BUS 2
    // define resolution for sensors 9bit/0.5 10bit/0.25 11bit/0.125 12bit/0.0625
    #define TEMPERATURE_PRECISION 11

    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    OneWire oneWire(ONE_WIRE_BUS);

    // Pass our oneWire reference to Dallas Temperature.
    DallasTemperature sensors(&oneWire);

    // arrays to hold device addresses
    DeviceAddress insideThermometer, outsideThermometer;

    float teplota;
    String termOUT;
    String termIN;

    WiFiClient client;

    void setup() {
    Serial.begin(115200);
    delay(10);
    WiFi.begin(ssid, password);
    Serial.println(„“);
    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“);

    Serial.println(„“);
    Serial.print(„Connected to „);
    Serial.println(ssid);
    Serial.print(„IP address: „);
    Serial.println(WiFi.localIP());

    // Start up the library
    sensors.begin();

    // locate devices on the bus
    Serial.print(„Found „);
    Serial.print(sensors.getDeviceCount(), DEC);
    Serial.println(“ devices.“);
    // report parasite power requirements
    Serial.print(„Parasite power is: „);
    if (sensors.isParasitePowerMode()) Serial.println(„ON“);
    else Serial.println(„OFF“);
    // search for devices on the bus and assign based on an index.
    if (!sensors.getAddress(insideThermometer, 0)) Serial.println(„Unable to find address for Device 0“);
    if (!sensors.getAddress(outsideThermometer, 1)) Serial.println(„Unable to find address for Device 1“);

    // set the resolution to 9 bit
    sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
    sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);

    Serial.print(„Device 0 Resolution: „);
    Serial.print(sensors.getResolution(insideThermometer), DEC);
    Serial.println();

    Serial.print(„Device 1 Resolution: „);
    Serial.print(sensors.getResolution(outsideThermometer), DEC);
    Serial.println();
    }

    // function to print a device address
    void printAddress(DeviceAddress deviceAddress)
    {
    for (uint8_t i = 0; i < 8; i++)
    {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
    }
    }

    // function to print the temperature for a device
    void printTemperature(DeviceAddress deviceAddress)
    {
    float tempC = sensors.getTempC(deviceAddress);
    Serial.print("Temp C: ");
    Serial.print(tempC);
    Serial.print(" Temp F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
    }

    void printResolution(DeviceAddress deviceAddress)
    {
    Serial.print("Resolution: ");
    Serial.print(sensors.getResolution(deviceAddress));
    Serial.println();
    }

    // main function to print information about a device
    void printData(DeviceAddress deviceAddress)
    {
    Serial.print("Device Address: ");
    printAddress(deviceAddress);
    Serial.print(" ");
    printTemperature(deviceAddress);
    Serial.print(" ");
    printResolution(deviceAddress);
    Serial.println();

    }

    void loop(void)
    {

    // call sensors.requestTemperatures() to issue a global temperature
    // request to all devices on the bus
    Serial.print("Requesting temperatures…");
    sensors.requestTemperatures();
    Serial.println("DONE");
    // print the device information
    Serial.print("Teplota vnutri: ");
    printData(insideThermometer);
    Serial.print("Teplota vonku: ");
    printData(outsideThermometer);
    float tint = sensors.getTempC(insideThermometer);
    float tout = sensors.getTempC(outsideThermometer);

    // data to thingspeak
    if (client.connect(server,80)) { // "184.106.153.149" or api.thingspeak.com
    String postStr = apiKey;
    postStr +="&field1=";
    postStr += String(tint);
    postStr +="&field2=";
    postStr += String(tout);
    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.println("thing text");
    client.stop();
    // data to thingspeak – end

    // read from thingspeak
    Serial.println("read TS…");
    if (client.connect(server,80)){
    // čislo je čiślo vášho kánalu,,,zmeňte to
    client.println("GET /channels/17994444/fields/1/last") ;
    client.println("Host: api.thingspeak.com");
    client.println();
    } else {
    Serial.println("connection failed");
    }
    delay(50);
    int a = 1;
    while (client.connected()) {
    a = a + 1;
    String line = client.readStringUntil('\n');

    Serial.println(line);
    }
    client.stop();
    Serial.println("Waiting…");

    // read from thingspeak – end

    // thingspeak needs minimum 15 sec delay between updates
    delay(20000);
    // find out public ip
    if (client.connect("api.ipify.org", 80)) {
    //Serial.println("connected");
    client.println("GET /?format=txt HTTP/1.0");
    client.println("Host: api.ipify.org");
    client.println();
    } else {
    Serial.println("connection failed");
    }
    delay(50);
    int a = 1;
    while (client.connected()) {
    a = a + 1;
    String line = client.readStringUntil('\n');

    Serial.println(line);

    }
    client.stop();
    // find out public ip–end
    }