Вывод ошибок на 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. Если датчик включён и работает нормально - включается нужная цифра. Если датчик неисправен или КЗ какое - пусть моргает флешем соответствующая цифра. Просто, чётко, информативно. Опять же все одновременно перед глазами.
это я как бы альтернативное мнение предложил.
Ну да, информативно и времени процессоро затратно на этом дисплее.
Работаю с ардуино мега, вполне хватает
Да и на нане хватит. Вот если потом грузить ещё чем то процессоро затратным то могут возникнуть проблемы. Такие трюки лучше использовать с аппаратной поддержкой дисплеем.