Собрал “метеостанцию”,дисплей ST7565 128*64,но не помещается погода на последующие 3 дня (отображается текущая погода,направление и скорость ветра,осадки,погода сегодня и завтра)
Думаю подключить параллельно дисплею еще один такой же дисплей,но CS дисплея посадить на отдельный вывод ESP8266,но как управлять отдельно каждым дисплеем?
Код,прошу не ругать ,написан не по феншую…
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>
#include <UnixTime.h>
#include <ESP8266WiFi.h>
UnixTime stamp(5);
#include <SPI.h>
#include <U8g2lib.h>
#define DAYS 3
U8G2_ST7565_ERC12864_1_4W_SW_SPI u8g2(U8G2_R0, /* scl=*/ 12, /* si=*/ 13, /* cs=*/ 2, /* rs=*/ 14, /* rse=*/ 4);
const char* ssid = "---------";
const char* password = "------";
float _currenttime;
float _currentTemp = 40400.0;
float _currentHum = 40400.0;
float _currentPres = 40400.0;
float _currentWindSpeed = -1.0;
float _currentwindgusts;
int _currentWindDir = -1;
unsigned int _weather_code = 0;
bool _is_day = false;
unsigned int _currentUpdated = 0;
unsigned int _errorUpdate = 0;
String _country = "";
String _city = "";
float _dailytime[DAYS];
float _dailyDayTemp[DAYS] = {40400.0, 40400.0, 40400.0};
float _dailyNightTemp[DAYS] = {40400.0, 40400.0, 40400.0};
float _dailyWindSpeed[DAYS] = {-1.0, -1.0, -1.0};
unsigned int _dailyIcon[DAYS] = {0, 0, 0};
unsigned int _dailyweather_code[DAYS];
unsigned int _dailyUpdated = 0;
const String api_0 = "http://api.open-meteo.com/v1/forecast?latitude=хх.хх&longitude=хх.хх¤t=temperature_2m,relative_humidity_2m,is_day,weather_code,pressure_msl,wind_speed_10m,wind_gusts_10m,wind_direction_10m&daily=weather_code,temperature_2m_max,temperature_2m_min,wind_speed_10m_max&wind_speed_unit=ms&timeformat=unixtime&timezone=Asia/Yekaterinburg&forecast_days=3";
boolean flag = false;
unsigned long lastTime = 0;
unsigned long timer_Delay = 3000;
void setup(void) {
Serial.begin(74880);
WiFi.begin(ssid, password);Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
lastTime = millis();
}
void loop(void) {
if(WiFi.status()== WL_CONNECTED){
WiFiClient client;
HTTPClient http;
http.useHTTP10(true);
http.begin(client,api_0);
delay(50);
http.GET();
DynamicJsonDocument forecast(8192);
DeserializationError error = deserializeJson(forecast, http.getStream());
Serial.println(forecast.as<String>());//serializeJsonPretty(doc, Serial);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
}
http.end();
_currenttime = forecast["current"]["time"] ;//Время текущее
_currentTemp = forecast["current"]["temperature_2m"] ;//Температура
_currentHum = forecast["current"]["relative_humidity_2m"];//Относительная влажность
_currentPres = forecast["current"]["pressure_msl"];//Давление на уровне моря
_currentWindSpeed = forecast["current"]["wind_speed_10m"];//Скорость ветра
_currentwindgusts = forecast["current"]["wind_gusts_10m"];//Порывы ветра
_currentWindDir = forecast["current"]["wind_direction_10m"];//Направление ветра
_is_day = forecast["current"]["is_day"];//День или ночь
_weather_code =forecast["current"]["weather_code"];//Погодный код
for(unsigned int i=0; i<DAYS; i++) {
_dailytime[i]= forecast["daily"]["time"][i];
_dailyDayTemp[i] = forecast["daily"]["temperature_2m_max"][i] | 40400.0;
_dailyNightTemp[i] = forecast["daily"]["temperature_2m_min"][i] | 40400.0;
_dailyWindSpeed[i] = forecast["daily"]["wind_speed_10m_max"][i] | -1.0;
_dailyweather_code[i]= forecast["daily"]["weather_code"][i];
//_dailyIcon[i] = _openMeteoIcon(forecast["daily"]["weather_code"][i] | 0);
}
u8g2.begin(); //Стартуем экран
u8g2.enableUTF8Print(); //Включаем поддержку UTF8
u8g2.setFlipMode(1);//переворот
u8g2.setContrast(20);
//вывод погоды на экран
// фонты рус
stamp.getDateTime(1621497944);
Serial.println("Temp=" + String( _currentTemp));
for(unsigned int i=0; i<DAYS; i++) {
stamp.getDateTime(_dailytime[i]);
Serial.print(String(stamp.month)+"/");
Serial.print(String(stamp.day)+" ");
Serial.print(String(stamp.hour)+"-");
Serial.print(String(stamp.minute)+" ");
Serial.print(String(_dailyNightTemp[i]));
Serial.println(" " + String(_dailyWindSpeed[i]));
}
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_inr24_t_cyrillic);
u8g2.setCursor(0, 24);
if (_currentTemp>0){u8g2.print("+");}
u8g2.print(String(int(_currentTemp)));
if (_currentTemp>-10&_currentTemp<10){u8g2.print("C");}
u8g2.setFont(u8g2_font_8x13_t_cyrillic);
u8g2.setCursor(62, 9);
switch( _currentWindDir)
{
case 0 ... 22:u8g2.print("Сев ");break;
case 23 ... 77:u8g2.print(" СВ ");break;
case 78 ... 112:u8g2.print("Вос ");break;
case 113 ... 157:u8g2.print(" ЮВ ");break;
case 158 ... 202:u8g2.print("Южн ");break;
case 203 ... 246:u8g2.print(" ЮЗ ");break;
case 247 ... 292:u8g2.print("Зап ");break;
case 293 ... 337:u8g2.print(" СЗ ");break;
case 338 ... 390:u8g2.print("Сев ");break;
default:u8g2.print(" ");
}
u8g2.print(String(int(_currentWindSpeed))+"-"+String(int(_currentwindgusts)));
u8g2.setCursor(99, 20);
//u8g2.print("м/с");
u8g2.setCursor(70, 20);
stamp.getDateTime(_currenttime);
if(stamp.hour<10)u8g2.print("0");
u8g2.print(String(stamp.hour)+"-");
if(stamp.minute<10)u8g2.print("0");
u8g2.print(String(stamp.minute)+" ");
u8g2.setFont(u8g2_font_10x20_t_cyrillic);
//_weather_code=63;
u8g2.setCursor(0, 36);
switch(_weather_code)
{
case 0: u8g2.print(" Ясно");break;
case 1: u8g2.print(" Преимущ ясно");break;
case 2: u8g2.print(" Перем обл");break;
case 3: u8g2.print(" Пасмурно");break;
case 45: u8g2.print(" Туман");break;
case 48: u8g2.print(" Изморозь");break;
case 51 ... 57:u8g2.print(" Морось");break;
case 61: u8g2.print("Дождь слабый ");break;//Дождь: слабый
case 63: u8g2.print("Дождь средний");break;//Дождь: умеренный
case 65: u8g2.print("Дождь сильный");break;//Дождь: сильный
case 66: u8g2.print("Дождь ледяной");break;//Дождь замерзающий: слабый
case 67: u8g2.print("Дождь ледяной");break;//Дождь замерзающий: сильный
//71, 73, 75 Снегопад: слабый, умеренный и сильный.
case 71: u8g2.print("Снег слабый ");break;
case 73: u8g2.print("Снег средний ");break;
case 75: u8g2.print("Снег сильный ");break;
//77 Снежные зерна
case 77: u8g2.print("Снежные зерна ");break;
//80, 81, 82 Ливневые дожди: слабые, умеренные и сильные
case 80: u8g2.print("Ливень слабый ");break;
case 81: u8g2.print("Ливень средний");break;
case 83: u8g2.print("Ливень сильный");break;
//85, 86 Снежные ливни слабые и сильные
case 85 ... 86:u8g2.print("Ливень снежный");break;
//95 * Гроза: слабая или умеренная
case 95: u8g2.print(" Гроза");break;
//96, 99 * Гроза с небольшим и сильным градом
case 96 ... 99:u8g2.print(" Гроза и град");break;
default:u8g2.print(" ");
}
//u8g2.setFont(u8g2_font_6x13B_t_cyrillic);
u8g2.setFont(u8g2_font_6x13_t_cyrillic);
for(unsigned int i=0; i<2; i++) {
stamp.getDateTime(_dailytime[i]+18000);
u8g2.setCursor(0, 50+(13*i));
u8g2.print(String(stamp.day)+"/"+String(stamp.month)+" ");
if(_dailyDayTemp[i]>0)u8g2.print("+");
u8g2.print(String(int(_dailyDayTemp[i])));u8g2.print("/");
if(_dailyNightTemp[i]>0)u8g2.print("+");
u8g2.print(String(int(_dailyNightTemp[i]))+" ");
switch(_dailyweather_code[i])
{
case 0: u8g2.print("Ясно ");break;
case 1: u8g2.print("Ясно ");break;
case 2: u8g2.print("Перем обл ");break;
case 3: u8g2.print("Пасмурно ");break;
case 45: u8g2.print("Туман ");break;
case 48: u8g2.print("Изморозь ");break;
case 51 ... 57:u8g2.print("Морось ");break;
case 61: u8g2.print("Дождь слабый ");break;//Дождь: слабый
case 63: u8g2.print("Дождь средний");break;//Дождь: умеренный
case 65: u8g2.print("Дождь сильный");break;//Дождь: сильный
case 66: u8g2.print("Дождь ледяной");;break;//Дождь замерзающий: слабый
case 67: u8g2.print("Дождь ледяной");;break;//Дождь замерзающий: сильный
//71, 73, 75 Снегопад: слабый, умеренный и сильный.
case 71: u8g2.print("Снег слабый ");break;
case 73: u8g2.print("Снег средний ");break;
case 75: u8g2.print("Снег сильный ");break;
//77 Снежные зерна
case 77: u8g2.print("Снежные зерна ");break;
//80, 81, 82 Ливневые дожди: слабые, умеренные и сильные
case 80: u8g2.print("Ливень слабый ");break;
case 81: u8g2.print("Ливень средний");break;
case 83: u8g2.print("Ливень сильный");break;
//85, 86 Снежные ливни слабые и сильные
case 85 ... 86:u8g2.print("Ливень снежный");break;
//95 * Гроза: слабая или умеренная
case 95: u8g2.print("Гроза ");break;
//96, 99 * Гроза с небольшим и сильным градом
case 96 ... 99:u8g2.print("Гроза+град ");break;
default:u8g2.print(" ");
}
}
} while ( u8g2.nextPage() );
timer_Delay = 30000;
}
else {
Serial.println("WiFi Disconnected");
}
//u8g2.setPowerSave(1);
ESP.deepSleep(900e6); // сон (5 минут = 300e6) или 0 - чтобы не просыпаться самостоятельно
}
/*Код Описание
0 Ясное небо.
1, 2, 3 Преимущественно ясно, переменная облачность, пасмурно
45, 48 Туман и оседающий изморозь
51, 53, 55 Морось: слабая, умеренная и интенсивная
56, 57 Замерзающая морось: слабая и плотная интенсивность
61, 63, 65 Дождь: слабый, умеренный и сильный
66, 67 Замерзающий дождь: слабой и сильной интенсивности
71, 73, 75 Снегопад: слабый, умеренный и сильный.
77 Снежные зерна
80, 81, 82 Ливневые дожди: слабые, умеренные и сильные
85, 86 Снежные ливни слабые и сильные
95 * Гроза: слабая или умеренная
96, 99 * Гроза с небольшим и сильным градом
*/
Из общих соображений полагаю, что нужен второй экземпляр U8G2_ST7565_ERC12864_1_4W_SW_SPI, созданный с теми же аргументами, но иным CS.
Или же вообще со всеми другими пинам. Вдруг там специфический SoftSPI внутре.
Управлять как будто один дисплей, коммутируя поочерёдно CS. Вот тема для примера:
Т.е. в экземпляре CS физически не включенный, CS1, CS2 физически включены. При инициализации на обоих по 0-разрешающему, а потом перед каждым выводом на нужный экран чередование 0,1 или 1,0.
…не проверял, а могут ли библиотеки обрабатывать много экземпляров с одинаковыми пинами в аргументах? (кроме CS)
тебе не нужен второй дисплей, разбей инфу на экраны, показывай последовательно. Второй дисплей для контроллера бывает нужен только в 0,0001% случаев, например если изделие - весы, которые должны показывать одно и тоже и продавцу и покупателю.
Мне нужен второй дисплей,потому что я так хочу!
Тебе надо пример ты и ищи
Просьба закрыть тему так как кроме флуда и оскорблений от flexprint тут ничего нет!
lilik спасибо! все получилось!