Два дисплея к ESP8266

Собрал “метеостанцию”,дисплей 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=хх.хх&current=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 внутре.

1 лайк

Управлять как будто один дисплей, коммутируя поочерёдно CS. Вот тема для примера:

Т.е. в экземпляре CS физически не включенный, CS1, CS2 физически включены. При инициализации на обоих по 0-разрешающему, а потом перед каждым выводом на нужный экран чередование 0,1 или 1,0.
…не проверял, а могут ли библиотеки обрабатывать много экземпляров с одинаковыми пинами в аргументах? (кроме CS)

2 лайка

тебе не нужен второй дисплей, разбей инфу на экраны, показывай последовательно. Второй дисплей для контроллера бывает нужен только в 0,0001% случаев, например если изделие - весы, которые должны показывать одно и тоже и продавцу и покупателю.

lilik я так и думал,спасибо!

Мне нужен второй дисплей,потому что я так хочу!

Тебе надо пример ты и ищи

1 лайк

Просьба закрыть тему так как кроме флуда и оскорблений от flexprint тут ничего нет!
lilik спасибо! все получилось!