1

Тема: Wi-Fi метеостанция (рус)

http://forum.rcl-radio.ru/uploads/images/2019/09/1a780f2db673f98cd8ce20d7c7b474b4.png

Основная статья - https://rcl-radio.ru/?p=66004

Данный контент доступен только зарегистрированным пользователям.


#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) для хранения считанных с часов даты и времени

 UTFT myGLCD ( ILI9341_S5P, 13, 14, 15, 0, 12 );//SDI (MOSI), SCK, CS, RESET, DC == D7 D5 D8 D3 D6
 extern uint8_t SmallRusFont[];
 extern uint8_t BigRusFont[];
const uint8_t utf8_rus_charmap[] PROGMEM = {'A',128,'B',129,130,'E',131,132,133,134,135,'K',136,'M','H','O',137,'P','C','T',138,139,'X',140,141,
142,143,144,145,146,147,148,149,'a',150,151,152,153,'e',154,155,156,157,158,159,160,161,162,'o',163,'p','c',164,'y',165,'x',166,167,168,169,170,
171,172,173,174,175};
char * den[7] = {"ПОН","ВТР","СРД","ЧЕТ","ПЯТ","СУБ","ВСК"};
char * mes[12] = {"ЯНВАРЯ","ФЕВРАЛЯ","МАРТА","АПРЕЛЯ","МАЯ","ИЮНЯ","ИЮЛЯ","АВГУСТА","СЕНТЯБРЯ","ОКТЯБРЯ","НОЯБРЯ","ДЕКАБРЯ"};

 
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(BigRusFont);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);printRus(myGLCD,"Connecting...",0,0,0);}
 //   printRus(myGLCD,ssid,0,15,0);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");
         printRus(myGLCD,"Темп_2",10,90,0);myGLCD.printNumI(line.substring(a+45, a+90).toInt(),130,90,2);printRus(myGLCD,"C",200,90,0);
 
         myGLCD.drawLine(5,115,235,115);
 
         a =line.indexOf("<torr>"); 
         myGLCD.setColor(0xfdfd);printRus(myGLCD,"Давление",10,125,0);myGLCD.setColor(0xffff);myGLCD.printNumI(line.substring(a+6, a+15).toInt(),170,125,3);//printRus(myGLCD,"C",200,125,0);
 
         a =line.indexOf("<dampness>"); 
         myGLCD.setColor(0xcdcd);printRus(myGLCD,"Влажность",10,150,0);myGLCD.setColor(0xffff);myGLCD.printNumI(line.substring(a+10, a+15).toInt(),155,150,3);printRus(myGLCD,"%",200,150,0);
 
         a =line.indexOf("<wind_speed>"); 
         myGLCD.setColor(0xeded);printRus(myGLCD,"Скор.ветра",10,175,0);myGLCD.setColor(0xffff);myGLCD.printNumI(line.substring(a+12, a+15).toInt(),140,175,2);printRus(myGLCD,"м/с",180,175,0);
 
         a =line.indexOf("<sun_rise>"); 
         myGLCD.setColor(0xdddd);printRus(myGLCD,"Восход",10,200,0);myGLCD.setColor(0xffff);myGLCD.print(line.substring(a+10, a+15),145,200,0);
 
         a =line.indexOf("<sunset>"); 
         myGLCD.setColor(0xdddd);printRus(myGLCD,"Закат",10,225,0);myGLCD.setColor(0xffff);myGLCD.print(line.substring(a+8, a+13),145,225);
 
         a =line.indexOf("<observation>"); 
         myGLCD.setFont(SmallRusFont);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(SmallRusFont);
         myGLCD.setColor(0xf000);printRus(myGLCD,"pogoda.yandex.ru",CENTER,285,0);
         myGLCD.setColor(0xcdcd);printRus(myGLCD,"Количество запросов",20,300,0);myGLCD.printNumI(i,200,300);
  }}w=0;
  }//loop
 
 void to_Timer(){
       DateTime = vrem.getDateTime();   // Считываем c часов текущие значения даты и времени в сущность DateTime
       myGLCD.setFont(BigRusFont);myGLCD.setColor(0xffff);
 
       if(DateTime.hour<10){myGLCD.printNumI(0,57,10);y02=15;}
       else{y02=0;}myGLCD.printNumI(DateTime.hour, 57+y02, 10);printRus(myGLCD,":", 90, 10,0);
       // минуты
       if(DateTime.minute<10){myGLCD.printNumI(0,105,10);y01=15;}
       else{y01=0;}myGLCD.printNumI(DateTime.minute, 105+y01, 10);printRus(myGLCD,":", 135, 10,0);
       //секунды
       if(DateTime.second<10){myGLCD.printNumI(0,150,10);y=15;}
       else{y=0;}myGLCD.printNumI(DateTime.second, 150+y, 10);
       
       if(DateTime.second==0||w==1){myGLCD.setFont(SmallRusFont);myGLCD.setColor(0xcdcd);printRus(myGLCD,den[DateTime.dayOfWeek-1], 50,35,0);
       myGLCD.setColor(0xcdcd);myGLCD.printNumI(DateTime.day, 95,35,2);
       myGLCD.setColor(0xcdcd);printRus(myGLCD,mes[DateTime.month-1], 130,35,0);
       
       
       myGLCD.setColor(0xffff);myGLCD.drawLine(5,55,235,55);  
       myGLCD.setFont(BigRusFont);myGLCD.setColor(200,200,200);printRus(myGLCD,"Темп_1",10,65,0);myGLCD.printNumF(vrem.readTemperature(),1,130,65);printRus(myGLCD,"C",200,65,0);}
  }

  void printRus(UTFT rus,char *st, int x, int y_r, int deg){
 int stl, i_r;
 stl = strlen(st);
 if (rus.orient==PORTRAIT){
    if (x==RIGHT) x=(rus.disp_x_size+1)-(stl*rus.cfont.x_size);
    if (x==CENTER) x=((rus.disp_x_size+1)-(stl*rus.cfont.x_size))/2;
 } else {
  if (x==RIGHT) x=(rus.disp_y_size+1)-(stl*rus.cfont.x_size);
  if (x==CENTER) x=((rus.disp_y_size+1)-(stl*rus.cfont.x_size))/2;
 }
 uint8_t utf_high_byte = 0;
 uint8_t ch, ch_pos = 0;
 for (i_r = 0; i_r < stl; i_r++) {
  ch = st[i_r];
   if ( ch >= 128) {
     if ( utf_high_byte == 0 && (ch ==0xD0 || ch == 0xD1)) {
         utf_high_byte = ch;
      continue;
     } else {
     if ( utf_high_byte == 0xD0) {
    if (ch == 0x81) { //Ё
      ch = 6;
    } else {
    if(ch <= 0x95) {
       ch -= 0x90;
    } else if( ch < 0xB6){
    ch -= (0x90 - 1);
    } else {
    ch -= (0x90 - 2);
    }}
    ch = pgm_read_byte(utf8_rus_charmap + ch);
    } else if (utf_high_byte == 0xD1) {
           if (ch == 0x91) {//ё
           ch = 39;
       } else {
        ch -= 0x80;
        ch += 50;
       }
           ch = pgm_read_byte(utf8_rus_charmap + ch);
    }
    utf_high_byte = 0;
   }
   } else {
     utf_high_byte = 0;
     }
     if (deg==0) {rus.printChar(ch, x + (ch_pos * (rus.cfont.x_size)), y_r);} else {
          rus.rotateChar(ch, x, y_r, ch_pos, deg);
        }
      ++ch_pos;
 }
};