Разное о выращивании табака на Алтае
Вы не вошли.
Шрифты семисегментных часов, стырил тут.
https://github.com/maksimKorzh/esp32-fullscreen-clock
Не в сети
#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();
}
}
Не в сети
Не в сети
Для правильного отображения русских шрифтов, нужен мой модифицированный шрифт FONT_8x8.
Не в сети
Не в сети
Не в сети
#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));
}
Не в сети
В коде есть мой API key. Пользуйтесь на здоровье. Только! Ребята, не шлите запросы каждую секунду. В коде, идёт запрос каждый час и этого вполне достаточно. Данные прогноза погоды, меняются не часто.
Не в сети
Не в сети
Добавил функцию выключения монитора на ночь(для мониторов с автоматическим режимом сна если изображение чёрный фон). Не на всех мониторах работает.
#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));
}
Не в сети