| Ваш IP: 3.235.66.217 | Online(66) - гости: 34, боты: 32 | Загрузка сервера: 0.31 ::::::::::::


Метеостанция 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 ознакомьтесь с статьей — https://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

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

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

Случайные статьи

  • Звуковое реле

    Схема звукового реле может работать от напряжения 5-12 В. При активации реле звуком оно будет отключатся через несколько секунд. При первом включении реле будет находиться под напряжением, из-за переходных процессов в С2, подождите несколько секунд, реле будет выключено. Вы можете увеличить или уменьшить время активации реле изменив значение C2. Не …Подробнее...
  • Преобразователь 12В>24В

    Преобразователь 12В>24В

    На рисунке показана схема простого преобразователя (DC) напряжения питающегося от напряжения 12В, выходное напряжение преобразователя 24В при максимальном токе нагрузки 800мА. При помощи резистора R6 можно установить выходное напряжение. L1 выполнена на ферритовом кольце 15*8*6 мм, катушка содержит 60 витков провода диаметром 0,63 мм. Для транзистора VT1 необходим небольшой радиатор. …Подробнее...
  • Нормирующий усилитель на дискретных элементах

    Нормирующий усилитель на дискретных элементах

    Нормирующий усилитель на дискретных элементах с большим динамическим диапазоном. Чтобы получить более качественные параметры, когда нет специализированных микросхем, нормирующий усилитель можно выполнить на базе дискретных компонентов. Он имеет следующие основные технические характеристики: Входное напряжение: номинальное ……….. 0,1 В максимальное………… 1,8 В Выходное напряжение: номинальное . ……….. 0,8 В максимальное………… 14 …Подробнее...
  • Высококачественный предварительный усилитель

    Высококачественный предварительный усилитель

    Характеристики: Коэффициент гармоник в диапазоне частот от 20 до 20000Гц не более 0,02% Отношение сигнал/шум -90дБ Диапазон регулировки громкости и тембра(60…16000Гц) соответственно 60 и +/-10дБ Переходное затухание между каналами в диапазоне частот 100…10000Гц не менее 50 дБ Входное и выходное сопротивление соответственно 220 и 3кОм Напряжение питания +/-5…16,5В Мостовой регулятор …Подробнее...
  • Автоматическое зарядное уст-во

    Автоматическое зарядное уст-во

    На рисунке показана схема автоматического зарядного уст-ва, которое позволяет заряжать автомобильный аккумулятор при разряде и прекращать зарядку при полном заряде аккумулятора. Такое уст-во желательно использовать для аккумуляторов которые находятся при длительном хранении. Переключение в режим заряда производится путем измерения напряжения на клеммах аккумулятора. Заряд начинается когда напряжение на клеммах аккумулятора …Подробнее...