You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
415 lines
16 KiB
415 lines
16 KiB
void PageWeather1()
|
|
{
|
|
display.setRotation(4);
|
|
display.fillScreen(GxEPD_WHITE);
|
|
display.setTextColor(GxEPD_BLACK);
|
|
display.setFont();
|
|
|
|
DisplayWeatherIcon(64, 100); // Display weather icon scale = Large;
|
|
DrawBattery( 0, 21);
|
|
DrawRSSI(105, 21, wifi_signal);
|
|
display.drawLine(0,50, 120, 50, GxEPD_BLACK);//x1 y1 x2 y2
|
|
display.drawLine(0, 150, 120, 150, GxEPD_BLACK);//x1 y1 x2 y2
|
|
display.drawLine(0, 170, 120, 170, GxEPD_BLACK);//x1 y1 x2 y2
|
|
display.drawLine(0, 230, 120, 230, GxEPD_BLACK);//x1 y1 x2 y2
|
|
display.drawLine(64, 170, 64, 230, GxEPD_BLACK);//x1 y1 x2 y2
|
|
display.update();
|
|
}
|
|
void DisplayWeatherIcon(int x, int y) {
|
|
// DisplayConditionsSection(x, y, WxConditions[0].Icon, LargeIcon);
|
|
// DisplayConditionsSection(x, y+100, WxConditions[0].Icon, SmallIcon);
|
|
DisplayConditionsSection(x, y, "11d", LargeIcon);
|
|
DisplayConditionsSection(35, y+100,"11d", SmallIcon);
|
|
DisplayConditionsSection(95, y+100,"11n", SmallIcon);
|
|
}
|
|
|
|
void DisplayConditionsSection(int x, int y, String IconName, bool IconSize) {
|
|
Serial.println("Icon name: " + IconName);
|
|
if (IconName == "01d" || IconName == "01n") Sunny(x, y, IconSize, IconName);
|
|
else if (IconName == "02d" || IconName == "02n") MostlySunny(x, y, IconSize, IconName);
|
|
else if (IconName == "03d" || IconName == "03n") Cloudy(x, y, IconSize, IconName);
|
|
else if (IconName == "04d" || IconName == "04n") MostlyCloudy(x, y, IconSize, IconName);
|
|
else if (IconName == "09d" || IconName == "09n") ChanceRain(x, y, IconSize, IconName);
|
|
else if (IconName == "10d" || IconName == "10n") Rain(x, y, IconSize, IconName);
|
|
else if (IconName == "11d" || IconName == "11n") Tstorms(x, y, IconSize, IconName);//молния
|
|
else if (IconName == "13d" || IconName == "13n") Snow(x, y, IconSize, IconName);
|
|
else if (IconName == "50d" || IconName == "50n") Haze(x, y, IconSize, IconName);//легкий туман
|
|
else if (IconName == "51d" || IconName == "51n") Fog(x, y, IconSize, IconName);// туман
|
|
else Nodata(x, y, IconSize, IconName);
|
|
}
|
|
|
|
|
|
void Sunny(int x, int y, bool IconSize, String IconName) {//солнечно
|
|
int scale = Small, Offset = 15;
|
|
if (IconSize == LargeIcon) {
|
|
scale = Large;
|
|
Offset = 35;
|
|
}
|
|
else y = y - 3; // Shift up small sun icon
|
|
|
|
|
|
if (IconName.endsWith("n"))
|
|
{moon(x, y + Offset, scale, IconSize);
|
|
return;
|
|
}
|
|
scale = scale * 1.6;
|
|
addsun(x, y-3+scale/2, scale, IconSize);
|
|
|
|
}
|
|
|
|
void MostlySunny(int x, int y, bool IconSize, String IconName) {//основная солнечно
|
|
int scale = Small, linesize = 5, Offset = 20 ,Offset1 = 13;
|
|
if (IconSize == LargeIcon) {
|
|
scale = Large;
|
|
Offset = 50;
|
|
Offset1=25;
|
|
}
|
|
if (IconName.endsWith("n"))
|
|
{addmoon(x, y + Offset, scale, IconSize);
|
|
addcloud(x, y+ Offset1, scale*2/3, linesize/2);
|
|
return;
|
|
}
|
|
addsun(x - scale * 1.8, y - scale * 1.5, scale, IconSize);
|
|
addcloud(x, y+Offset1, scale*2/3, linesize/2);
|
|
}
|
|
|
|
void MostlyCloudy(int x, int y, bool IconSize, String IconName) {//основная облачность
|
|
int scale = Small, linesize = 3, Offset = 15;
|
|
|
|
|
|
|
|
if (IconSize == LargeIcon) {
|
|
scale = Large;
|
|
Offset = 45;
|
|
if (IconName.endsWith("n"))
|
|
{addmoon(x+5, y + Offset+scale/2, scale, IconSize);
|
|
}
|
|
else{
|
|
addsun(x - scale * 1.6, y - scale * 1.0, scale, IconSize);
|
|
}
|
|
addcloud(x, y+18, scale, linesize);
|
|
}
|
|
else
|
|
{
|
|
if (IconName.endsWith("n"))
|
|
{addmoon(x, y + Offset, scale, IconSize);
|
|
}
|
|
else{
|
|
addsun(x - scale * 1.6, y - scale * 1.5, scale, IconSize);
|
|
}
|
|
addcloud(x, y+7, scale, linesize);
|
|
}
|
|
|
|
}
|
|
|
|
void Cloudy(int x, int y, bool IconSize, String IconName) {//облачно
|
|
int scale = Small, linesize = 5, Offset = 7;
|
|
if (IconSize == LargeIcon) {
|
|
scale = Large;
|
|
Offset = 12;
|
|
}
|
|
y=y+Offset;
|
|
if (IconSize == SmallIcon) {
|
|
//if (IconName.endsWith("n")) addmoon(x, y + Offset, scale, IconSize);
|
|
|
|
addcloud(x + scale*2, y - scale*2-scale/2, scale / 2, linesize/2); // Cloud top right
|
|
addcloud(x - scale-scale/4, y - scale*2, scale / 2, linesize/2); // Cloud top left
|
|
addcloud(x, y, scale, 3); // Main cloud
|
|
|
|
// addrain(x, y, scale, IconSize);
|
|
}
|
|
else{
|
|
|
|
addcloud(x, y, scale, 3); // Main cloud
|
|
addcloud(x + scale*2, y - scale, scale / 2, linesize/2); // Cloud top right
|
|
addcloud(x - 2*scale-scale/3, y-scale/3 , scale / 2, linesize/2); // Cloud top left
|
|
// addrain(x, y, scale, IconSize);
|
|
}
|
|
}
|
|
|
|
void Rain(int x, int y, bool IconSize, String IconName) {//дождь
|
|
int scale = Small, linesize = 5, Offset = 10;
|
|
y=y+3;
|
|
if (IconSize == LargeIcon) {
|
|
scale = Large;
|
|
Offset = 35;
|
|
}
|
|
if (IconSize == SmallIcon) {
|
|
//if (IconName.endsWith("n")) addmoon(x, y + Offset, scale, IconSize);
|
|
|
|
|
|
addcloud(x + scale*2, y - scale*2-scale/2, scale / 2, linesize/2); // Cloud top right
|
|
addcloud(x - scale-scale/4, y - scale*2, scale / 2, linesize/2); // Cloud top left
|
|
addcloud(x, y, scale, 3); // Main cloud
|
|
|
|
addrain(x, y, scale, IconSize);
|
|
}
|
|
else{
|
|
|
|
addcloud(x, y, scale, 3); // Main cloud
|
|
addcloud(x + scale*2, y - scale, scale / 2, linesize/2); // Cloud top right
|
|
addcloud(x - 2*scale-scale/3, y-scale/3 , scale / 2, linesize/2); // Cloud top left
|
|
addrain(x, y-3, scale, IconSize);
|
|
}
|
|
}
|
|
|
|
void ExpectRain(int x, int y, bool IconSize, String IconName) {//ожидание дождя
|
|
int scale = Small, linesize = 5, Offset = 10;
|
|
if (IconSize == LargeIcon) {
|
|
scale = Large;
|
|
Offset = 35;
|
|
}
|
|
if (IconName.endsWith("n")) addmoon(x, y + Offset, scale, IconSize);
|
|
addsun(x - scale * 1.8, y - scale * 1.8, scale, IconSize);
|
|
addcloud(x, y, scale, linesize);
|
|
addrain(x, y, scale, IconSize);
|
|
}
|
|
|
|
void ChanceRain(int x, int y, bool IconSize, String IconName) {//легкий дождь
|
|
int scale = Small, linesize = 3, Offset = 15,cl=5,cl1=5;
|
|
y=y-3;
|
|
if (IconSize == LargeIcon) {
|
|
scale = Large;
|
|
Offset = 45;
|
|
cl=5;
|
|
cl1=0;
|
|
|
|
}
|
|
if (IconName.endsWith("n"))
|
|
{addmoon(x, y + Offset, scale, IconSize);
|
|
}else
|
|
{addsun(x - scale * 1.8, y - scale * 1.6, scale, IconSize);
|
|
}
|
|
addcloud(x, y+cl, scale, linesize);
|
|
addrain(x, y+cl1, scale, IconSize);
|
|
}
|
|
|
|
void Tstorms(int x, int y, bool IconSize, String IconName) {//шторм
|
|
int scale = Small, linesize = 3, Offset = 10;
|
|
if (IconSize == LargeIcon) {
|
|
scale = Large;
|
|
Offset = 35;
|
|
}
|
|
if (IconName.endsWith("n")) addmoon(x, y + Offset, scale, IconSize);
|
|
addcloud(x, y, scale, 3);
|
|
addtstorm(x, y, scale);
|
|
}
|
|
|
|
void Snow(int x, int y, bool IconSize, String IconName) {//снег
|
|
int scale = Small, linesize = 3, Offset = 13;
|
|
if (IconSize == LargeIcon) {
|
|
scale = Large;
|
|
Offset = 35;
|
|
}
|
|
if (IconName.endsWith("n")) addmoon(x, y + Offset, scale, IconSize);
|
|
addcloud(x, y, scale, linesize);
|
|
addsnow(x, y, scale, IconSize);
|
|
}
|
|
|
|
void Fog(int x, int y, bool IconSize, String IconName) {//Туман
|
|
int scale = Small, linesize = 3, Offset = 10;
|
|
if (IconSize == LargeIcon) {
|
|
scale = Large;
|
|
Offset = 35;
|
|
}
|
|
if (IconName.endsWith("n")) addmoon(x, y + Offset, scale, IconSize);
|
|
addcloud(x, y - 5, scale, linesize);
|
|
if (IconSize == LargeIcon) {
|
|
addfog(x, y -5, scale, linesize, IconSize);
|
|
}
|
|
else
|
|
{
|
|
addfog(x, y+5 , scale, linesize, IconSize);
|
|
}
|
|
}
|
|
|
|
void Haze(int x, int y, bool IconSize, String IconName) {//легкий туман
|
|
int scale = Small, linesize = 3, Offset = 10;
|
|
if (IconSize == LargeIcon) {
|
|
scale = Large;
|
|
Offset = 35;
|
|
}
|
|
if (IconName.endsWith("n"))
|
|
{moon(x, y + Offset, scale, IconSize);
|
|
}else{
|
|
addsun(x, y - 5, scale * 1.4, IconSize);
|
|
}
|
|
addfog(x, y +5, scale * 1.4, linesize, IconSize);
|
|
}
|
|
|
|
void CloudCover(int x, int y, int CCover) {//полная облачность
|
|
addcloud(x - 9, y + 2, Small * 0.3, 2); // Cloud top left
|
|
addcloud(x + 3, y - 2, Small * 0.3, 2); // Cloud top right
|
|
addcloud(x, y + 10, Small * 0.6, 2); // Main cloud
|
|
drawString(x + 20, y, String(CCover) + "%", LEFT);
|
|
}
|
|
|
|
void moon(int x, int y, int scale, bool IconSize) {//луна
|
|
if (IconSize == LargeIcon) {
|
|
y=y-10;
|
|
display.fillCircle(x , y - 30, uint16_t(scale * 2.2), GxEPD_RED);
|
|
display.fillCircle(x+30, y - 30, uint16_t(scale * 2.6), GxEPD_WHITE);
|
|
drawString(x -60, y+10 , " * * * * ", CENTER);
|
|
drawString(x +5, y , " * *", CENTER);
|
|
drawString(x , y-10 , " * ", CENTER);
|
|
drawString(x-5, y-20 , " * *", CENTER);
|
|
drawString(x-10 , y-30 , " * * ", CENTER);
|
|
drawString(x -5, y-40 , "* *", CENTER);
|
|
drawString(x , y-50 , " * ", CENTER);
|
|
drawString(x +5, y-60 , " * *", CENTER);
|
|
drawString(x -60, y-70 , " * * * * ", CENTER);
|
|
|
|
drawString(x -60, y , " * ", CENTER);
|
|
drawString(x -60, y-20 , "* '", CENTER);
|
|
drawString(x -60, y-40 , "' *", CENTER);
|
|
drawString(x -60, y-60 , ". * ", CENTER);
|
|
}
|
|
else
|
|
{ y=y-5;
|
|
display.fillCircle(x , y - 10, uint16_t(scale * 1.8), GxEPD_RED);
|
|
display.fillCircle(x +12, y - 10, uint16_t(scale * 2.1), GxEPD_WHITE);
|
|
|
|
drawString(x +10, y , "* . ", CENTER);//справа
|
|
drawString(x +5, y-10 , " * . ", CENTER);
|
|
drawString(x +5, y-20 , "* * ", CENTER);
|
|
drawString(x +10, y-30 , "* ' ", CENTER);
|
|
|
|
drawString(x -25, y+10 , "* ' * * ", CENTER);
|
|
drawString(x -25, y , "* ", CENTER);//слева
|
|
drawString(x -25, y-10 , " . ", CENTER);
|
|
drawString(x -25, y-20 , "* . ", CENTER);
|
|
drawString(x -25, y-30 , "* ' ", CENTER);
|
|
|
|
}
|
|
}
|
|
|
|
void addmoon(int x, int y, int scale, bool IconSize) {//луна c облаками
|
|
if (IconSize == LargeIcon) {
|
|
display.fillCircle(x - 85+50, y - 70, uint16_t(scale * 1.2), GxEPD_RED);
|
|
display.fillCircle(x - 62+40, y - 70, uint16_t(scale * 1.5), GxEPD_WHITE);
|
|
}
|
|
else
|
|
{
|
|
display.fillCircle(x - 10, y - 28, uint16_t(scale * 1.0), GxEPD_RED);
|
|
display.fillCircle(x - 4, y - 28, uint16_t(scale * 1.4), GxEPD_WHITE);
|
|
}
|
|
}
|
|
|
|
void Nodata(int x, int y, bool IconSize, String IconName) {//нет данных
|
|
if (IconSize == LargeIcon) display.setFont(&FreeMonoBold18pt7b); else display.setFont(&FreeMonoBold9pt7b);
|
|
drawString(x - 3, y - 10, "?", CENTER);
|
|
}
|
|
//#include <Fonts/FreeMonoBold9pt7b.h>
|
|
//#include <Fonts/FreeMonoBold12pt7b.h>
|
|
//#include <Fonts/FreeMonoBold18pt7b.h>
|
|
//#include <Fonts/FreeMonoBold24pt7b.h>
|
|
// Symbols are drawn on a relative 10x10grid and 1 scale unit = 1 drawing unit
|
|
void addcloud(int x, int y, int scale, int linesize) {//рисуем облачность
|
|
display.fillCircle(x - scale * 3, y, scale, GxEPD_BLACK); // Left most circle
|
|
display.fillCircle(x + scale * 3, y, scale, GxEPD_BLACK); // Right most circle
|
|
display.fillCircle(x - scale, y - scale, scale * 1.4, GxEPD_BLACK); // left middle upper circle
|
|
display.fillCircle(x + scale * 1.5, y - scale * 1.3, scale * 1.75, GxEPD_BLACK); // Right middle upper circle
|
|
display.fillRect(x - scale * 3 - 1, y - scale, scale * 6, scale * 2 + 1, GxEPD_BLACK); // Upper and lower lines
|
|
display.fillCircle(x - scale * 3, y, scale - linesize, GxEPD_WHITE); // Clear left most circle
|
|
display.fillCircle(x + scale * 3, y, scale - linesize, GxEPD_WHITE); // Clear right most circle
|
|
display.fillCircle(x - scale, y - scale, scale * 1.4 - linesize, GxEPD_WHITE); // left middle upper circle
|
|
display.fillCircle(x + scale * 1.5, y - scale * 1.3, scale * 1.75 - linesize, GxEPD_WHITE); // Right middle upper circle
|
|
display.fillRect(x - scale * 3 + 2, y - scale + linesize - 1, scale * 5.9, scale * 2 - linesize * 2 + 2, GxEPD_WHITE); // Upper and lower lines
|
|
}
|
|
|
|
void addrain(int x, int y, int scale, bool IconSize) {//рисуем дождь
|
|
if (IconSize == SmallIcon) {
|
|
display.setFont(&FreeMonoBold9pt7b);
|
|
display.setTextColor(GxEPD_BLACK);
|
|
drawString(x - 25, y + 12, "////", LEFT);
|
|
}
|
|
else
|
|
{
|
|
display.setFont(&FreeMonoBold18pt7b);
|
|
drawString(x - 50-5, y + 25+20, "/////", LEFT);
|
|
}
|
|
}
|
|
|
|
void addsnow(int x, int y, int scale, bool IconSize) {//рисуем снег
|
|
if (IconSize == SmallIcon) {
|
|
display.setFont(&FreeMonoBold9pt7b);
|
|
display.setTextColor(GxEPD_BLACK);
|
|
drawString(x - 25-5, y + 22-5, "* * * ", LEFT);
|
|
drawString(x - 25-5, y + 27-5, " * * ", LEFT);
|
|
}
|
|
else
|
|
{
|
|
display.setFont(&FreeMonoBold18pt7b);
|
|
drawString(x - 60, y + 42, "* * * ", LEFT);
|
|
drawString(x - 60, y + 52, " * * ", LEFT);
|
|
}
|
|
}
|
|
|
|
void addtstorm(int x, int y, int scale) {//рисуем шторм
|
|
y = y - 5 + scale / 2;
|
|
for (int i = 0; i < 5; i++) {
|
|
display.drawLine(x - scale * 4 + scale * i * 1.5 + 0, y + scale * 1.5, x - scale * 3.5 + scale * i * 1.5 + 0, y + scale, GxEPD_RED);
|
|
if (scale != Small) {
|
|
display.drawLine(x - scale * 4 + scale * i * 1.5 + 1, y + scale * 1.5, x - scale * 3.5 + scale * i * 1.5 + 1, y + scale, GxEPD_RED);
|
|
// display.drawLine(x - scale * 4 + scale * i * 1.5 + 2, y + scale * 1.5, x - scale * 3.5 + scale * i * 1.5 + 2, y + scale, GxEPD_BLACK);
|
|
}
|
|
display.drawLine(x - scale * 4 + scale * i * 1.5, y + scale * 1.5 + 0, x - scale * 3 + scale * i * 1.5 + 0, y + scale * 1.5 + 0, GxEPD_RED);
|
|
if (scale != Small) {
|
|
display.drawLine(x - scale * 4 + scale * i * 1.5, y + scale * 1.5 + 1, x - scale * 3 + scale * i * 1.5 + 0, y + scale * 1.5 + 1, GxEPD_RED);
|
|
// display.drawLine(x - scale * 4 + scale * i * 1.5, y + scale * 1.5 + 2, x - scale * 3 + scale * i * 1.5 + 0, y + scale * 1.5 + 2, GxEPD_BLACK);
|
|
}
|
|
display.drawLine(x - scale * 3.5 + scale * i * 1.4 + 0, y + scale * 2.5, x - scale * 3 + scale * i * 1.5 + 0, y + scale * 1.5, GxEPD_RED);
|
|
if (scale != Small) {
|
|
display.drawLine(x - scale * 3.5 + scale * i * 1.4 + 1, y + scale * 2.5, x - scale * 3 + scale * i * 1.5 + 1, y + scale * 1.5, GxEPD_RED);
|
|
// display.drawLine(x - scale * 3.5 + scale * i * 1.4 + 2, y + scale * 2.5, x - scale * 3 + scale * i * 1.5 + 2, y + scale * 1.5, GxEPD_BLACK);
|
|
}
|
|
}
|
|
}
|
|
|
|
void addsun(int x, int y, int scale, bool IconSize) {//рисуем солнце
|
|
int linesize = 5/2;
|
|
// display.fillRoundRect(35, 65, 18, 180, 10, GxEPD_BLACK);//x y w h R
|
|
display.fillRect(x - scale * 2, y, scale * 4, linesize, GxEPD_RED);
|
|
display.fillRect(x, y - scale * 2, linesize, scale * 4, GxEPD_RED);
|
|
display.drawLine(x - scale * 1.3, y - scale * 1.3, x + scale * 1.3, y + scale * 1.3, GxEPD_RED);
|
|
display.drawLine(x - scale * 1.3, y + scale * 1.3, x + scale * 1.3, y - scale * 1.3, GxEPD_RED);
|
|
if (IconSize == LargeIcon) {
|
|
display.drawLine(1 + x - scale * 1.3, y - scale * 1.3, 1 + x + scale * 1.3, y + scale * 1.3, GxEPD_RED);
|
|
display.drawLine(2 + x - scale * 1.3, y - scale * 1.3, 2 + x + scale * 1.3, y + scale * 1.3, GxEPD_RED);
|
|
display.drawLine(3 + x - scale * 1.3, y - scale * 1.3, 3 + x + scale * 1.3, y + scale * 1.3, GxEPD_RED);
|
|
display.drawLine(1 + x - scale * 1.3, y + scale * 1.3, 1 + x + scale * 1.3, y - scale * 1.3, GxEPD_RED);
|
|
display.drawLine(2 + x - scale * 1.3, y + scale * 1.3, 2 + x + scale * 1.3, y - scale * 1.3, GxEPD_RED);
|
|
display.drawLine(3 + x - scale * 1.3, y + scale * 1.3, 3 + x + scale * 1.3, y - scale * 1.3, GxEPD_RED);
|
|
}
|
|
display.fillCircle(x, y, scale * 1.3, GxEPD_WHITE);
|
|
display.fillCircle(x, y, scale, GxEPD_RED);
|
|
// display.fillCircle(x, y, scale - linesize, GxEPD_WHITE);
|
|
}
|
|
|
|
void addfog(int x, int y, int scale, int linesize, bool IconSize) {//рисуем туман
|
|
if (IconSize == SmallIcon) {
|
|
y -= 10;
|
|
linesize = 1;
|
|
}
|
|
for (int i = 0; i < 6; i++) {
|
|
// display.fillRect(35, 65, 18, 180, 10, GxEPD_BLACK);//x y w h R
|
|
display.fillRect(x - scale * 3, y + scale * 1.5, scale * 6, linesize, GxEPD_BLACK);
|
|
display.fillRect(x - scale * 3, y + scale * 2.0, scale * 6, linesize, GxEPD_BLACK);
|
|
display.fillRect(x - scale * 3, y + scale * 2.5, scale * 6, linesize, GxEPD_BLACK);
|
|
}
|
|
}
|
|
|
|
void drawString(int x, int y, String text, alignment align) {
|
|
char * data = const_cast<char*>(text.c_str());
|
|
int x1, y1; //the bounds of x,y and w and h of the variable 'text' in pixels.
|
|
int w, h;
|
|
// int xx = x, yy = y;
|
|
if (align == RIGHT) x = x - w;
|
|
if (align == CENTER) x = x - w / 2;
|
|
display.setCursor(x,y);
|
|
display.print(text );
|
|
// get_text_bounds(¤tFont, data, &xx, &yy, &x1, &y1, &w, &h, NULL);
|
|
|
|
// int cursor_y = y + h;
|
|
// write_string(¤tFont, data, &x, &cursor_y, framebuffer);
|
|
}
|
|
|