#1 14-09-2022 00:24:32

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

NTP часы с прогнозом погоды OpenWeather на VGA мониторе(ESP32).

Шрифты семисегментных часов, стырил тут.
https://github.com/maksimKorzh/esp32-fullscreen-clock

Не в сети

#2 14-09-2022 00:25:07

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: NTP часы с прогнозом погоды OpenWeather на VGA мониторе(ESP32).

#include "fabgl.h"
#define FABGL_FONT_INCLUDE_DEFINITION
#include "segment140.h"
#include <WiFi.h>
#include "time.h"
const char* ssid       = "*****";//Имя сети.
const char* password   = "*****";// Пароль сети.
const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 21600; // GMT+6 3600*6=21600 часовой пояс  Алтайского края
const int   daylightOffset_sec = 3600;
fabgl::VGAController DisplayController;
fabgl::Canvas        canvas(&DisplayController);
long unsigned lastNTPtime;
byte DayOfWeek;
/////////////////////////
void printLocalTime()
{ struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); 
  char date_buf[80];
 char dayweek[2];
 char MES[5];
 char DAY[5];
  strftime(date_buf,80,"%A,%B%d %Y", &timeinfo);
  strftime(dayweek,2,"%w", &timeinfo);
  strftime(MES,5,"%m", &timeinfo);
  strftime(DAY,5,"%d", &timeinfo);
  Serial.println(timeinfo.tm_sec);
 if (String(timeinfo.tm_sec)=="0"){
 canvas.setPenColor(Color::BrightGreen);
 canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(0));
  canvas.selectFont(&fabgl::FONT_Seven_Segment140);
canvas.drawTextFmt(0, -20, "%02d:%02d  ", timeinfo.tm_hour, timeinfo.tm_min);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(0));
canvas.setPenColor(Color::BrightYellow);
canvas.drawTextFmt(140, 80, "%s", DAY);  
  canvas.selectFont(&fabgl::FONT_8x8); 
  canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(1));
 if (String(dayweek)=="1") canvas.drawTextFmt(0, 100,"%s",ru("Понедельник"));
  if (String(dayweek)=="2") canvas.drawTextFmt(0, 100,"%s",ru("Вторник"));
  if (String(dayweek)=="3") canvas.drawTextFmt(0, 100,"%s",ru("Среда"));
  if (String(dayweek)=="4") canvas.drawTextFmt(0, 100,"%s",ru("Четверг"));
  if (String(dayweek)=="5") canvas.drawTextFmt(0, 100,"%s",ru("Пятница"));
  if (String(dayweek)=="6") canvas.drawTextFmt(0, 100,"%s",ru("Суббота"));
  if (String(dayweek)=="7") canvas.drawTextFmt(0, 100,"%s",ru("Воскресенье"));
  if (String(MES)=="09") canvas.drawTextFmt(0, 110,"%s",ru("Сентябрь "));
  if (String(MES)=="10") canvas.drawTextFmt(0, 110,"%s",ru("Октябрь"));
  if (String(MES)=="11") canvas.drawTextFmt(0, 110,"%s",ru("Ноябрь"));
  if (String(MES)=="12") canvas.drawTextFmt(0, 110,"%s",ru("Декабрь"));
  if (String(MES)=="1") canvas.drawTextFmt(0, 110,"%s",ru("Январь"));
  if (String(MES)=="2") canvas.drawTextFmt(0, 110,"%s",ru("Февраль"));
  if (String(MES)=="3") canvas.drawTextFmt(0, 110,"%s",ru("Март"));
  if (String(MES)=="4") canvas.drawTextFmt(0, 110,"%s",ru("Май"));
  if (String(MES)=="5") canvas.drawTextFmt(0, 110,"%s",ru("Июнь"));
  if (String(MES)=="6") canvas.drawTextFmt(0, 110,"%s",ru("Июль"));
  if (String(MES)=="7") canvas.drawTextFmt(0, 110,"%s",ru("Август"));
}
}
//////////////////////////////////////
// Начало функции обработки кириллических символов
#define maxString 40
char target[maxString + 1] = "";
char *ru(char *source)
{ int i,j,k;
  unsigned char n;
  char m[2] = { '0', '\0' };
  strcpy(target, ""); k = strlen(source); i = j = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; strcat(target, m);
    j++; if (j >= maxString) break;
  }
  return target;
}
// Конец функции обработки кириллических символов.
void setup()
{ 
  Serial.begin(115200);
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  } Serial.println(" CONNECTED");
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  delay(1000);
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
  delay(1000);
  DisplayController.begin();
  DisplayController.setResolution(VGA_320x200_75Hz);
  canvas.setBrushColor(RGB888(0, 0, 0));
  canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(0));
  canvas.selectFont(&fabgl::FONT_Seven_Segment140);
 canvas.setPenColor(Color::BrightGreen);
  canvas.clear();
///////////////////////////
 struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
  char date_buf[80];
 char dayweek[2];
 char MES[5];
 char DAY[5];
  strftime(date_buf,80,"%A,%B%d %Y", &timeinfo);
  strftime(dayweek,2,"%w", &timeinfo);
  strftime(MES,5,"%m", &timeinfo);
  strftime(DAY,5,"%d", &timeinfo);
  Serial.println(timeinfo.tm_sec);
canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(0));
canvas.selectFont(&fabgl::FONT_Seven_Segment140);
canvas.drawTextFmt(0, -20, "%02d:%02d  ", timeinfo.tm_hour, timeinfo.tm_min);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(0));
canvas.drawTextFmt(140, 80, "%s", DAY);  
  canvas.selectFont(&fabgl::FONT_8x8); 
  canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(1));
}
void loop()
{
 if (millis() - lastNTPtime >= 1000)
  {
 lastNTPtime= millis();
  printLocalTime();
  }
}

Не в сети

#3 14-09-2022 00:29:40

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: NTP часы с прогнозом погоды OpenWeather на VGA мониторе(ESP32).

16630901159673678198776351060302.jpg

1663090146497828729594524476127.jpg

Не в сети

#4 14-09-2022 00:32:50

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: NTP часы с прогнозом погоды OpenWeather на VGA мониторе(ESP32).

Для правильного отображения русских шрифтов, нужен мой модифицированный шрифт FONT_8x8.

Не в сети

#5 30-09-2022 08:38:00

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: NTP часы с прогнозом погоды OpenWeather на VGA мониторе(ESP32).

Добавил к часам прогноз погоды с OpenWeather.

16645018311961778232026280643.jpg
16645019036698325020275068968494.jpg

Не в сети

#6 30-09-2022 08:41:02

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: NTP часы с прогнозом погоды OpenWeather на VGA мониторе(ESP32).

Шрифт segmaent140.h должен лежать в папке скетча.
16645020212666507227655362120505.jpg

Не в сети

#7 30-09-2022 08:43:47

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: NTP часы с прогнозом погоды OpenWeather на VGA мониторе(ESP32).

#include "fabgl.h"
#define FABGL_FONT_INCLUDE_DEFINITION
#include "segment140.h"
#include <WiFi.h>
#include "time.h"
#include <JSON_Decoder.h>
#include <OpenWeather.h>
const char* ssid       = "***************";
const char* password   = "**************";
const char* ntpServer = "pool.ntp.org";
#define TIME_OFFSET 0UL * 3600UL // UTC + 0 hour
const long  gmtOffset_sec = 21600; // GMT+6
const int   daylightOffset_sec = 3600;
// OpenWeather API Details, replace x's with your API key
String api_key = "d828d2d63d3faed54e3e544352a3e4bb";
// Set both your longitude and latitude to at least 4 decimal places
String latitude =  "52.53639"; // Широта г.Бийска
String longitude = "85.2072200"; // Долгота г.Бийска
String units = "metric";  // Метрическая система
String language = "ru";   // Язык
// =========  User configured stuff ends here  =========
// =====================================================
OW_Weather ow; // Weather forecast library instance
tm timeinfo;
time_t now;
float i=0;
int i1=32;
float temp=-127;
unsigned long timer1; 
char a[30]="";
char PRESSURE[10]="";
char HUMIDITY[10]="";
char WIND[10]="";
char TEMP[10]="";
char TEMP1[10]="";
char TEMP2[10]="";
char TEMP3[10]="";
char TEMP4[10]="";
char TEMP5[10]="";
char str1[30]="";
char str2[50]="";
char str3[50]="";
char DATopW[30]="";
fabgl::VGAController DisplayController;
fabgl::Canvas        canvas(&DisplayController);
long unsigned lastNTPtime;
byte DayOfWeek;
/////////////////////////
void printLocalTime()
{ struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); 
  char date_buf[80];
 char dayweek[2];
 char MES[5];
 char DAY[5];
  strftime(date_buf,80,"%A,%B%d %Y", &timeinfo);
  strftime(dayweek,2,"%w", &timeinfo);
  strftime(MES,5,"%m", &timeinfo);
  strftime(DAY,5,"%d", &timeinfo);
  Serial.println(timeinfo.tm_sec);
 if (String(timeinfo.tm_min)=="59") printCurrentWeather();
 if (String(timeinfo.tm_sec)=="0"){
 canvas.setPenColor(Color::BrightGreen);
 canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(0));
  canvas.selectFont(&fabgl::FONT_Seven_Segment140);
canvas.drawTextFmt(20, -20, "%02d:%02d  ", timeinfo.tm_hour, timeinfo.tm_min);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(0));
canvas.setPenColor(Color::BrightYellow);
canvas.drawTextFmt(185, 80, "%s", DAY);  
  canvas.selectFont(&fabgl::FONT_8x8); 
  canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(1));
 if (String(dayweek)=="1") canvas.drawTextFmt(30, 102,"%s",ru("Понедельник"));
  if (String(dayweek)=="2") canvas.drawTextFmt(30, 102,"%s",ru("Вторник"));
  if (String(dayweek)=="3") canvas.drawTextFmt(30, 102,"%s",ru("Среда"));
  if (String(dayweek)=="4") canvas.drawTextFmt(30, 102,"%s",ru("Четверг"));
  if (String(dayweek)=="5") canvas.drawTextFmt(30, 102,"%s",ru("Пятница"));
  if (String(dayweek)=="6") canvas.drawTextFmt(30, 102,"%s",ru("Суббота"));
  if (String(dayweek)=="7") canvas.drawTextFmt(30, 102,"%s",ru("Воскресенье"));
  
  if (String(MES)=="1") canvas.drawTextFmt(30, 110,"%s",ru("Январь"));
  if (String(MES)=="2") canvas.drawTextFmt(30, 110,"%s",ru("Февраль"));
  if (String(MES)=="3") canvas.drawTextFmt(30, 110,"%s",ru("Март"));
  if (String(MES)=="4") canvas.drawTextFmt(30, 110,"%s",ru("Апрель"));
  if (String(MES)=="5") canvas.drawTextFmt(30, 110,"%s",ru("Май"));
  if (String(MES)=="6") canvas.drawTextFmt(30, 110,"%s",ru("Июнь"));
  if (String(MES)=="7") canvas.drawTextFmt(30, 110,"%s",ru("Июль"));
  if (String(MES)=="8") canvas.drawTextFmt(30, 110,"%s",ru("Август"));
  if (String(MES)=="09") canvas.drawTextFmt(30, 110,"%s",ru("Сентябрь "));
  if (String(MES)=="10") canvas.drawTextFmt(0, 110,"%s",ru("Октябрь"));
  if (String(MES)=="11") canvas.drawTextFmt(0, 110,"%s",ru("Ноябрь"));
  if (String(MES)=="12") canvas.drawTextFmt(0, 110,"%s",ru("Декабрь"));
 canvas.setPenColor(Color::Green);
 canvas.drawTextFmt(0, 130,"%s%c%s",TEMP,191,"C");
 canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(0));
 canvas.drawTextFmt(0, 120,"%s",ru("Температура OpenWeather."));
canvas.setPenColor(Color::BrightYellow);
canvas.drawTextFmt(0, 140,"%s",ru("Прогноз на 5 часов."));
canvas.drawTextFmt(0, 150,"%s%c%s",TEMP1,191,"C");
canvas.drawTextFmt(0, 160,"%s%c%s",TEMP2,191,"C");
canvas.drawTextFmt(0, 170,"%s%c%s",TEMP3,191,"C");
canvas.drawTextFmt(0, 180,"%s%c%s",TEMP4,191,"C");
canvas.drawTextFmt(0, 190,"%s%c%s",TEMP5,191,"C");
}
}
//////////////////////////////////////
// Начало функции обработки кириллических символов
#define maxString 40
char target[maxString + 1] = "";
char *ru(char *source)
{ int i,j,k;
  unsigned char n;
  char m[2] = { '0', '\0' };
  strcpy(target, ""); k = strlen(source); i = j = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; strcat(target, m);
    j++; if (j >= maxString) break;
  }
  return target;
}
// Конец функции обработки кириллических символов.
void setup()
{ 
  Serial.begin(115200);
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  } Serial.println(" CONNECTED");
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printCurrentWeather();
 // delay(1000);
//  printCurrentWeather();
  //WiFi.disconnect(true);
  //WiFi.mode(WIFI_OFF);
  delay(1000);
  DisplayController.begin();
  DisplayController.setResolution(VGA_320x200_75Hz);
  canvas.setBrushColor(RGB888(0, 0, 0));
  canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(0));
  canvas.selectFont(&fabgl::FONT_Seven_Segment140);
 canvas.setPenColor(Color::BrightGreen);
  canvas.clear();
canvas.selectFont(&fabgl::FONT_8x8); 
//for (int i = 0; i < 255; i++)
//    {canvas.drawTextFmt(0, i*8,"%s%c",i,i); }
//delay(10000);
///////////////////////////
 printLocalTime();
}
void loop()
{
 if (millis() - lastNTPtime >= 1000)
  {
 lastNTPtime= millis();
  printLocalTime();
  
  }
}
/////////////////////////////////////////////////////////////////////////////////////
/***************************************************************************************
**                          Send weather info to serial port
***************************************************************************************/
void printCurrentWeather()
{
// OW_Weather ow; 
  // Create the structures that hold the retrieved weather
  OW_current *current = new OW_current;
  OW_hourly *hourly = new OW_hourly;
  OW_daily  *daily = new OW_daily;

  Serial.print("\nRequesting weather information from OpenWeather... ");

  //On the ESP8266 (only) the library by default uses BearSSL, another option is to use AXTLS
  //For problems with ESP8266 stability, use AXTLS by adding a false parameter thus       vvvvv
  //ow.getForecast(current, hourly, daily, api_key, latitude, longitude, units, language, false);

  ow.getForecast(current, hourly, daily, api_key, latitude, longitude, units, language);

  Serial.println("Weather from Open Weather\n");

  // Position as reported by Open Weather
  Serial.print("Latitude            : "); Serial.println(ow.lat);
  Serial.print("Longitude           : "); Serial.println(ow.lon);
  // We can use the timezone to set the offset eventually...
  Serial.print("Timezone            : "); Serial.println(ow.timezone);
  Serial.println();

  if (current)
  {
    Serial.println("############### ТЕКУЩАЯ ПОГОДА ###############\n");
    strTimeNOW(current->dt);
    Serial.print("dt (time)        : "); Serial.print(strTime(current->dt));
    Serial.print("sunrise          : "); Serial.print(strTime(current->sunrise)); 
    Serial.print("sunset           : "); Serial.print(strTime(current->sunset));
    Serial.print("temp             : "); Serial.println(current->temp);
    sprintf(TEMP, "%s",String(current->temp));
    temp=current->temp;
    Serial.print("temp:::    "); Serial.println(temp);
    Serial.print("TEMP:    "); Serial.println(TEMP);
    Serial.print("feels_like       : "); Serial.println(current->feels_like);
    Serial.print("pressure/давление: "); Serial.println(current->pressure);
    sprintf(PRESSURE, "%s",String(current->pressure));
    Serial.print("humidity         : "); Serial.println(current->humidity);
    sprintf(HUMIDITY, "%s",String(current->humidity));
    Serial.print("dew_point        : "); Serial.println(current->dew_point);
    Serial.print("uvi              : "); Serial.println(current->uvi);
    Serial.print("clouds           : "); Serial.println(current->clouds);
    Serial.print("visibility       : "); Serial.println(current->visibility);
    Serial.print("wind_speed       : "); Serial.println(current->wind_speed);
    sprintf(WIND, "%s",String(current->wind_speed));
    Serial.print("wind_gust        : "); Serial.println(current->wind_gust);
    Serial.print("wind_deg         : "); Serial.println(current->wind_deg);
    Serial.print("rain             : "); Serial.println(current->rain);
    Serial.print("snow             : "); Serial.println(current->snow);
    Serial.println();
    Serial.print("id               : "); Serial.println(current->id);
    Serial.print("main             : "); Serial.println(current->main);
    Serial.print("description      : "); Serial.println(current->description);
    Serial.print("icon             : "); Serial.println(current->icon);

    Serial.println();
  }

  if (hourly)
  {
    Serial.println("############### ПОЧАСОВАЯ ПОГОДА ###############\n");
    for (int i = 0; i < MAX_HOURS; i++)
    {
      Serial.print("Hourly summary  "); if (i < 10) Serial.print(" "); Serial.print(i);
      Serial.println();
      Serial.print("dt (time)        : "); Serial.print(strTime(hourly->dt[i]));
      Serial.print("temp             : "); Serial.println(hourly->temp[i]);
      if (i==0) sprintf(TEMP1, "%s",String(hourly->temp[i]));
      if (i==1) sprintf(TEMP2, "%s",String(hourly->temp[i]));
      if (i==2) sprintf(TEMP3, "%s",String(hourly->temp[i]));
      if (i==3) sprintf(TEMP4, "%s",String(hourly->temp[i]));
      if (i==4) sprintf(TEMP5, "%s",String(hourly->temp[i]));
      Serial.print("feels_like       : "); Serial.println(hourly->feels_like[i]);
      Serial.print("pressure         : "); Serial.println(hourly->pressure[i]);
      Serial.print("humidity         : "); Serial.println(hourly->humidity[i]);
      Serial.print("dew_point        : "); Serial.println(hourly->dew_point[i]);
      Serial.print("clouds           : "); Serial.println(hourly->clouds[i]);
      Serial.print("wind_speed       : "); Serial.println(hourly->wind_speed[i]);
      Serial.print("wind_gust        : "); Serial.println(hourly->wind_gust[i]);
      Serial.print("wind_deg         : "); Serial.println(hourly->wind_deg[i]);
      Serial.print("rain             : "); Serial.println(hourly->rain[i]);
      Serial.print("snow             : "); Serial.println(hourly->snow[i]);
      Serial.println();
      Serial.print("id               : "); Serial.println(hourly->id[i]);
      Serial.print("main             : "); Serial.println(hourly->main[i]);
      Serial.print("description      : "); Serial.println(hourly->description[i]);
      Serial.print("icon             : "); Serial.println(hourly->icon[i]);
      Serial.print("pop              : "); Serial.println(hourly->pop[i]);

      Serial.println();
    }
  }

  if (daily)
  {
    Serial.println("###############  Daily weather  ###############\n");
    for (int i = 0; i < MAX_DAYS; i++)
    {
      Serial.print("Daily summary   "); if (i < 10) Serial.print(" "); Serial.print(i);
      Serial.println();
      Serial.print("dt (time)        : "); Serial.print(strTime(daily->dt[i]));
      Serial.print("sunrise          : "); Serial.print(strTime(daily->sunrise[i]));
      Serial.print("sunset           : "); Serial.print(strTime(daily->sunset[i]));

      Serial.print("temp.morn        : "); Serial.println(daily->temp_morn[i]);
      Serial.print("temp.day         : "); Serial.println(daily->temp_day[i]);
      Serial.print("temp.eve         : "); Serial.println(daily->temp_eve[i]);
      Serial.print("temp.night       : "); Serial.println(daily->temp_night[i]);
      Serial.print("temp.min         : "); Serial.println(daily->temp_min[i]);
      Serial.print("temp.max         : "); Serial.println(daily->temp_max[i]);

      Serial.print("feels_like.morn  : "); Serial.println(daily->feels_like_morn[i]);
      Serial.print("feels_like.day   : "); Serial.println(daily->feels_like_day[i]);
      Serial.print("feels_like.eve   : "); Serial.println(daily->feels_like_eve[i]);
      Serial.print("feels_like.night : "); Serial.println(daily->feels_like_night[i]);

      Serial.print("pressure         : "); Serial.println(daily->pressure[i]);
      Serial.print("humidity         : "); Serial.println(daily->humidity[i]);
      Serial.print("dew_point        : "); Serial.println(daily->dew_point[i]);
      Serial.print("uvi              : "); Serial.println(daily->uvi[i]);
      Serial.print("clouds           : "); Serial.println(daily->clouds[i]);
      Serial.print("visibility       : "); Serial.println(daily->visibility[i]);
      Serial.print("wind_speed       : "); Serial.println(daily->wind_speed[i]);
      Serial.print("wind_gust        : "); Serial.println(daily->wind_gust[i]);
      Serial.print("wind_deg         : "); Serial.println(daily->wind_deg[i]);
      Serial.print("rain             : "); Serial.println(daily->rain[i]);
      Serial.print("snow             : "); Serial.println(daily->snow[i]);
      Serial.println();
      Serial.print("id               : "); Serial.println(daily->id[i]);
      Serial.print("main             : "); Serial.println(daily->main[i]);
      Serial.print("description      : "); Serial.println(daily->description[i]);
      Serial.print("icon             : "); Serial.println(daily->icon[i]);
      Serial.print("pop              : "); Serial.println(daily->pop[i]);

      Serial.println();
    }
  }

  // Delete to free up space and prevent fragmentation as strings change in length
  delete current;
  delete hourly;
  delete daily;
}
String strTime(time_t unixTime)
{
  unixTime += TIME_OFFSET;
 return ctime(&unixTime);
}
String strTimeNOW(time_t unixTime)
{
sprintf(DATopW, "%s",ctime(&unixTime));

}

Не в сети

#8 30-09-2022 09:01:03

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: NTP часы с прогнозом погоды OpenWeather на VGA мониторе(ESP32).

В коде есть мой API key. Пользуйтесь на здоровье. Только! Ребята, не шлите запросы каждую секунду. В коде, идёт запрос каждый час и этого вполне достаточно. Данные прогноза погоды, меняются не часто.

Не в сети

#9 30-09-2022 10:10:46

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: NTP часы с прогнозом погоды OpenWeather на VGA мониторе(ESP32).

Код довольно тяжёлый. Partition Scheme нужно выставить Huge APP.

16645073990507361704436687355334.jpg

Не в сети

#10 25-10-2022 21:30:04

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: NTP часы с прогнозом погоды OpenWeather на VGA мониторе(ESP32).

Добавил функцию выключения монитора на ночь(для мониторов с автоматическим режимом сна если изображение чёрный фон). Не на всех мониторах работает.

#include "fabgl.h"
#define FABGL_FONT_INCLUDE_DEFINITION
#include "segment140.h"
#include <WiFi.h>
#include "time.h"
#include <JSON_Decoder.h>
#include <OpenWeather.h>
const char* ssid       = "***";
const char* password   = "***";
const char* ntpServer = "pool.ntp.org";
#define TIME_OFFSET 0UL * 3600UL // UTC + 6 hour
const long  gmtOffset_sec = 21600; // GMT+6
const int   daylightOffset_sec = 3600;
// OpenWeather API Details, replace x's with your API key
String api_key = "d828d2d63d3faed54e3e544352a3e4bb";
// Set both your longitude and latitude to at least 4 decimal places
String latitude =  "52.53639"; // Широта г.Бийска
String longitude = "85.2072200"; // Долгота г.Бийска
String units = "metric";  // Метрическая система
String language = "ru";   // Язык
// =========  User configured stuff ends here  =========
// =====================================================
OW_Weather ow; // Weather forecast library instance
tm timeinfo;
time_t now;
float i=0;
int i1=32;
//float temp=-127;
unsigned long timer1; 
char a[30]="";
char PRESSURE[10]="";
char HUMIDITY[10]="";
char WIND[10]="";
int temp=-100;
char TEMP[10]="";
char TEMP1[10]="";
char TEMP2[10]="";
char TEMP3[10]="";
char TEMP4[10]="";
char TEMP5[10]="";
char CL[10]=" ";
char CL1[10]=" ";
char CL2[10]=" ";
char CL3[10]=" ";
char CL4[10]=" ";
char CL5[10]=" ";
char RA[10]=" ";
char RA1[10]=" ";
char RA2[10]=" ";
char RA3[10]=" ";
char RA4[10]=" ";
char RA5[10]=" ";
char SN[10]=" ";
char SN1[10]=" ";
char SN2[10]=" ";
char SN3[10]=" ";
char SN4[10]=" ";
char SN5[10]=" ";
char str1[30]="";
char str2[50]="";
char str3[50]="";
char DATopW[30]="";
char date_buf[80];
 char dayweek[2];
 char MES[5];
 char DAY[5];
char CHAS[5];
 char MIN[5];
byte noch=0;
fabgl::VGAController DisplayController;
fabgl::Canvas        canvas(&DisplayController);
long unsigned lastNTPtime;
byte DayOfWeek;
/////////////////////////
void printDisplay(){
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;  }
  strftime(date_buf,80,"%A,%B%d %Y", &timeinfo);
  canvas.setPenColor(Color::BrightGreen);
 canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(0));
  canvas.selectFont(&fabgl::FONT_Seven_Segment140);
canvas.drawTextFmt(20, -20, "%02d:%02d  ", timeinfo.tm_hour, timeinfo.tm_min);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(0));
canvas.setPenColor(Color::BrightYellow);
canvas.drawTextFmt(185, 80, "%s", DAY);  
  canvas.selectFont(&fabgl::FONT_8x8); 
  canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(1));
 if (String(dayweek)=="1") canvas.drawTextFmt(20, 102,"%s",ru("Понедельник"));
  if (String(dayweek)=="2") canvas.drawTextFmt(20, 102,"%s",ru("Вторник"));
  if (String(dayweek)=="3") canvas.drawTextFmt(20, 102,"%s",ru("Среда"));
  if (String(dayweek)=="4") canvas.drawTextFmt(20, 102,"%s",ru("Четверг"));
  if (String(dayweek)=="5") canvas.drawTextFmt(20, 102,"%s",ru("Пятница"));
  if (String(dayweek)=="6") canvas.drawTextFmt(20, 102,"%s",ru("Суббота"));
  if (String(dayweek)=="7") canvas.drawTextFmt(20, 102,"%s",ru("Воскресенье"));
  
  if (String(MES)=="1") canvas.drawTextFmt(20, 110,"%s",ru("Январь"));
  if (String(MES)=="2") canvas.drawTextFmt(20, 110,"%s",ru("Февраль"));
  if (String(MES)=="3") canvas.drawTextFmt(20, 110,"%s",ru("Март"));
  if (String(MES)=="4") canvas.drawTextFmt(20, 110,"%s",ru("Апрель"));
  if (String(MES)=="5") canvas.drawTextFmt(20, 110,"%s",ru("Май"));
  if (String(MES)=="6") canvas.drawTextFmt(20, 110,"%s",ru("Июнь"));
  if (String(MES)=="7") canvas.drawTextFmt(20, 110,"%s",ru("Июль"));
  if (String(MES)=="8") canvas.drawTextFmt(20, 110,"%s",ru("Август"));
  if (String(MES)=="09") canvas.drawTextFmt(20, 110,"%s",ru("Сентябрь "));
  if (String(MES)=="10") canvas.drawTextFmt(20, 110,"%s",ru("Октябрь"));
  if (String(MES)=="11") canvas.drawTextFmt(20, 110,"%s",ru("Ноябрь"));
  if (String(MES)=="12") canvas.drawTextFmt(20, 110,"%s",ru("Декабрь"));
 canvas.setPenColor(Color::Green);
 canvas.drawTextFmt(0, 130,"%s%c%s",TEMP,191,"C");
 canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(0));
 canvas.drawTextFmt(0, 120,"%s",ru("Температура OpenWeather."));
canvas.setPenColor(Color::BrightYellow);
canvas.drawTextFmt(0, 140,"%s",ru("Прогноз Обл. Осадки/мм"));
canvas.drawTextFmt(0, 150,"%s%c%s%s%s%s%s",TEMP1,191,"C ",CL1,"%",RA1,SN1);
canvas.drawTextFmt(0, 160,"%s%c%s%s%s%s%s",TEMP2,191,"C ",CL2,"%",RA2,SN2);
canvas.drawTextFmt(0, 170,"%s%c%s%s%s%s%s",TEMP3,191,"C ",CL3,"%",RA3,SN3);
canvas.drawTextFmt(0, 180,"%s%c%s%s%s%s%s",TEMP4,191,"C ",CL4,"%",RA4,SN4);
canvas.drawTextFmt(0, 190,"%s%c%s%s%s%s%s",TEMP5,191,"C ",CL5,"%",RA5,SN5);
}

void printLocalTime()
{ struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); 
  
  strftime(date_buf,80,"%A,%B%d %Y", &timeinfo);
  strftime(dayweek,2,"%w", &timeinfo);
  strftime(MES,5,"%m", &timeinfo);
  strftime(DAY,5,"%d", &timeinfo);
  strftime(CHAS,2,"%H", &timeinfo);
  strftime(MIN,2,"%M", &timeinfo);
  Serial.println(timeinfo.tm_sec);
 if(String(timeinfo.tm_hour)=="24" and noch==0){noch=1;}//время выключения монитора
 if (String(timeinfo.tm_hour)=="7" and noch!=0){noch=0;}//время включения монитора
 if (String(timeinfo.tm_min)=="59") printCurrentWeather();
 if (String(timeinfo.tm_sec)=="0" and noch==0){printDisplay();}
 if (noch==1){ canvas.clear(); noch=2;}
}
//////////////////////////////////////
// Начало функции обработки кириллических символов
#define maxString 40
char target[maxString + 1] = "";
char *ru(char *source)
{ int i,j,k;
  unsigned char n;
  char m[2] = { '0', '\0' };
  strcpy(target, ""); k = strlen(source); i = j = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; strcat(target, m);
    j++; if (j >= maxString) break;
  }
  return target;
}
// Конец функции обработки кириллических символов.
void setup()
{ 
   
  Serial.begin(115200);
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  } Serial.println(" CONNECTED");
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printCurrentWeather();
 // delay(1000);
//  printCurrentWeather();
  //WiFi.disconnect(true);
  //WiFi.mode(WIFI_OFF);
  delay(1000);
  DisplayController.begin();
  DisplayController.setResolution(VGA_320x200_75Hz);
  canvas.setBrushColor(RGB888(0, 0, 0));
  canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(0));
  canvas.selectFont(&fabgl::FONT_Seven_Segment140);
 canvas.setPenColor(Color::BrightGreen);
  canvas.clear();
canvas.selectFont(&fabgl::FONT_8x8); 
///////////////////////////
 printLocalTime();
printDisplay();
pinMode(25, OUTPUT);
// digitalWrite(25, HIGH);
 digitalWrite(25, LOW);
}
void loop()
{
 if (millis() - lastNTPtime >= 1000)
  {
 lastNTPtime= millis();
  printLocalTime();
  
  }
}
/////////////////////////////////////////////////////////////////////////////////////
/***************************************************************************************
**                          Send weather info to serial port
***************************************************************************************/
void printCurrentWeather()
{
char RA[10]=" ";
char RA1[10]=" ";
char RA2[10]=" ";
char RA3[10]=" ";
char RA4[10]=" ";
char RA5[10]=" ";
char SN[10]=" ";
char SN1[10]=" ";
char SN2[10]=" ";
char SN3[10]=" ";
char SN4[10]=" ";
char SN5[10]=" ";
// OW_Weather ow; 
  // Create the structures that hold the retrieved weather
  OW_current *current = new OW_current;
  OW_hourly *hourly = new OW_hourly;
  OW_daily  *daily = new OW_daily;

  Serial.print("\nRequesting weather information from OpenWeather... ");

  //On the ESP8266 (only) the library by default uses BearSSL, another option is to use AXTLS
  //For problems with ESP8266 stability, use AXTLS by adding a false parameter thus       vvvvv
  //ow.getForecast(current, hourly, daily, api_key, latitude, longitude, units, language, false);

  ow.getForecast(current, hourly, daily, api_key, latitude, longitude, units, language);

  Serial.println("Weather from Open Weather\n");

  // Position as reported by Open Weather
  Serial.print("Latitude            : "); Serial.println(ow.lat);
  Serial.print("Longitude           : "); Serial.println(ow.lon);
  // We can use the timezone to set the offset eventually...
  Serial.print("Timezone            : "); Serial.println(ow.timezone);
  Serial.println();

  if (current)
  {
    Serial.println("############### ТЕКУЩАЯ ПОГОДА ###############\n");
    strTimeNOW(current->dt);
    Serial.print("dt (time)        : "); Serial.print(strTime(current->dt));
    Serial.print("sunrise          : "); Serial.print(strTime(current->sunrise)); 
    Serial.print("sunset           : "); Serial.print(strTime(current->sunset));
    Serial.print("temp             : "); Serial.println(current->temp);
    sprintf(TEMP, "%s",String(current->temp));
//    sprintf(temp, "%c",current->temp);
    //temp=current->temp;
    Serial.print("temp:::    "); Serial.println(temp);
    Serial.print("TEMP:    "); Serial.println(TEMP);
    Serial.print("feels_like       : "); Serial.println(current->feels_like);
    Serial.print("pressure/давление: "); Serial.println(current->pressure);
    sprintf(PRESSURE, "%s",String(current->pressure));
    Serial.print("humidity         : "); Serial.println(current->humidity);
    sprintf(HUMIDITY, "%s",String(current->humidity));
    Serial.print("dew_point        : "); Serial.println(current->dew_point);
    Serial.print("uvi              : "); Serial.println(current->uvi);
    Serial.print("clouds           : "); Serial.println(current->clouds);
    sprintf(CL, "%s",String(current->clouds));
    Serial.print("visibility       : "); Serial.println(current->visibility);
    Serial.print("wind_speed       : "); Serial.println(current->wind_speed);
    sprintf(WIND, "%s",String(current->wind_speed));
    Serial.print("wind_gust        : "); Serial.println(current->wind_gust);
    Serial.print("wind_deg         : "); Serial.println(current->wind_deg);
    Serial.print("rain             : "); Serial.println(current->rain);
    Serial.print("snow             : "); Serial.println(current->snow);
    Serial.println();
    Serial.print("id               : "); Serial.println(current->id);
    Serial.print("main             : "); Serial.println(current->main);
    Serial.print("description      : "); Serial.println(current->description);
    Serial.print("icon             : "); Serial.println(current->icon);

    Serial.println();
  }

  if (hourly)
  {
    Serial.println("############### ПОЧАСОВАЯ ПОГОДА ###############\n");
    for (int i = 0; i < MAX_HOURS; i++)
    {
      Serial.print("Hourly summary  "); if (i < 10) Serial.print(" "); Serial.print(i);
      Serial.println();
      Serial.print("dt (time)        : "); Serial.print(strTime(hourly->dt[i]));
      Serial.print("temp             : "); Serial.println(hourly->temp[i]);
      if (i==0) sprintf(TEMP1, "%s",String(hourly->temp[i]));
      if (i==1) sprintf(TEMP2, "%s",String(hourly->temp[i]));
      if (i==2) sprintf(TEMP3, "%s",String(hourly->temp[i]));
      if (i==3) sprintf(TEMP4, "%s",String(hourly->temp[i]));
      if (i==4) sprintf(TEMP5, "%s",String(hourly->temp[i]));
      Serial.print("feels_like       : "); Serial.println(hourly->feels_like[i]);
      Serial.print("pressure         : "); Serial.println(hourly->pressure[i]);
      Serial.print("humidity         : "); Serial.println(hourly->humidity[i]);
      Serial.print("dew_point        : "); Serial.println(hourly->dew_point[i]);
      Serial.print("clouds           : "); Serial.println(hourly->clouds[i]);
      if (i==0) sprintf(CL1, "%s",String(hourly->clouds[i]));
      if (i==1) sprintf(CL2, "%s",String(hourly->clouds[i]));
      if (i==2) sprintf(CL3, "%s",String(hourly->clouds[i]));
      if (i==3) sprintf(CL4, "%s",String(hourly->clouds[i]));
      if (i==4) sprintf(CL5, "%s",String(hourly->clouds[i]));
      Serial.print("wind_speed       : "); Serial.println(hourly->wind_speed[i]);
      Serial.print("wind_gust        : "); Serial.println(hourly->wind_gust[i]);
      Serial.print("wind_deg         : "); Serial.println(hourly->wind_deg[i]);
      Serial.print("rain             : "); Serial.println(hourly->rain[i]);
      if (i==0 and String(hourly->rain[i])!="0.00") sprintf(RA1, "%s",String(hourly->rain[i])+ru("Дождь"));
      if (i==1 and String(hourly->rain[i])!="0.00") sprintf(RA2, "%s",String(hourly->rain[i])+ru("Дождь"));
      if (i==2 and String(hourly->rain[i])!="0.00") sprintf(RA3, "%s",String(hourly->rain[i])+ru("Дождь"));
      if (i==3 and String(hourly->rain[i])!="0.00") sprintf(RA4, "%s",String(hourly->rain[i])+ru("Дождь"));
      if (i==4 and String(hourly->rain[i])!="0.00") sprintf(RA5, "%s",String(hourly->rain[i])+ru("Дождь"));
      Serial.print("snow             : "); Serial.println(hourly->snow[i]);
      if (i==0 and String(hourly->snow[i])!="0.00") sprintf(SN1, "%s",String(hourly->snow[i])+ru("Снег"));
      if (i==1 and String(hourly->snow[i])!="0.00") sprintf(SN2, "%s",String(hourly->snow[i])+ru("Снег"));
      if (i==2 and String(hourly->snow[i])!="0.00") sprintf(SN3, "%s",String(hourly->snow[i])+ru("Снег"));
      if (i==3 and String(hourly->snow[i])!="0.00") sprintf(SN4, "%s",String(hourly->snow[i])+ru("Снег"));
      if (i==4 and String(hourly->snow[i])!="0.00") sprintf(SN5, "%s",String(hourly->snow[i])+ru("Снег"));
      
      Serial.println();
      Serial.print("id               : "); Serial.println(hourly->id[i]);
      Serial.print("main             : "); Serial.println(hourly->main[i]);
      Serial.print("description      : "); Serial.println(hourly->description[i]);
      Serial.print("icon             : "); Serial.println(hourly->icon[i]);
      Serial.print("pop              : "); Serial.println(hourly->pop[i]);

      Serial.println();
    }
  }

  if (daily)
  {
    Serial.println("###############  Daily weather  ###############\n");
    for (int i = 0; i < MAX_DAYS; i++)
    {
      Serial.print("Daily summary   "); if (i < 10) Serial.print(" "); Serial.print(i);
      Serial.println();
      Serial.print("dt (time)        : "); Serial.print(strTime(daily->dt[i]));
      Serial.print("sunrise          : "); Serial.print(strTime(daily->sunrise[i]));
      Serial.print("sunset           : "); Serial.print(strTime(daily->sunset[i]));

      Serial.print("temp.morn        : "); Serial.println(daily->temp_morn[i]);
      Serial.print("temp.day         : "); Serial.println(daily->temp_day[i]);
      Serial.print("temp.eve         : "); Serial.println(daily->temp_eve[i]);
      Serial.print("temp.night       : "); Serial.println(daily->temp_night[i]);
      Serial.print("temp.min         : "); Serial.println(daily->temp_min[i]);
      Serial.print("temp.max         : "); Serial.println(daily->temp_max[i]);

      Serial.print("feels_like.morn  : "); Serial.println(daily->feels_like_morn[i]);
      Serial.print("feels_like.day   : "); Serial.println(daily->feels_like_day[i]);
      Serial.print("feels_like.eve   : "); Serial.println(daily->feels_like_eve[i]);
      Serial.print("feels_like.night : "); Serial.println(daily->feels_like_night[i]);

      Serial.print("pressure         : "); Serial.println(daily->pressure[i]);
      Serial.print("humidity         : "); Serial.println(daily->humidity[i]);
      Serial.print("dew_point        : "); Serial.println(daily->dew_point[i]);
      Serial.print("uvi              : "); Serial.println(daily->uvi[i]);
      Serial.print("clouds           : "); Serial.println(daily->clouds[i]);
      Serial.print("visibility       : "); Serial.println(daily->visibility[i]);
      Serial.print("wind_speed       : "); Serial.println(daily->wind_speed[i]);
      Serial.print("wind_gust        : "); Serial.println(daily->wind_gust[i]);
      Serial.print("wind_deg         : "); Serial.println(daily->wind_deg[i]);
      Serial.print("rain             : "); Serial.println(daily->rain[i]);
      Serial.print("snow             : "); Serial.println(daily->snow[i]);
      Serial.println();
      Serial.print("id               : "); Serial.println(daily->id[i]);
      Serial.print("main             : "); Serial.println(daily->main[i]);
      Serial.print("description      : "); Serial.println(daily->description[i]);
      Serial.print("icon             : "); Serial.println(daily->icon[i]);
      Serial.print("pop              : "); Serial.println(daily->pop[i]);

      Serial.println();
    }
  }

  // Delete to free up space and prevent fragmentation as strings change in length
  delete current;
  delete hourly;
  delete daily;
}
String strTime(time_t unixTime)
{
  unixTime += TIME_OFFSET;
 return ctime(&unixTime);
}
String strTimeNOW(time_t unixTime)
{
sprintf(DATopW, "%s",ctime(&unixTime));

}

Не в сети

Подвал раздела

Работает на FluxBB (перевод Laravel.ru)