Метеостанция NodeMcu v3 (ESP-12E) + TFT 320×240 (Arduino)

На платформе 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

Добавить комментарий

Войти с помощью: