Вывод ошибок на oled displey

Valerkaaa
Valerkaaa аватар
Offline
Зарегистрирован: 08.09.2017

Здравствуйте форумчане, прошу вас помочь мне чем сможете. 

Задача заключается в том, чтобы считывать ошибки нескольких датчиков и выводить их на 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. Через математику 

Но как и что написать я не представляю. 



Вроде все разжевал, будут вопросы - поясню. Жду ваших ответов, заранее благодарствую

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Ну так введите в строку символ перевода строки. Если не изменяет память /n

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

изменяет. '\n'

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Мне вот интересно. На этот скетч оперативочки хватает :))

VladimirTsibrov
Offline
Зарегистрирован: 05.03.2019

Принципиально вставлять переносы и вызывать setCursor() только 1 раз?

Почему нельзя сделать просто вывод F0x на дисплей, при каждом выводе инкрементировать переменную-счетчик? Досчитали до четырех - очередной вызов setCursor(). Соответственно, вывод ошибки на дисплей придется вынести в отдельную функцию, в ней сделать проверку этого счетчика. Можно не напрямую на дисплей выводить, а в буфер - не суть. И стринги все эти будут не нужны.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Сам себе проблемы творишь ... чтобы стойко их побеждать.

В чём смысл букв "FO", если они одинаковы для каждого датчика?

Сколько их у тебя там? Допустим 16. Напиши на экране в два ряда цифры от 1 до 8. Если датчик включён и работает нормально - включается нужная цифра. Если датчик неисправен или КЗ какое - пусть моргает флешем соответствующая цифра. Просто, чётко, информативно. Опять же все одновременно перед глазами.

это я как бы альтернативное мнение предложил.

nik182
Offline
Зарегистрирован: 04.05.2015

Ну да, информативно и времени процессоро затратно на этом дисплее.

Valerkaaa
Valerkaaa аватар
Offline
Зарегистрирован: 08.09.2017

Работаю с ардуино мега, вполне хватает 

nik182
Offline
Зарегистрирован: 04.05.2015

Да и на нане хватит. Вот если потом грузить ещё чем то процессоро затратным то могут возникнуть проблемы. Такие трюки лучше использовать с аппаратной поддержкой дисплеем.