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

Тема в разделе "Arduino & Shields", создана пользователем Artemka_Ivanov, 29 апр 2019.

  1. Просто вклиниться не могу в ход ваших мыслей. Поправьте, если что.
    У меня 4 ошибки в строке. Скажем я вывел, считая с 0, 8 ошибок, в таком случае, если я правильно понял, я делю на 4. Значит-с 8\4=2. Угу, значит 2-ая строка. Так, здесь вроде понял. А в случае, если у меня 5 ошибок 5\4=1,25 > 1, значит это будет тоже вторая строка, чтож, если все так, то я обязательно попробую ваш способ, а позже отпишусь по этому поводу. Благодарствую
     
  2. Asper Daffy

    Asper Daffy Иксперд

    5/4 = 1 !!!! Запомните, при целочисленном делении остаток ВСЕГДА отбрасывается.

    таким образом

    Ошибка №0 - 0/4 = 0 - строка №0
    Ошибка №1 - 1/4 = 0 - строка №0
    Ошибка №2 - 2/4 = 0 - строка №0
    Ошибка №3 - 3/4 = 0 - строка №0
    Ошибка №4 - 4/4 = 1 - строка №1
    Ошибка №5 - 5/4 = 1 - строка №1
    Ошибка №6 - 6/4 = 1 - строка №1
    Ошибка №7 - 7/4 = 1 - строка №1
    Ошибка №8 - 8/4 = 2 - строка №2
    Ошибка №9 - 9/4 = 2 - строка №2
    ........

    И так далее.

    Кстати, если номер строки - это частное от деления, то номер позиции в строке - это остаток от деления номера ошибки, на количество ошибок в строке. Вот собственно и всё, что Вам нужнно. Всё пишется в три строки!!!!

    Допустим высота строки y пикселей, а ширина одного сообщения x пикселей. Номер ошибки хранится в переменной NO. Тогда позиция для курсора

    stroka = y * (NO / 4);
    stolbec = x * (NO % 4);

    и это ВСЁ! Ставьте курсор в эту позицию и выводите свою ошибку. Чего Вы там развели геморроя на сорок строк!
     
    DetSimen и Andrey12 нравится это.
  3. b707

    b707 Гуру

    Послушайте, Артемка!
    Не сочтите, что я придираюсь к мелочам, но вам надо изучить массивы и циклы.
    Вот этот вот ужас:
    Код (C++):
     byte f1=0;
        byte f2=0;
          byte f3=0;
            byte f4=0;
              byte f5=0;
                byte f6=0;
                  byte f7=0;
                    byte f8=0;
                      byte f9=0;
      if(F[0] == true) {f1=1;}            
      if(F[1] == true) {f2=1;}            
      if(F[2] == true) {f3=1;}
      if(F[3] == true) {f4=1;}            
      if(F[4] == true) {f5=1;}
      if(F[5] == true) {f6=1;}          
      if(F[6] == true) {f7=1;}
      if(F[7] == true) {f8=1;}
      if(F[8] == true) {f9=1;}  
    byte quan=f1+f2+f3+f4+f5+f6+f7+f8+f9;
    по нормальному записывается В ТРИ СТРОКи без всяких переменных :
    Код (C++):
    quan =0;
    for (byte i =0; i< 8; i++) {
      if (F[i]) quan++; }
    Что касается вывода на экран - я думаю что корень проблем - в библиотеке u8g2, точнее в том, что ей надо уметь пользоваться. Честно скажу, яне понимаю концепцию цикла firstpage() nextpage()
     
  4. DIYMan

    DIYMan Guest

    Там фишка в адресации экранных страниц для конкретных контроллеров. Эта обвязка просто нужна, чтобы контроллеронезависимо прописать весь отрисованный в экранном буфере код - в контроллер. она ж тучу дисплеев поддерживает, у каждого - свои заморочки. Автор - решил таким образом сделать, не самым наглядным, но, тем не менее, вполне архитектурно объяснимым.
     
    Andrey12 нравится это.
  5. b707

    b707 Гуру

    Привет! Если ты посмотришь мой код в #10 - он практически это самое и делает, что ты предлагаешь. Я там логических ошибок не вижу. но не работает.
     
  6. b707

    b707 Гуру

    не самым наглядным - мягко сказано :)
    В его Гитхабе висит вопрос, почему вот этот код выводит строчку "PASADAS" не один - а шесть раз:
    Код (C++):
    u8g2.firstPage();
    do {
    Serial.println("PASADAS");
    } while ( u8g2.nextPage() );
    я прочитал обьяснение olikraus-a трижды, внимательно. Вроде не дурак и с английским все хорошо. Но так и не понял. Зато я теперь знаю, что u8g2 в своих проектах лучше не использовать :) - можно налететь на ровном месте.
    Вот ссылка:
    https://github.com/olikraus/u8g2/issues/166
     
    DIYMan нравится это.
  7. DIYMan

    DIYMan Guest

    Зря ты так - нормальная либа. А почему выводит 6 раз - так всё просто: это цикл, и для использованного в вырожденном примере контроллера дисплея - там 6 экранных областей, поэтому 6 раз вызывается отрисовка в МАЛЕНЬКИЙ внутренний экранный буфер, чтобы потом скопировать это на экранную страницу уже дисплея. Всё для экономии оперативы, о чём Оли и говорит ;)
     
    Andrey12 нравится это.
  8. b707

    b707 Гуру

    да-да-да, у Оли тоже все выглядит просто и красиво. Пока не пытаешься сделать что-то, что не описано в примерах. Вопрос на засыпку - как изменить этот код, чтоб вывести строчку не 6, а 4 раза? :)
    Честно - я не знаю ответа.
    Например еще я не знаю, почему именно 6 экранных буферов. Вроде в заголовке использован конструктор с цифрой _1_ в названии - что означает вроде, что экранных буферов два.

    Вообще, на форумах куча вопросов, очень напоминающих этот. И весьма мало ответов. В большинстве случаев советуют пользоваться конструктором с буфером во весь экран - с ним сюрпризов не бывает. Но это убивает все идею либы.
     
  9. DIYMan

    DIYMan Guest

    Ты не понял: 6 областей адресации у ДИСПЛЕЯ, у не буферов в библиотеке. Поэтому, при использовании маленького экранного буфера в библиотеке - надо 6 раз "отрисовать", при этом при каждой "отрисовке" физически происходит заполнение той или иной области дисплея.
     
    Andrey12 и b707 нравится это.
  10. parovoZZ

    parovoZZ Гуру

    У ssd 1306 есть экранный буфер? Вот это новости. Ревизию железа не подскажете?
     
  11. b707

    b707 Гуру

    ОК, пример с шестью строчками перечитал еще раз - вроде стало более понятно.
     
  12. DIYMan

    DIYMan Guest

    Мы про другое, вообще-то. А именно - про особенность конкретной библиотеки, на примере конкретного примера, где экземпляр класса - не для дисплея на контроллере SSD1306:

     
    Andrey12 нравится это.
  13. parovoZZ

    parovoZZ Гуру

    у ТС какой дисплей? Разве не OLED?
     
  14. DIYMan

    DIYMan Guest

    Нет, у ТС другой дисплей, это мы с b707 обсуждаем особенности библиотеки u8glib и u8g2.
     
  15. наверное вывод ошибок как в авто OBD. может посмотреть как там ошибки на экран выводятся