// Simple sketch for reading data from the TMEP.cz (and write them on Serial and OLED display) // by mikrom (http://www.mikrom.cz) // http://wiki.tmep.cz/doku.php?id=zarizeni:esp8266 #include // WiFi library #include // JSON library #include // I2C communication library for OLED #include // Core graphics library for OLED #include // Hardware-specific library for OLED #define OLED_RESET BUILTIN_LED // Define settings const char* ssid = "---wifi ssid---"; // WiFi SSID const char* pass = "---wifi pass---"; // WiFi password const char* jsonurl = "---json url---"; // JSON's URL (ex. https://tmep.cz/vystup-json.php?id=xxx&export_key=xxxxxxxxxx const long sleep = 600000; // How often read data from the server. Default is 600000ms = 10 minute Adafruit_SSD1306 display(OLED_RESET); // Create OLED display class void setup() { // Start serial Serial.begin(115200); delay(10); Serial.println(); // OLED display display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Maybe change 0x3C to your address display.clearDisplay(); // Clear buffer display.setTextColor(WHITE); display.setTextSize(1); display.setCursor(0,0); display.println("TMEP.cz display"); display.println(); // Connect to the WiFi 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("."); display.print("."); display.display(); // We need update display after every dot } Serial.println(); display.println(); Serial.println("WiFi connected"); display.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); display.println("IP address:"); display.println(WiFi.localIP()); Serial.println(); display.display(); // Update display delay(10000); } void loop() { // OLED display display.clearDisplay(); display.setTextColor(WHITE); display.drawRoundRect(1, 20, display.width()-2, display.height()-26, 3, WHITE); // Draw outline // Connect to the HOST and read data via GET method WiFiClient client; // Use WiFiClient class to create TCP connections const char* host = "tmep.cz"; const int httpPort = 80; 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"); return; } 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(); return; } } // 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"); return; } // This is how our JSON looks. You can read any value of parameters // { // "teplota": 24.87, // "vlhkost": null, // "cas": "2016-06-02 18:29:45", // "umisteni": "Trutnov" // } String cas = root["cas"]; // Get value of "cas" Serial.print("cas: "); Serial.println(cas); display.setTextSize(1); display.setCursor(30,0); display.print("Last update"); display.setCursor(6,10); display.print(cas); float teplota = root["teplota"]; // Get value of "teplota" display.setTextSize(4); display.setCursor(6,25); 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(3); display.setCursor(105, 25); display.print(char(247)); // (Ugly) Degree symbol ° (but smaller not so bad) } //String vlhkost = root["vlhkost"]; // Get value of "vlhkost" //String umisteni = root["umisteni"]; // Get value of "umisteni" display.display(); // Update display Serial.println(); // Wait for another round delay(sleep); }