На платформе NodeMcu v3 (ESP-12E) на основе микроконтроллера ESP8266 можно создать простую погодную станцию. Погодная станция не содержит ни каких датчиков кроме модуля часов реального времени DS3231 (ZS-042), всю информацию погодная станция запрашивает с сайта https://export.yandex.ru, делая каждые полчаса GET запрос на страницу — https://export.yandex.ru/bar/reginfo.xml?region=xx, где хх — номер региона. Информацию о номере региона можно взять — https://yandex.ru/pogoda/omsk/informer из кода информера:
Погодная станция выводит на цветной TFT-дисплей SPI 320×240 следующую информацию:
- Текущее время (ds3231)
- День недели, дата, месяц, год (ds3231)
- Температура в помещении (ds3231)
- Температура на улице (Интернет)
- Давление (мм.рт.ст) (Интернет)
- Влажность (Интернет)
- Скорость ветра (Интернет)
- Время восхода солнца (Интернет)
- Время заката солнца (Интернет)
- Время прогноза
Самая нижняя строка показывает кол-во запросов в серверу погоды с момента включения.
Для нормальной работы погодной станции необходимо указать в скетче свой логин и пароль Wi-Fi сети, а так же указать свой номер региона.
const char* ssid = «логин»;
const char* password = «пароль»;
Link = «/bar/reginfo.xml?region=xx»; // где хх — номер региона
Для работы с NodeMcu v3 (ESP-12E) в среде Arduino IDE ознакомьтесь с статьей — http://rcl-radio.ru/?p=48790
Библиотеки:
Подключение:
- DS3231 …….. SCL SDA — D1 D2
- TFT ………….. SDI (MOSI), SCK, CS, RESET, DC == GPIO 13, 14, 15, 0, 12 == D7 D5 D8 D3 D6 (LED и VCC +3.3 В, остальные выводы TFT подсоединяются к плате NodeMcu напрямую без делителей напряжения)
#include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <Wire.h> #include <UTFT.h> #include <SPI.h> #include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip DS3231 vrem;// Связываем объект clock с библиотекой DS3231 RTCDateTime DateTime;// Определяем сущность структуры RTCDateTime (описанной в библиотеке DS3231) для хранения считанных с часов даты и времени extern uint8_t BigFont[],SmallFont[]; UTFT myGLCD ( ILI9341_S5P, 13, 14, 15, 0, 12 );//SDI (MOSI), SCK, CS, RESET, DC == D7 D5 D8 D3 D6 const char* ssid = "Keenetic-9009"; const char* password = "32481975"; char host[] = "export.yandex.ru"; const int port = 443; const char fingerprint[] PROGMEM = "F3 DB F7 38 AA 71 13 15 1E E8 53 FC 0F 29 8C AB 3D F4 80 9F"; int w=1,i,w1=1,y,y01,y02; unsigned long times; String line; String Link; void setup ( ) { Wire.begin(); vrem.begin();// Инициализируем работу с объектом библиотеки DS3231 myGLCD.InitLCD(0);myGLCD.fillRect(0,0,320,240);myGLCD.setFont(BigFont);myGLCD.clrScr();myGLCD.setColor(0,0,0); // первоначальные настройки экрана // myGLCD.setBrightness(16);myGLCD.setContrast(64); // vrem.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча Serial.begin(9600); delay(1000); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) {delay(1000); myGLCD.setColor(0xffff);myGLCD.print("Connecting...",0,0);} myGLCD.print(ssid,0,15);Serial.print("IP address: ");Serial.println(WiFi.localIP());delay(3000); myGLCD.fillScr(0x0000);myGLCD.setColor(0x0000);myGLCD.setBackColor(0x0000); } void loop(){ to_Timer();delay(100); if(DateTime.minute==0&&DateTime.second==0||DateTime.minute==30&&DateTime.second==0||w==1){ i++; WiFiClientSecure client; Serial.printf("Using fingerprint '%s'\n", fingerprint); client.setFingerprint(fingerprint); client.setTimeout(1000); // 5 Seconds delay(1000); while((!client.connect(host, port))){delay(100);} Link = "/bar/reginfo.xml?region=66"; client.print(String("GET ") + Link + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");Serial.println("request sent");delay(1000); while (client.connected()) {String line = client.readStringUntil('\n');if (line == "\r") {Serial.println("headers received");break;}} delay(1000);while (client.available()) {line = client.readStringUntil('\r'); myGLCD.setColor(0xffff); int a;a =line.indexOf("<temperature class"); myGLCD.print("TEMP_2",10,90);myGLCD.printNumI(line.substring(a+45, a+90).toInt(),130,90,2);myGLCD.print("C",200,90); myGLCD.drawLine(5,115,235,115); a =line.indexOf("<torr>"); myGLCD.setColor(0xfdfd);myGLCD.print("Pressure",10,125);myGLCD.setColor(0xffff);myGLCD.printNumI(line.substring(a+6, a+15).toInt(),170,125,3);//myGLCD.print("C",200,125); a =line.indexOf("<dampness>"); myGLCD.setColor(0xcdcd);myGLCD.print("Dampness",10,150);myGLCD.setColor(0xffff);myGLCD.printNumI(line.substring(a+10, a+15).toInt(),155,150,3);myGLCD.print("%",200,150); a =line.indexOf("<wind_speed>"); myGLCD.setColor(0xeded);myGLCD.print("Wind_sp",10,175);myGLCD.setColor(0xffff);myGLCD.printNumI(line.substring(a+12, a+15).toInt(),140,175,2);myGLCD.print("m/s",180,175); a =line.indexOf("<sun_rise>"); myGLCD.setColor(0xdddd);myGLCD.print("Sunrise",10,200);myGLCD.setColor(0xffff);myGLCD.print(line.substring(a+10, a+15),145,200,0); a =line.indexOf("<sunset>"); myGLCD.setColor(0xdddd);myGLCD.print("Sunset",10,225);myGLCD.setColor(0xffff);myGLCD.print(line.substring(a+8, a+13),145,225,0); a =line.indexOf("<observation>"); myGLCD.setFont(SmallFont);myGLCD.setColor(0xbbbb);myGLCD.setColor(0xffff);myGLCD.print(line.substring(a+13, a+32),CENTER,255,0); myGLCD.setColor(0xffff); myGLCD.drawLine(5,280,235,280); myGLCD.setFont(SmallFont); myGLCD.setColor(0xf000);myGLCD.print("pogoda.yandex.ru",CENTER,285); myGLCD.setColor(0xcdcd);myGLCD.print("Number of requests",30,300);myGLCD.printNumI(i,200,300); }}w=0; }//loop void to_Timer(){ DateTime = vrem.getDateTime(); // Считываем c часов текущие значения даты и времени в сущность DateTime myGLCD.setFont(BigFont);myGLCD.setColor(0xffff); if(DateTime.hour<10){myGLCD.printNumI(0,57,10);y02=15;} else{y02=0;}myGLCD.printNumI(DateTime.hour, 57+y02, 10);myGLCD.print(":", 90, 10,0); // минуты if(DateTime.minute<10){myGLCD.printNumI(0,105,10);y01=15;} else{y01=0;}myGLCD.printNumI(DateTime.minute, 105+y01, 10);myGLCD.print(":", 135, 10,0); //секунды if(DateTime.second<10){myGLCD.printNumI(0,150,10);y=15;} else{y=0;}myGLCD.printNumI(DateTime.second, 150+y, 10); String time_d = vrem.dateFormat("D d M Y", DateTime); if(DateTime.second==0||w==1){myGLCD.setFont(SmallFont);myGLCD.setColor(0xcdcd);myGLCD.print(time_d, CENTER,35,0); myGLCD.setColor(0xffff);myGLCD.drawLine(5,55,235,55); myGLCD.setFont(BigFont);myGLCD.setColor(200,200,200);myGLCD.print("TEMP_1",10,65);myGLCD.printNumF(vrem.readTemperature(),1,130,65);myGLCD.print("C",200,65);} }
Различные цветовые решения
Секция setup()
myGLCD.fillScr(0x1010);myGLCD.setColor(0x0000);myGLCD.setBackColor(0x1010);// цвет фона
Русификация экрана
В папку с библиотекой New_UTFT вставить файл — RussianFonts и загрузите новый скетч — esp_rus_pogoda.zip