Насколько не оптимизированная <OLED_I2C.h>? (чисто для развития)

maxvalin
Offline
Зарегистрирован: 22.02.2016

Добрый день уважаемые .

Имеется код для отображения некоторых ошибок для линии.

Изначально он должен был быть в той же меге что и остальная управ.программа но в итоге не получилось ибо этот кусок ложит мегу на спину полностью, и причем в основном после команды myOLED.update(); повторюсь вОСНОВНОМ но и не только.  В меге своих 800 строк работают отлично -вопросов нет, но стоит вкинуть этот код, все. Сейчас работают раздельно- мега железом руководит а нано "с тормозами" отображает ошибки если надо

Вопрос: насколько критична <OLED_I2C.h> ? Или же критичен скорее всего сам русский язык? кто сталкивался - поделитесь. Это чисто для собственного понимания.

//OLED
#include <SPI.h>
#include <OLED_I2C.h>     // подключение библиотеки для OLED
OLED  myOLED(8, 9);       // подключение дисплея 9 SDA  10 SCK
extern uint8_t RusFont[]; // Русский шрифт
uint8_t buf[6]; // массив для сбора буффера
uint8_t msg[3]; // массив для сообщений
uint8_t FlagAlarm;

void setup() {
  Serial.begin(9600);
  myOLED.begin(); // инициализация экрана.
  myOLED.setFont(RusFont); // подключаю русский шрифт

}

void loop() {


   // чтоб начать считывать с самого начала массив а он у меня 3 символа
 if (Serial.available() >= 6) // количество передаваемых данных умноженных на 2
 {
  for (int i = 0; i < 6; i++)//чтоб прочитать все 6 символов и сложить
 {
  buf [i] = Serial.read(); // 
 }
  char c = buf[0]; //чар C равно первому знаку из буфера 
  int j = 1;
  for (int i = 2; i < 6; i = i + 2)
  {
    if ( buf[ i + 1] > 128)
      {
        msg[j] = ( buf[i] + (buf[i +1] - 256) * 256);
        j++;      
      } 
    else if ( buf[ i + 1] > 0)
    {
      msg[j] = ( buf[i] + buf[i +1] * 256);
      j++;
     }
    else 
     {
      msg[j] = ( buf[i]);
      j++;
      }
  }
  }
Serial.println (msg[1]);


  
  myOLED.clrScr();
  myOLED.setFont(RusFont); // подключаю русский шрифт
  myOLED.print("RJYNHJKM KFVG",CENTER,0); //контроль ламп 
  myOLED.print("B HTAKTRNJHJD", CENTER,8);// и рефлекторов

FlagAlarm = msg[1];


  

switch (msg[1])
  {
  case 0:                                                                                                                                      
   myOLED.print("DCT D GJHZLRT", CENTER, 32); // ВСЕ В ПОРЯДКЕ
   break;
  case 11:  /// 1 СЕКЦИЯ ОБРЫВ КОНЦЕВИКА ИЛИ ПРЕДОХРАНИТЕЛЬ Ф5
   myOLED.print("1 CTRWBZ ", CENTER, 27);
   myOLED.print("J,HSD RJYWTDBRF BKB", CENTER, 39);
   myOLED.print("GHTLJ[HFYBNTKM A-5", CENTER, 48);
   break; 
  case 111:  /// 1 СЕКЦИЯ РЕФЛЕКТОР НЕ ЗАКРЫЛСЯ НЕ ОТКРЫЛСЯ
   myOLED.print("1 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT PFRHSN", CENTER, 39);
   myOLED.print("BKB YT JNRHSN", CENTER, 48); 
   break;
  case 12:  /// 2 СЕКЦИЯ ОБРЫВ КОНЦЕВИКА ИЛИ ПРЕДОХРАНИТЕЛЬ Ф5
   myOLED.print("2 CTRWBZ ", CENTER, 27);
   myOLED.print("J,HSD RJYWTDBRF BKB", CENTER, 39);
   myOLED.print("GHTLJ[HFYBNTKM A-5", CENTER, 48); 
   break;
  case 112:  /// 2 СЕКЦИЯ РЕФЛЕКТОР НЕ ЗАКРЫЛСЯ НЕ ОТКРЫЛСЯ
   myOLED.print("2 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT PFRHSN", CENTER, 39);
   myOLED.print("BKB YT JNRHSN", CENTER, 48); 
   break;
  case 13:  /// 3 СЕКЦИЯ ОБРЫВ КОНЦЕВИКА ИЛИ ПРЕДОХРАНИТЕЛЬ Ф5
   myOLED.print("3 CTRWBZ ", CENTER, 27);
   myOLED.print("J,HSD RJYWTDBRF BKB", CENTER, 39);
   myOLED.print("GHTLJ[HFYBNTKM A-5", CENTER, 48); 
   break;
  case 113:  /// 3 СЕКЦИЯ РЕФЛЕКТОР НЕ ЗАКРЫЛСЯ НЕ ОТКРЫЛСЯ
   myOLED.print("3 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT PFRHSN", CENTER, 39);
   myOLED.print("BKB YT JNRHSN", CENTER, 48); 
   break;
  case 14:  /// 4 СЕКЦИЯ ОБРЫВ КОНЦЕВИКА ИЛИ ПРЕДОХРАНИТЕЛЬ Ф5
   myOLED.print("4 CTRWBZ ", CENTER, 27);
   myOLED.print("J,HSD RJYWTDBRF BKB", CENTER, 39);
   myOLED.print("GHTLJ[HFYBNTKM A-5", CENTER, 48); 
   break;
  case 114:  /// 4 СЕКЦИЯ РЕФЛЕКТОР НЕ ЗАКРЫЛСЯ НЕ ОТКРЫЛСЯ
   myOLED.print("4 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT PFRHSN", CENTER, 39);
   myOLED.print("BKB YT JNRHSN", CENTER, 48); 
   break;
  case 15:  /// 5 СЕКЦИЯ ОБРЫВ КОНЦЕВИКА ИЛИ ПРЕДОХРАНИТЕЛЬ Ф5
   myOLED.print("5 CTRWBZ ", CENTER, 27);
   myOLED.print("J,HSD RJYWTDBRF BKB", CENTER, 39);
   myOLED.print("GHTLJ[HFYBNTKM A-5", CENTER, 48); 
   break;
  case 115:  /// 5 СЕКЦИЯ РЕФЛЕКТОР НЕ ЗАКРЫЛСЯ НЕ ОТКРЫЛСЯ
   myOLED.print("5 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT PFRHSN", CENTER, 39);
   myOLED.print("BKB YT JNRHSN", CENTER, 48); 
   break;
  case 21: // 1 СЕКЦИЯ РЕФЛЕКТОР НЕ ЗАКРЫЛСЯ ПРИ ОСТАНОВКЕ ЛИНИИ
   myOLED.print("1 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT PFRHSKCZ", CENTER, 39);
   myOLED.print("GHB JCNFYJDRT KBYBB", CENTER, 48); 
   break;
  case 22: // 2 СЕКЦИЯ РЕФЛЕКТОР НЕ ЗАКРЫЛСЯ ПРИ ОСТАНОВКЕ ЛИНИИ
   myOLED.print("2 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT PFRHSKCZ", CENTER, 39);
   myOLED.print("GHB JCNFYJDRT KBYBB", CENTER, 48); 
   break;
  case 23: // 3 СЕКЦИЯ РЕФЛЕКТОР НЕ ЗАКРЫЛСЯ ПРИ ОСТАНОВКЕ ЛИНИИ
   myOLED.print("3 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT PFRHSKCZ", CENTER, 39);
   myOLED.print("GHB JCNFYJDRT KBYBB", CENTER, 48); 
   break;
  case 24: // 4 СЕКЦИЯ РЕФЛЕКТОР НЕ ЗАКРЫЛСЯ ПРИ ОСТАНОВКЕ ЛИНИИ
   myOLED.print("4 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT PFRHSKCZ", CENTER, 39);
   myOLED.print("GHB JCNFYJDRT KBYBB", CENTER, 48); 
   break;
  case 25: // 5 СЕКЦИЯ РЕФЛЕКТОР НЕ ЗАКРЫЛСЯ ПРИ ОСТАНОВКЕ ЛИНИИ
   myOLED.print("5 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT PFRHSKCZ", CENTER, 39);
   myOLED.print("GHB JCNFYJDRT KBYBB", CENTER, 48); 
   break;
  case 31: // 1 СЕКЦИЯ РЕФЛЕКТОР НЕ ОТКРЫЛСЯ ПРИ ЗАПУСКЕ ЛИНИИ
   myOLED.print("1 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT JNRHSKCZ", CENTER, 39);
   myOLED.print("GHB PFGECRT KBYBB", CENTER, 48); 
   break;
  case 32: // 2 СЕКЦИЯ РЕФЛЕКТОР НЕ ОТКРЫЛСЯ ПРИ ЗАПУСКЕ ЛИНИИ
   myOLED.print("2 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT JNRHSKCZ", CENTER, 39);
   myOLED.print("GHB PFGECRT KBYBB", CENTER, 48); 
   break;
  case 33: // 3 СЕКЦИЯ РЕФЛЕКТОР НЕ ОТКРЫЛСЯ ПРИ ЗАПУСКЕ ЛИНИИ
   myOLED.print("3 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT JNRHSKCZ", CENTER, 39);
   myOLED.print("GHB PFGECRT KBYBB", CENTER, 48); 
   break;
  case 34: // 4 СЕКЦИЯ РЕФЛЕКТОР НЕ ОТКРЫЛСЯ ПРИ ЗАПУСКЕ ЛИНИИ
   myOLED.print("4 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT JNRHSKCZ", CENTER, 39);
   myOLED.print("GHB PFGECRT KBYBB", CENTER, 48); 
   break;
  case 35: // 5 СЕКЦИЯ РЕФЛЕКТОР НЕ ОТКРЫЛСЯ ПРИ ЗАПУСКЕ ЛИНИИ
   myOLED.print("5 CTRWBZ ", CENTER, 27);
   myOLED.print("HTAKTRNJH YT JNRHSKCZ", CENTER, 39);
   myOLED.print("GHB PFGECRT KBYBB", CENTER, 48); 
   break;
  case 4: // ОБРЫВ ПОЛОТНА ИЛИ ПРОБЛЕМА С ТАХОМЕТРАМИ
   myOLED.print("J,HSD GJKJNYF!!!", CENTER, 27);
   myOLED.print("BKB GHJ,KTVF C ", CENTER, 39);
   myOLED.print("NF[JVTNHFVB", CENTER, 48); 
   break;
  case 5: // НА ПНЕВМОРАСПРЕДЕЛИТЕЛИ РЕФЛЕКТОРОВ НЕТ 220 ВОЛЬТ ИЛИ СГОРЕЛ F2
   myOLED.print("YTN 220 YF", CENTER, 27);
   myOLED.print("GYTDVJ HTAKTRNJHJD ", CENTER, 39);
   myOLED.print("BKB CUJHTK A2", CENTER, 48); 
   break;
  case 6: // НА КОНЦЕВИКИ НЕТ 24 ВОЛЬТ ИЛИ СГОРЕЛ F5
   myOLED.print("YF RJYWTDBRB YTN", CENTER, 27);
   myOLED.print("24 DJKMN BKB CUJHTK ", CENTER, 39);
   myOLED.print("GHTLJ[HFYBNTKM A5", CENTER, 48); 
   break;
  }
   myOLED.update(); 
//  Serial.println(FlagAlarm);


}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Не хочется устанавливать библиотеку, которую все равно никогда не буду использовать.

Лучше скажите, сколько времени уходит на заполнение всего экрана (вместе с обновлением, т.е. отправкой сформированного изображения на сам дисплей).

При оптимально написанной библиотеке при скорости обмена 400 кГц должно быть около 50 мс.

 

И еще: у Вас дисплей подключается к I2С через 8 и 9 пины, или я чего-то не понял?

maxvalin
Offline
Зарегистрирован: 22.02.2016

Спасибо за внимание!

Значит обычный OLED

andriano, взяв вот такую заточку :


uint32_t prevMicros = 0;
void setup() {
  Serial.begin (115200);

}

  void loop() 
{
  // запоминаем текущее значение времени
  prevMicros = micros();
// выполняю программу

  Serial.print (micros() - prevMicros);
  delay(1000);
}

я увидел цифру 16500(+- 50) микросекунд,

а скорость за сколько обновляется сам OLED не знаю как замерить, да он то и не важен, мне сам камень нужно поднять

maxvalin
Offline
Зарегистрирован: 22.02.2016

перенося строку в конце скетча 

      Serial.println (micros() - prevMicros);

до и после 

myOLED.update();

вижу разницу между между 16500 и 17900 (там когда как)

тоисть если примерно округлить то участок кода что в первом сообщении выполняется 18 миллисекунд а отдельно команда myOLED.update();

2 миллисекунды. Но почему-же тогда в меге в сумме с основной программой происходит завал....

(причин много конечно) НО(!)

благодаря вам я нашел эту считалочку и сам анализировал проблему- спасибо ЕЩЕ раз!