Вывод ошибок на oled displey
- Войдите на сайт для отправки комментариев
Здравствуйте форумчане, прошу вас помочь мне чем сможете.
Задача заключается в том, чтобы считывать ошибки нескольких датчиков и выводить их на oled дисплей.
Использую библиотеку U8G2lib. Ошибка с датчика №1 имеет название "F01", ошибка датчика №2 "F02" и т.д.
В чем же заключается проблема? А заключается она в самом простом - переносе строки при нехватке места для печатания содержимого на экран.
setCursor() - использую только один раз для начала печатания ошибок. Мне нужно, чтобы на экране автоматически происходил перенос строки.
Всего в строке рационально выводить 4 ошибки (если выводить больше, то нужно уменьшать шрифт, из-за чего разобрать, то что на экране будет проблематично). Но датчиков у меня самое большое множество и все я опрашиваю на наличие ошибок. В примере, который я прикреплю будет 8 ошибок (без их считывания - это совсем иной код, который здесь не нужен).
На данной фотокарточке видно чего хочу добиться:
Теперь сам код, в нем пояснения как я пытался добиться желаемого результата:
#include "U8g2lib.h" U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0,U8X8_PIN_NONE); String Str0; String Str1; String Str2; String Str3; String Str4; String Str5; String Str6; String Str7; bool F01 = true; bool F02 = true; bool F03 = true; bool F04 = true; bool F05 = true; bool F06 = true; bool F07 = true; bool F08 = true; String Str; char Array[50]; int quan=0; void setup(){ Serial.begin(9600); u8g2.begin(); } void loop(){ readFalse(); str(); search(); //весь этот непонятный и нерабочий цикл, создан исключительно для внедрения символа //переноса строки ('\n') Serial.write(Array,sizeof(Array)); u8g2.firstPage(); do { u8g2.setFont(u8g2_font_helvB10_tf); u8g2.setFontPosTop(); u8g2.setCursor(0,0); // используем один раз u8g2.print(Str);//собстна, выводим } while(u8g2.nextPage()); } void readFalse() { int f1=0; int f2=0; int f3=0; int f4=0; int f5=0; int f6=0; int f7=0; int f8=0; if(F01 == true) { //Эти булевые нужны в случае нахождение ошибок, при их считывание, особой роли не Str0 = "F01; "; //играют, т.к. настраиваются выше f1=1; } if(F02 == true) { Str1 = "F02; "; f2=1; } if(F03 == true) { Str2 = "F03; "; f3=1; } if(F04 == true) { Str3 = "F04; "; f4=1; } if(F05 == true) { Str4 = "F05; "; f5=1; } if(F06 == true) { Str5 = "F06; "; f6=1; } if(F07 == true) { Str6 = "F07; "; f7=1; } if(F08 == true) { Str7 = "F08; "; f8=1; } //в случае, если булевая равна false, то в переменной StrX (x - какое-либо число, например Str1) нет //абсолютно ничего. //К вопросу о const char* - не использую, т.к. в случае если ошибки нет и место ничем не занято, появляется //пробел, который категорически все портит quan=f1+f2+f3+f4+f5+f6+f7+f8; //считывание количества ошибок, далее не используется добавлено на //"вырост" } void str() { Str = Str0 + Str1 + Str2 + Str3+ Str4 + Str5+Str6+Str7; //Записываем все в главную строку Str.toCharArray(Array, sizeof(Array)); //переделываем ее в массив char[] (в этом случае уже нет никаких //пробелов) } void search() { //Объясню, как задумывалось внедрение переноса строки: for(int j=0; j<sizeof(Array); j++) {//Перебираем массив char char i = Array[j]; //и перебором записываем его в переменную типа char - i int l=0; //сяс объясню што ето с чем ето едят while(i == ';') { //Если i обнаружила символ ';' - который заложен в окончание ошибки см. на верху l+=1; //то прибавляем единицу к переменной l if(l>=4) { //Если l> 4, то.... (больше 4, т.к. в 1ой строке 4 ошибки l=0; //тут понятно //а вот тут уже нет. Что делать дальше - не представляю, т.к. не знаю как запихнуть сюда //перенос cтроки //еще желательно было бы без оператора цикла while, но с if - это не работает } } }
Как-то так, здесь я предполагаю два пути:
1. Через функции U8G2
2. Через математику
Но как и что написать я не представляю.
Вроде все разжевал, будут вопросы - поясню. Жду ваших ответов, заранее благодарствую
Ну так введите в строку символ перевода строки. Если не изменяет память /n
изменяет. '\n'
Мне вот интересно. На этот скетч оперативочки хватает :))
Принципиально вставлять переносы и вызывать setCursor() только 1 раз?
Почему нельзя сделать просто вывод F0x на дисплей, при каждом выводе инкрементировать переменную-счетчик? Досчитали до четырех - очередной вызов setCursor(). Соответственно, вывод ошибки на дисплей придется вынести в отдельную функцию, в ней сделать проверку этого счетчика. Можно не напрямую на дисплей выводить, а в буфер - не суть. И стринги все эти будут не нужны.
Сам себе проблемы творишь ... чтобы стойко их побеждать.
В чём смысл букв "FO", если они одинаковы для каждого датчика?
Сколько их у тебя там? Допустим 16. Напиши на экране в два ряда цифры от 1 до 8. Если датчик включён и работает нормально - включается нужная цифра. Если датчик неисправен или КЗ какое - пусть моргает флешем соответствующая цифра. Просто, чётко, информативно. Опять же все одновременно перед глазами.
это я как бы альтернативное мнение предложил.
Ну да, информативно и времени процессоро затратно на этом дисплее.
Работаю с ардуино мега, вполне хватает
Да и на нане хватит. Вот если потом грузить ещё чем то процессоро затратным то могут возникнуть проблемы. Такие трюки лучше использовать с аппаратной поддержкой дисплеем.