Насколько не оптимизированная <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, взяв вот такую заточку :
uint32_t prevMicros = 0; void setup() { Serial.begin (115200); } void loop() { // запоминаем текущее значение времени prevMicros = micros(); // выполняю программу Serial.print (micros() - prevMicros); delay(1000); }я увидел цифру 16500(+- 50) микросекунд,
а скорость за сколько обновляется сам OLED не знаю как замерить, да он то и не важен, мне сам камень нужно поднять
перенося строку в конце скетча
Serial.println (micros() - prevMicros);до и после
вижу разницу между между 16500 и 17900 (там когда как)
тоисть если примерно округлить то участок кода что в первом сообщении выполняется 18 миллисекунд а отдельно команда myOLED.update();
2 миллисекунды. Но почему-же тогда в меге в сумме с основной программой происходит завал....
(причин много конечно) НО(!)
благодаря вам я нашел эту считалочку и сам анализировал проблему- спасибо ЕЩЕ раз!