#1 30-10-2021 21:03:47

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

Часы ntp и прогноз погоды на VGA мониторе. ESP32 DEVKIT V1.

Код, в основном не мой. Компиляция моя.

Не в сети

#2 30-10-2021 21:05:23

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

Re: Часы ntp и прогноз погоды на VGA мониторе. ESP32 DEVKIT V1.

16356026832647175862351651993729.jpg

Не в сети

#3 30-10-2021 21:06:54

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

Re: Часы ntp и прогноз погоды на VGA мониторе. ESP32 DEVKIT V1.

1635602774706102695267255952517.jpg

Не в сети

#4 30-10-2021 21:08:51

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

Re: Часы ntp и прогноз погоды на VGA мониторе. ESP32 DEVKIT V1.

Прогноз погоды берётся с https://openweathermap.org/

Не в сети

#5 30-10-2021 21:12:35

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

Re: Часы ntp и прогноз погоды на VGA мониторе. ESP32 DEVKIT V1.

16356030637835271489066735345334.jpg

16356031256017072721676722560269.jpg

Не в сети

#6 30-10-2021 21:13:46

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

Re: Часы ntp и прогноз погоды на VGA мониторе. ESP32 DEVKIT V1.

Моя плата по мотивам Fabgl.

Не в сети

#7 30-10-2021 22:25:23

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

Re: Часы ntp и прогноз погоды на VGA мониторе. ESP32 DEVKIT V1.

Код.

#include <stdio.h>
#include "fabgl.h"
fabgl::VGAController DisplayController;
fabgl::Canvas        canvas(&DisplayController);
#define DOUBLEBUFFERING 1
#ifdef ESP8266
  #include <ESP8266WiFi.h>
  #include <WiFiClientSecure.h>
#else // ESP32
  #include <WiFi.h>
#endif
#include <JSON_Decoder.h>
#include <OpenWeather.h>
// Just using this library for unix time conversion
#include <Time.h>
char* time_output="";
char* lastNTPtime1="";
const char* NTP_SERVER = "ch.pool.ntp.org";
const char* TZ_INFO    = "MSK-6MSD,M3.5.0/2,M10.5.0/3";  //"MSK-6MSD,M3.5.0/2,M10.5.0/3"-ЧАСОВОЙ ПОЯС АЛТАЙСКОГО КРАЯ
// enter your time zone (https://remotemonitoringsystems.ca/time-zone-abbreviations.php)
tm timeinfo;
time_t now;
unsigned long timerSEC;
long unsigned lastNTPtime;
unsigned long lastEntryTime;
int  delayInMillis = 0;
int  idle = 0;
char hour[9]="";
char minute[9]="";
int hour1=0;
int Simvol=32;
char minute1=0;
char DATopW[30]="";
char simvol[1]="";
char DAT[2]="";
char MES[2]="";
char GOD[4]="";
char sec[2]="";
// =====================================================
// ========= User configured stuff starts here =========
// Further configuration settings can be found in the
// OpenWeather library "User_Setup.h" file
#define TIME_OFFSET 7UL * 3600UL // UTC + 7 hour
// Change to suit your WiFi router
#define WIFI_SSID     "Имя вашей сети"
#define WIFI_PASSWORD "Пароль"
// 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
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 str1[30]="";
char str2[50]="";
char str3[50]="";
//////////////////////////////////////
void setup() { 
DisplayController.begin();
DisplayController.setResolution(VGA_320x200_75Hz);
canvas.selectFont(&fabgl::FONT_std_24);
canvas.clear();
canvas.setPenColor(Color::Green);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(1));
canvas.drawTextFmt(0,10,"WiFi connecting" );
///////////////////////////////////
 Serial.begin(115200); // Fast to stop it holding up the stream
  Serial.printf("\n\nConnecting to %s\n", WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print("."); 
  }
  Serial.println();
  Serial.print("Connected\n");
if (WiFi.status() == WL_CONNECTED) {
 canvas.setPenColor(Color::Green);
  canvas.drawTextFmt(0, 180,"WiFi" );
}
  else
  {canvas.setPenColor(Color::Red);
  canvas.drawTextFmt(0, 180,"WiFi" );
  }
 printCurrentWeather(); 
////////////////////////time/////////////
 configTime(0, 0, NTP_SERVER);
  // See https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv for Timezone codes for your region
  setenv("TZ", TZ_INFO, 1);
  if (getNTPtime(10)) {  // wait up to 10sec to sync
  } else {
   Serial.println("Time not set");
 wifi();
  }
  showTime(&timeinfo);
  lastNTPtime = time(&now);
  lastEntryTime = millis();
 printVGA();
printVGAtime();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void wifi(){
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
   i=0;
  while (WiFi.status() != WL_CONNECTED) {
     i++;
     printVGA();
    canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(0));
     canvas.setPenColor(Color::Red);
      canvas.drawTextFmt(270, 180,"WiFi" );
      delay(1500);
      Serial.print(".");
  }
printVGA(); 
if (WiFi.status() == WL_CONNECTED) {
 printVGA();
  canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(0));
  canvas.setPenColor(Color::Green);
  canvas.drawTextFmt(270, 180,"WiFi" );
}
}
///////////////////////////////////////////////////////////////////////////////////
void printVGAtime(){
 canvas.selectFont(&fabgl::FONT_std_24);
 canvas.setPenColor(Color::Black);
canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(2));
canvas.drawTextFmt(0,142,"             ");
canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(3));
canvas.drawTextFmt(0,166,"              ");
canvas.setGlyphOptions(GlyphOptions().FillBackground(true).DoubleWidth(0));
canvas.drawTextFmt(0,180,"                                                           ");  
canvas.setPenColor(Color::Red);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(2));
canvas.drawTextFmt(0,142,hour);
canvas.drawTextFmt(60,142,":");    
canvas.drawTextFmt(80,142,minute);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(3));
canvas.drawTextFmt(0,166,hour);
canvas.drawTextFmt(60,166,":");    
canvas.drawTextFmt(80,166,minute);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(0));
canvas.drawTextFmt(0,180,str1);   
}
///////////////////////////////////////////////////////////////////////////////////
void printVGA(){
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(1));
  canvas.setBrushColor(Color::Black);
 canvas.clear();
 canvas.setPenColor(Color::Green);
canvas.drawTextFmt(0, 0,"T: " );
if (temp>=0) canvas.drawTextFmt(40, 0,"+" );// else canvas.drawTextFmt(40, 0,"-" );
canvas.drawTextFmt(90, 0,TEMP );
canvas.drawTextFmt(180, 0,"`C" );
canvas.setPenColor(Color::Yellow);
canvas.drawTextFmt(0, 20,"P: " );
canvas.drawTextFmt(40, 20,PRESSURE);
canvas.drawTextFmt(220, 20,"hPa" );
canvas.drawTextFmt(0, 40,"H: " );
canvas.drawTextFmt(40, 40,HUMIDITY);
canvas.drawTextFmt(0, 60,"W: " );
canvas.drawTextFmt(85, 60,WIND);
canvas.drawTextFmt(200, 60,"m/s" );
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(0));
canvas.drawTextFmt(0, 80,DATopW);
}
void loop() {
//////////////////////////////////////////////
if (millis() - timerSEC >= 60000)
  {
timerSEC= millis();
getNTPtime(10);
showTime(&timeinfo);
printVGAtime();
}
if (WiFi.status() == WL_CONNECTED) {
  canvas.setPenColor(Color::Green);
  canvas.drawTextFmt(270, 180,"WiFi" );
}
  else
  {canvas.setPenColor(Color::Red);
  canvas.drawTextFmt(270, 180,"WiFi" );
  delay(1500);
 wifi();
  }
if (millis() - timer1 > 300000)
  {
 timer1= millis();
 printCurrentWeather();
 printVGA();
  }
}
//////////////////////////////////
bool getNTPtime(int sec) {
  {
    uint32_t start = millis();
    do {
      time(&now);
      localtime_r(&now, &timeinfo);
      Serial.print(".");
      delay(10);
    } while (((millis() - start) <= (1000 * sec)) && (timeinfo.tm_year < (2016 - 1900)));
    if (timeinfo.tm_year <= (2016 - 1900)) return false;  // the NTP call was not successful
    Serial.print("now ");  Serial.println(now);
      char time_output[30];
    strftime(time_output, 30, "%a  %d-%m-%y %T", localtime(&now));
   sprintf(str1, "%s", time_output);
    Serial.println(time_output);
    Serial.println();
  }
  return true;
}
///////////////////////////
void showTime(tm *localTime) {
//
sprintf(hour, "%d",localTime->tm_hour);
sprintf(minute, "%d",localTime->tm_min);
if (localTime->tm_min<10) {
minute[1]=minute[0];
minute[0]=48;
}
if (localTime->tm_hour<10){
hour[1]=hour[0];
hour[0]=48;
}

sprintf(sec, "%d",localTime->tm_sec);
sprintf(DAT, "%d",localTime->tm_mday);
sprintf(MES, "%d",localTime->tm_mon + 1);
sprintf(GOD, "%d",localTime->tm_year + 1900);  
}
/***************************************************************************************
**                          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]);
      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;
}

/***************************************************************************************
**                          Convert unix time to a time string
***************************************************************************************/
String strTime(time_t unixTime)
{
  unixTime += TIME_OFFSET;
 return ctime(&unixTime);
}
String strTimeNOW(time_t unixTime)
{
sprintf(DATopW, "%s",ctime(&unixTime));

}

Не в сети

#8 30-10-2021 22:40:24

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

Re: Часы ntp и прогноз погоды на VGA мониторе. ESP32 DEVKIT V1.

Схема девайса классическая, как у Фабрицио Ди Витторио.
http://www.fabglib.org/schema_VGA64.png

schema-VGA64.png

Не в сети

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

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