Насколько не оптимизированная <OLED_I2C.h>? (чисто для развития)
- Войдите на сайт для отправки комментариев
Пт, 24/11/2017 - 11:56
Добрый день уважаемые .
Имеется код для отображения некоторых ошибок для линии.
Изначально он должен был быть в той же меге что и остальная управ.программа но в итоге не получилось ибо этот кусок ложит мегу на спину полностью, и причем в основном после команды 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); }
Не хочется устанавливать библиотеку, которую все равно никогда не буду использовать.
Лучше скажите, сколько времени уходит на заполнение всего экрана (вместе с обновлением, т.е. отправкой сформированного изображения на сам дисплей).
При оптимально написанной библиотеке при скорости обмена 400 кГц должно быть около 50 мс.
И еще: у Вас дисплей подключается к I2С через 8 и 9 пины, или я чего-то не понял?
Спасибо за внимание!
Значит обычный OLED
andriano, взяв вот такую заточку :
я увидел цифру 16500(+- 50) микросекунд,
а скорость за сколько обновляется сам OLED не знаю как замерить, да он то и не важен, мне сам камень нужно поднять
перенося строку в конце скетча
до и после
вижу разницу между между 16500 и 17900 (там когда как)
тоисть если примерно округлить то участок кода что в первом сообщении выполняется 18 миллисекунд а отдельно команда myOLED.update();
2 миллисекунды. Но почему-же тогда в меге в сумме с основной программой происходит завал....
(причин много конечно) НО(!)
благодаря вам я нашел эту считалочку и сам анализировал проблему- спасибо ЕЩЕ раз!