Barometr WiFi ePaper 2.9
Josef Zvolánek připravil úžasný příklad pro to jak si doma udělat luxusní zobrazení hodnot z TMEP.cz na tříbarevném eInk displeji! O vše se podělil a za to mu patří obrovské dík! Na tomto projektu udělal kus práce.
Kontakt na autora: Twitter, Facebook, G+
Vše je krásně popsané na Chiptron.cz. Aby byly informace pohromadě i zde, dovoluji si to podstatné zkopírovat i sem:
- Základem meteostanice je vývojový kit od Adafruit ESP8266 Huzzah.
- Meteostanice obsahuje i desku pro nabíjení z Li-Ion/Li-Poly baterie.
- Všechna data jsou přehledně zobrazena na tříbarevném ePaper displeji o velikosti 2.9".
- O měření vnitřní teploty a vlhkosti se stará čidlo DHT22.
- Aktuální údaje venkovní teploty a vlhkosti se stahují z webu.
Celkový odběr během spánku je pouhých 0.09 mA. Josef použil typ baterie 18650 značky Panasonic o kapacitě 3350 mAh. Na tuto baterii běží meteostanice již měsíc a předpokládaná výdrž se odhaduje až na dva měsíce.
Údaje na displeji se aktualizují každých 30 minut z webu zvolanek.tmep.cz, které tam posílá první verze meteostanice (ta s velkým displejem). Díky napájení z baterie a velmi nízké spotřebě můžete mít tuto meteostanici kdekoliv v bytě, resp. tam, kde máte WiFi signál. Zároveň měří teplotu/vlhkost v daném místě a teplotu/vlhkost z venku stahuje ze služby tmep.cz. Do budoucna je plánována i krabička navržená pro tisk na 3D tiskárně.
Nezapomeňte na začátku kódu nastavit své správné proměnné (SSID vlastní wifi, heslo k wifi síti a správnou adresu k JSONu na tmep.cz).
Data pro výrobu tištěného spoje ke stažení
- tmep_json_EPD_29_ver4_OK.ino
/* // Version 4.0 13-2-2018 Bareometr WiFi ePaper 2.9inch tři barvy Tato WiFi meteostanice stahuje data s webu: tmep.cz Aktualizace se provádí jednou za 30 minut (volitelné) Tento kód je inspirován od autora: http://wiki.tmep.cz/doku.php?id=ruzne:esp8266 Přepracoval: Josef Zvolánek https://plus.google.com/u/0/+JosefZvolanek https://twitter.com/JosefZvolanek - přidané čidlo DHT22 pro měření vnitřní teploty - zobrazení naměřeních údajů na ePaper Waveshare 2.9inch tři barvy - Měření napětí baterie + grafické zobrazení-ikona - Měření signálu WiFi + grafické zobrazeni-ikona Ps: Děkuji za kotrolu a revizi kódu Davidem Birdem https:www.youtube.com/user/G6EJD/videos */ #include <ESP8266WiFi.h> // WiFi library #include <ArduinoJson.h> // JSON library #include "DHT.h" // DHT sensor library #include <Adafruit_GFX.h> // Core graphics library for OLED #include <GxEPD.h> #include <GxGDEW029Z10/GxGDEW029Z10.cpp> // 2.9" b/w/r //Senzor DHT22 #define DHTPIN 12 #define DHTTYPE DHT22 // DHT 22 DHT dht(DHTPIN, DHTTYPE); //Font #include <Fonts/FreeSans9pt7b.h> #include <Fonts/FreeSans24pt7b.h> #include <Fonts/FreeSans12pt7b.h> #include <Fonts/FreeSans18pt7b.h> #include <Fonts/FreeSansBoldOblique9pt7b.h> // EPD 2.9inch e-Paper #include <GxIO/GxIO_SPI/GxIO_SPI.cpp> #include <GxIO/GxIO.cpp> // mapping suggestion from Waveshare 2.9inch e-Paper to Wemos D1 mini // BUSY -> 4, RST -> 2, DC -> 0, CS -> 15, CLK -> 14, DIN -> 13, GND -> GND , 3.3V -> 3.3V GxIO_Class io(SPI, 15, 0, 2); GxEPD_Class display(io, 2, 4); //Obrázky bmp ikony const unsigned char Venku [] PROGMEM = { // 'VENKU2' 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0e, 0x83, 0x60, 0x00, 0x00, 0x0e, 0x83, 0x60, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, 0x00, 0x1b, 0xf0, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x05, 0x8c, 0x00, 0x00, 0x00, 0x07, 0x0c, 0x00, 0x00, 0x00, 0x03, 0x08, 0x80, 0x00, 0x00, 0x03, 0x08, 0x80, 0x00, 0x00, 0x01, 0x09, 0xb8, 0x00, 0x00, 0x03, 0x8b, 0xc0, 0x00, 0x00, 0x0f, 0xde, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0xff, 0x80, 0x00, 0x00 }; const unsigned char Teplota [] PROGMEM = { // 'TEPLOTA' 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x99, 0x3c, 0x00, 0x00, 0x00, 0xa5, 0xb8, 0x00, 0x00, 0x01, 0xa5, 0x80, 0x00, 0x00, 0x01, 0xa5, 0xb0, 0x00, 0x00, 0x01, 0xa5, 0x80, 0x00, 0x00, 0x01, 0xa5, 0xb8, 0x00, 0x00, 0x01, 0xa5, 0xbc, 0x00, 0x00, 0x01, 0xa5, 0x80, 0x00, 0x00, 0x01, 0xa5, 0xb0, 0x00, 0x00, 0x01, 0xa5, 0x80, 0x00, 0x00, 0x01, 0xa5, 0x80, 0x00, 0x00, 0x01, 0xa5, 0xbc, 0x00, 0x00, 0x01, 0xa5, 0x80, 0x00, 0x00, 0x01, 0xa5, 0xb0, 0x00, 0x00, 0x01, 0xa5, 0xb0, 0x00, 0x00, 0x01, 0xa5, 0x80, 0x00, 0x00, 0x01, 0xa5, 0x80, 0x00, 0x00, 0x03, 0x24, 0xe0, 0x00, 0x00, 0x0c, 0x24, 0x30, 0x00, 0x00, 0x18, 0x24, 0x18, 0x00, 0x00, 0x10, 0xe7, 0x08, 0x00, 0x00, 0x31, 0x81, 0x8c, 0x00, 0x00, 0x23, 0x00, 0xc4, 0x00, 0x00, 0x62, 0x00, 0x46, 0x00, 0x00, 0x64, 0x00, 0x26, 0x00, 0x00, 0x44, 0x00, 0x22, 0x00, 0x00, 0x44, 0x00, 0x22, 0x00, 0x00, 0x44, 0x00, 0x22, 0x00, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x62, 0x00, 0x46, 0x00, 0x00, 0x23, 0x00, 0xc4, 0x00, 0x00, 0x31, 0x81, 0x8c, 0x00, 0x00, 0x10, 0x7f, 0x08, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x06, 0x00, 0x60, 0x00, 0x00, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00 }; const unsigned char DOMA [] PROGMEM = { // 'DOMA' 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x01, 0xff, 0x80, 0x00, 0x00, 0x03, 0xc1, 0xc0, 0x00, 0x00, 0x1e, 0x00, 0x78, 0x00, 0x00, 0x3c, 0x18, 0x3c, 0x00, 0x00, 0xe0, 0xff, 0x07, 0x00, 0x07, 0xc3, 0xc3, 0xc3, 0xe0, 0x0f, 0x07, 0x00, 0xf0, 0x70, 0x78, 0x3c, 0x00, 0x3c, 0x1e, 0xf0, 0x70, 0x00, 0x0e, 0x0f, 0xc3, 0xc0, 0x00, 0x03, 0xc3, 0xcf, 0x00, 0xff, 0x00, 0xf3, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xf0, 0x00, 0xc1, 0x00, 0x0f, 0x70, 0x00, 0xc1, 0x00, 0x0e, 0x30, 0x00, 0xc1, 0x00, 0x0c, 0x30, 0x00, 0xc1, 0x00, 0x0c, 0x30, 0x00, 0xd9, 0x00, 0x0c, 0x30, 0x00, 0xd9, 0x00, 0x0c, 0x30, 0x00, 0xd9, 0x00, 0x0c, 0x30, 0x00, 0xd9, 0x00, 0x0c, 0x30, 0x00, 0xd9, 0x00, 0x0c, 0x30, 0x00, 0xd9, 0x00, 0x0c, 0x30, 0x01, 0x99, 0xc0, 0x0c, 0x30, 0x03, 0x18, 0xc0, 0x0c, 0x30, 0x06, 0x7e, 0x60, 0x0c, 0x30, 0x06, 0x7e, 0x60, 0x0c, 0x30, 0x06, 0x7e, 0x60, 0x0c, 0x30, 0x06, 0x7e, 0x60, 0x0c, 0x30, 0x06, 0x7e, 0x60, 0x0c, 0x30, 0x03, 0x18, 0xc0, 0x0c, 0x30, 0x01, 0x81, 0x80, 0x0c, 0x30, 0x00, 0xe7, 0x00, 0x0c, 0x30, 0x00, 0x7e, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x0c, 0x3f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xfc }; const unsigned char P [] PROGMEM = { // 'POCASI, 32x32px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x43, 0xf0, 0x00, 0x00, 0x48, 0x08, 0x00, 0x00, 0x50, 0x03, 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, 0x20, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x01, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x78, 0x04, 0x00, 0x00, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; const unsigned char P1 [] PROGMEM = { // 'POCASI1, 32x32px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x00, 0x08, 0x7c, 0x00, 0x00, 0x08, 0xfe, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x08, 0xfe, 0x00, 0x00, 0x08, 0xfe, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; const unsigned char Slunicko [] PROGMEM = { // 'Slunicko, 32x32px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x80, 0x01, 0x80, 0x03, 0x00, 0x00, 0xc3, 0x86, 0x00, 0x00, 0x5f, 0xf4, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x20, 0x0c, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x40, 0x06, 0x00, 0x1e, 0xc0, 0x06, 0xf0, 0x00, 0x40, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, 0x1c, 0x30, 0x00, 0x00, 0xcf, 0xe6, 0x00, 0x01, 0x80, 0x03, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; const unsigned char P2 [] PROGMEM = { // 'Zatazeno, 32x32px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0c, 0x00, 0x60, 0x00, 0x06, 0x38, 0xc0, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x01, 0x83, 0x00, 0x00, 0x03, 0x01, 0x80, 0x01, 0xf2, 0x00, 0x80, 0x03, 0x1a, 0x00, 0xb8, 0x06, 0x0f, 0x00, 0x80, 0x04, 0x01, 0x81, 0x80, 0x1c, 0x00, 0x41, 0x00, 0x10, 0x00, 0x43, 0x00, 0x20, 0x00, 0x5c, 0x80, 0x20, 0x00, 0x40, 0xc0, 0x30, 0x00, 0xd0, 0x60, 0x1f, 0xff, 0x90, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; const unsigned char Teplota2 [] PROGMEM = { // 'Teplota2, 40x40px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x01, 0xbd, 0x80, 0x00, 0x00, 0x01, 0x3d, 0x80, 0x00, 0x00, 0x01, 0x3c, 0xf0, 0x00, 0x00, 0x01, 0x3c, 0xf0, 0x00, 0x00, 0x01, 0x3c, 0x80, 0x00, 0x00, 0x01, 0x3c, 0x80, 0x00, 0x00, 0x01, 0x3c, 0xf0, 0x00, 0x00, 0x01, 0x3c, 0xf0, 0x00, 0x00, 0x01, 0x3c, 0x80, 0x00, 0x00, 0x01, 0x3c, 0x80, 0x00, 0x00, 0x01, 0x3c, 0x80, 0x00, 0x00, 0x01, 0x3c, 0xf0, 0x00, 0x00, 0x01, 0x3c, 0x80, 0x00, 0x00, 0x01, 0x3c, 0x80, 0x00, 0x00, 0x03, 0x3c, 0xc0, 0x00, 0x00, 0x06, 0x3c, 0xe0, 0x00, 0x00, 0x06, 0xff, 0x60, 0x00, 0x00, 0x0c, 0xff, 0x30, 0x00, 0x00, 0x0d, 0xff, 0xb0, 0x00, 0x00, 0x0d, 0xff, 0xb0, 0x00, 0x00, 0x0d, 0xff, 0xb0, 0x00, 0x00, 0x0d, 0xff, 0xb0, 0x00, 0x00, 0x0c, 0xff, 0x30, 0x00, 0x00, 0x06, 0xfe, 0x60, 0x00, 0x00, 0x07, 0x3c, 0xe0, 0x00, 0x00, 0x03, 0x81, 0xc0, 0x00, 0x00, 0x01, 0xff, 0x80, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; const unsigned char Slunicko2 [] PROGMEM = { // 'Slunicko2, 32x32px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x01, 0x80, 0xc0, 0x01, 0x81, 0x81, 0xc0, 0x01, 0xc0, 0x03, 0x80, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x63, 0xc2, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x1f, 0x1f, 0xfc, 0xf8, 0x1f, 0x1f, 0xfc, 0xf8, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x60, 0x82, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x01, 0xc0, 0x03, 0xc0, 0x01, 0x81, 0x81, 0xc0, 0x01, 0x01, 0x80, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; const unsigned char Zatazeno2 [] PROGMEM = { // 'Zatazeno2, 32x32px 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x04, 0x0c, 0x08, 0x00, 0x06, 0x0c, 0x18, 0x00, 0x03, 0x00, 0x30, 0x00, 0x01, 0x00, 0x60, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x79, 0xf0, 0x00, 0x00, 0x77, 0xfc, 0x00, 0x18, 0xee, 0x0e, 0x00, 0x3c, 0xd8, 0x07, 0xe0, 0x00, 0xd8, 0x03, 0xf0, 0x00, 0x30, 0x00, 0x38, 0x00, 0xf0, 0x00, 0x18, 0x01, 0xc0, 0x00, 0x0c, 0x01, 0x80, 0x00, 0x0c, 0x01, 0x80, 0x00, 0x0c, 0x05, 0x80, 0x00, 0x08, 0x05, 0x80, 0x40, 0x18, 0x01, 0xe1, 0xc0, 0x70, 0x00, 0xf3, 0xdf, 0xe0, 0x00, 0x07, 0x80, 0x00, 0x00, 0x4f, 0x82, 0x00, 0x00, 0xc7, 0x86, 0x00, 0x01, 0xc7, 0x0c, 0x00, 0x01, 0x80, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; // Define settings-nastavení const char* ssid = "......."; // WiFi SSID const char* pass = "......."; // WiFi password const char* host = "tmep.cz"; const int httpPort = 80; boolean host_status; const char* jsonurl = ".........."; // JSON's URL (ex. https://tmep.cz/vystup-json.php?id=xxx&export_key=xxxxxxxxxx const long sleep = 100000; // How often read data from the server. Default is 600000ms = 10 minute WiFiClient client; // Use WiFiClient class to create TCP connections void setup() { Initialise_system(); Start_WiFi(); } void loop() { RSSI(60,120,WiFi.RSSI());// WiFi ikona long rssi = WiFi.RSSI(); Serial.print("RSSI:"); Serial.println(rssi); display.setCursor(150 / 2, 240 / 2); display.print(rssi); display.print(" db"); Serial.print("Connecting to "); Serial.println(host); if (!client.connect(host, httpPort)) { // If you didn't get a connection to the server Serial.println("Connection failed"); host_status = false; } else host_status = true; if (host_status = true) { Serial.println("Client connected"); // Make an url char url[50]; // Make new array, 50 bytes long strncpy(url, &jsonurl[15], strlen(jsonurl) - 14); // Remove "https://tmep.cz" and leave rest // Serial.print("Requesting URL: "); Serial.println(url); // Make HTTP GET request client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); // Workaroud for timeout unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { Serial.println(">>> Client Timeout !"); client.stop(); } } // Read JSON String data; bool capture = false; String json; while (client.available()) { data = client.readStringUntil('\n'); // Loop over rows. "\r" not work. "\0" returns all at one //Serial.println(data); // First few rows is header, it ends with empty line. // This is unique ultrasimple, but working solution. // Start capture when { occurs and end capturing with }. if (data.startsWith("{", 0)) { // JSON starts with {. Start capturing. capture = true; } if (data.startsWith("}", 0)) { // JSON ends with }. Stop capturing. capture = false; } if (capture) { json = json + data; // Joining row by row together in one nice JSON part. } } json = json + "}"; // WTF, last bracket is missing :/ add it here - ugly! Serial.println(json); // Lets throw our json on ArduinoJson library and get results! StaticJsonBuffer<300> jsonBuffer; // možná dynamicBuffer JsonObject& root = jsonBuffer.parseObject(json); if (!root.success()) Serial.print("ParseObject() failed"); // This is how our JSON looks. You can read any value of parameters // { // "teplota": 24.87, // "vlhkost": null, // "rosny": null, // "cas": "2016-06-02 18:29:45", // "umisteni": "Karlovy Vary" // } //ČAS-Update String cas = root["cas"]; // Get value of "cas" Serial.print("cas: "); Serial.println(cas); display.setTextSize(1); const GFXfont* f = &FreeSansBoldOblique9pt7b; display.setFont(f); display.setTextColor(GxEPD_RED); display.setCursor(30, 13); display.print("Update:"); display.setTextColor(GxEPD_BLACK); display.setCursor(105, 13); display.print(cas); //display.drawBitmap(5, 1, U, 12, 12, GxEPD_BLACK);//ikona U display.drawLine(0, 35 / 2, 600 / 2, 35 / 2, GxEPD_BLACK); display.setTextColor(GxEPD_RED); display.setCursor(40, 36); display.print("VENKU"); //display.drawBitmap(160, 15, P1, 32, 32, GxEPD_BLACK); display.drawBitmap(5, 15, Zatazeno2, 32, 32, GxEPD_BLACK);//Venku ikona display.setCursor(200, 36); display.print("DOMA"); display.drawBitmap(160, 15, Slunicko2, 32, 32, GxEPD_BLACK);//Doma ikona display.drawLine(0, 90 / 2, 600 / 2, 90 / 2, GxEPD_BLACK); display.drawLine(300 / 2, 35 / 2, 300 / 2, 270 / 2, GxEPD_BLACK); //vertikál //Teplota-WEB tmep.cz ePaper float teplota = root["teplota"]; // Get value of "teplota" display.setTextColor(GxEPD_BLACK); display.setFont(f); display.setTextSize(1); display.setCursor(40,70); if (teplota == -127.00) { // If you have connected it wrong, Dallas read this temperature! :) Serial.println("teplota: chyba!"); display.print("ERR"); } else { Serial.print("teplota: "); Serial.println(teplota); display.print(teplota, 1); // Round temp to one decimal point display.setTextSize(1); display.print(" C "); DisplayDegree(75,57); display.drawBitmap(100, 50, Venku, 40, 40, GxEPD_BLACK); //display.drawBitmap(0, 55, Teplota, 40, 40, GxEPD_BLACK); display.drawBitmap(0, 55, Teplota2, 40, 40, GxEPD_BLACK); //Vlkost-WEB tmep.cz float vlhkost = root["vlhkost"]; // Get value of "vlhkost" Serial.print("vlhkost: "); Serial.println(vlhkost); display.setTextColor(GxEPD_BLACK); const GFXfont* f = &FreeSansBoldOblique9pt7b; display.setFont(f); display.setTextSize(1); display.setCursor(40, 95); display.print(vlhkost, 1); display.print(" % "); //DHT22-DOMA float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); Serial.print("Humidity: " + String(h) + " Temperature: " + String(t) + " *C "); //Teplota display.setTextColor(GxEPD_BLACK); display.setCursor(420 / 2, 143 / 2); display.print(String(t, 1) + " C"); DisplayDegree(505/2,115/2); //Vlhkost display.setCursor(420 / 2, 190 / 2); display.print(String(h, 1) + " %"); display.drawBitmap(160, 55, DOMA, 40, 40, GxEPD_BLACK); //Baterie uint8_t percentage = 100; float adcVoltage = analogRead(A0) / 1024.0; // This values where empirically collected float batteryVoltage = adcVoltage * 4.945945946 - 0.3957657658; if (batteryVoltage > 4.2) percentage = 100; else if (batteryVoltage < 3.3) percentage = 0; else percentage = (batteryVoltage - 3.3) * 100 / (4.2 - 3.3); Battery(155, 105, 3, percentage); display.setCursor(380/2,240/2); display.print(String(batteryVoltage,2)+"v"); display.setCursor(480/2,240/2); display.print(String(percentage)+"%"); display.drawLine(300 / 2, 35 / 2, 300 / 2, 270 / 2, GxEPD_BLACK); //vertikál } display.update(); Serial.println(); delay(200); } else { // display.setCursor(420 / 2, 190 / 2); //display.print("Network error with host..."); display.update(); } Serial.println("Going to sleep...for 30minut"); ESP.deepSleep(30 * 60 * 1e6); delay(500); } void Initialise_system() { Serial.begin(115200); // Start serial dht.begin(); //DHT22 Serial.println(); // ePaper display display.init(); display.fillScreen(GxEPD_WHITE); display.setRotation(1); } void Start_WiFi() { // Connect to the WiFi // int rssi = getRSSI(SSID); Serial.print("Connecting to "); Serial.println(ssid); display.print("Connecting to "); display.println(ssid); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); //display.println(); Serial.println("WiFi connected"); //display.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); display.setTextColor(GxEPD_RED); const GFXfont* f = &FreeSansBoldOblique9pt7b; display.setFont(f); display.setTextSize(0); //display.setCursor(10 / 2, 248 / 2); display.print("IP:" + WiFi.localIP().toString()); display.setCursor(10 / 2, 240 / 2); display.print("WiFi"); display.drawLine(0, 203 / 2, 600 / 2, 203/ 2, GxEPD_BLACK); Serial.println(); delay(1000); display.setTextColor(GxEPD_BLACK); } //ikona baterie void Battery(int x, int y, int scale, int percent) { int linesize = 2; //display.print("Hello"); display.fillRect(x, y, scale*9, linesize+5*scale, GxEPD_BLACK); display.fillRect(x + linesize, y + linesize, scale*7.8,linesize+3.8*scale, GxEPD_WHITE); display.fillRect(x + 9*scale, y + linesize*scale/1.3, scale * 1, linesize+scale*2, GxEPD_BLACK); // if (percent >= 12.5) display.fillRect(x+linesize+scale*0.8,y+linesize*scale/1.3,scale*1,linesize*scale*1.7, GxEPD_BLACK); if (percent >= 12.5) display.fillRect(x+linesize+scale*0.8,y+linesize*scale/1.3,scale*1,linesize*scale*1.7, (percent<25?GxEPD_RED:GxEPD_BLACK)); if (percent >= 25) display.fillRect(x+linesize+scale*2.5,y+linesize*scale/1.3,scale*1,linesize*scale*1.7, GxEPD_BLACK); if (percent >= 50) display.fillRect(x+linesize+scale*4.3,y+linesize*scale/1.3,scale*1,linesize*scale*1.7, GxEPD_BLACK); if (percent >= 75) display.fillRect(x+linesize+scale*5.8,y+linesize*scale/1.3,scale*1,linesize*scale*1.7, GxEPD_BLACK); } void DisplayDegree(int x, int y){ display.drawCircle(x,y,3,GxEPD_BLACK); display.drawCircle(x,y,2,GxEPD_BLACK); } //ikona WiFi void RSSI(int x, int y, int rssi){ int WIFIsignal = 0; for (int _rssi = -100; _rssi <= rssi; _rssi = _rssi + 20) { if (_rssi <= -20) WIFIsignal = 12; // -0dbm displays 5-bars if (_rssi <= -40) WIFIsignal = 10; // -40dbm to -21dbm displays 4-bars if (_rssi <= -60) WIFIsignal = 8; // -60dbm to -41dbm displays 3-bars if (_rssi <= -80) WIFIsignal = 6; // -80dbm to -61dbm displays 2-bars if (_rssi <= -100) WIFIsignal = 4; // -100dbm to -81dbm displays 1-bar int start_angle = -40; // Arc size left int end_angle = 40; // Arc size right for (int i = start_angle; i < end_angle; i = i +1) { display.drawPixel(x + cos((i-90)*3.14/180) * WIFIsignal*1.6, y + sin((i-90)*3.14/180) * WIFIsignal*1.6, GxEPD_BLACK); display.drawPixel(x + cos((i-90)*3.14/180) * WIFIsignal*1.6, y+1 + sin((i-90)*3.14/180) * WIFIsignal*1.6, GxEPD_BLACK); } } display.fillCircle(x,y,2,GxEPD_BLACK); }