Помогите с флагом для реле

Тема в разделе "Arduino & Shields", создана пользователем A.R., 25 дек 2017.

  1. parovoZZ

    parovoZZ Гуру

    ничего там не мигает. Экран выкинь и купи новый.
     
  2. akl

    akl Гуру

    если при обновлении сначала сделать экран.клир(), а потом выводить новое, то оно моргнет. Если делать это 100 раз в секунду (так часто оно не сможет конечно, там будет 10-20 раз максимум) то естественно будет дико мерцать. Но вообще делать клир() нет смысла - надо просто писать поверх старого
     
  3. parovoZZ

    parovoZZ Гуру

    зачем очищать экран, если новые данные полностью затирают прежние???
     
  4. parovoZZ

    parovoZZ Гуру

    Работайие по SPI - там скорости другие. Очистка с последующей отрисовкой на глаз видна не будет.
     
  5. akl

    akl Гуру

    дак у ТСа (то есть у Гристана) новые данные не полностью затирают старые, а при попытке затереть пробелами какие-то белые квадраты появляются. Там вообще непонятно что накручено, возможно даже память переполняется учитывая ее количество.
     
    Gritsan нравится это.
  6. Gritsan

    Gritsan Нерд

    Это не только у меня, есть тут тема на форуме у человека тоже: " отрисовка пробела для экрана ткая же, как и отрисовка цифры 4, к примеру. Там логика такова, что он не заменяет ранее засвеченные пикселы, а с каждым новым выводом как будто дорисовываются новые, а старые не гасятся. Символ 0 для него - это не перевести пиксел в положение "выключено", а просто не рисовать на этом пикселе ничего". Не очень понятно) но я не один такой. Попробую просто код с библиотекой экрана и одним символом, ради интереса.
     
  7. akl

    akl Гуру

    если там какая-то такая кривая библиотека, то проще всего выкинуть эту аттини и взять ардуину нано или про-микро или типа того и использовать вот эту библиотеку
    https://github.com/NikolayDikiy/ASOLED
     
    Gritsan нравится это.
  8. parovoZZ

    parovoZZ Гуру

    выкинь это всё. Аттини не для библиотек. Там надо делать всё ручками. Сбрасывать в SSD1306 ничего не надо. Закинул в ОЗУ, дёрнул D/C и всё - картинка на экране.
     
  9. Gritsan

    Gritsan Нерд

    Я бы и рад, но как видите, без примера я не смогу это все сделать.
     
  10. b707

    b707 Гуру

    это не кривая библиотека, а принцип рисования фонтов с прозрачным фоном - символы фона не рисуются. а просто пропускаются.
    Например. все фонты в очень известной и раскрученной либе Adafruit_GFX работают именно так.
    Прозрачный фон букв позволяет выводить текст по изображению.
    Вот. для иллюстрации - прозрачный и непрозрачный текст (условно. конечно)
    [​IMG]
    Минус такого фонта - если нужно выести новую надпись поверх старой - то старую сначала надо явно стереть, а лишь потом выводить новую.
    Что. видимо. и создает проблемы ТС
     
    akl нравится это.
  11. parovoZZ

    parovoZZ Гуру

    В OLED экране это нафига?
     
  12. akl

    akl Гуру

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

    b707 Гуру

    если фонт был изначально без фона. переделать алгоритм не так просто.
    Я это проходил в библиотеке для светодиодных матриц - это нетривиальная задача.
    Проще выводить как есть... скорее всего так авторы библиотеки и поступили, переложив проблему очистки на юзеров :)
     
  14. parovoZZ

    parovoZZ Гуру

    а нафига там вообще библиотека? Экран простейший. Там код даже проще, чем ШИМ светодиода.
     
  15. Gritsan

    Gritsan Нерд

    Если интересно как выглядит обновление пробелами

    В целом даже красивый спец.эффект:)
    Всем огромное спасибо, особенно akl
    Код (C++):
    uint32_t myTimer1;
    //bool refresh_flag=false;
    int temperature_old;
    #include <OneWire.h>
    #include <Tiny4kOLED.h>     //библтотека OLED
    #include "HISKYF21_font.h"  // шрифт const DCfont *currentFont = FONTHISKYF21;

    OneWire ds(4); // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком

    void setup(){
       oled.begin(64, 48, sizeof(tiny4koled_init_64x48r), tiny4koled_init_64x48r);
       oled.clear();
       oled.on();
       }
    void loop(){


      byte data[2];         // Место для значения температуры  // Определяем температуру от датчика DS18b20
      ds.reset();           // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
      ds.write(0xCC);       // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство
      ds.write(0x44);       // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память

      if (millis() - myTimer1 >= 5000) {
       myTimer1 = millis();
        ds.reset();          // Теперь готовимся получить значение измеренной температуры
        ds.write(0xCC);
        ds.write(0xBE);      // Просим передать нам значение регистров со значением температуры
        data[0] = ds.read(); // Получаем и считываем ответ. Читаем младший байт значения температуры
        data[1] = ds.read(); // А теперь старший
        float temperature =  ((data[1] << 8) | data[0]) * 0.0625; //вычесление температуры
     
        if(temperature_old!=temperature)
        {temperature_old=temperature;
     
          oled.setCursor(16, 0);
          oled.setFont(FONT6X8);
          oled.print(F("TEMP:"));         //заголовок
          oled.setFont((FONTHISKYF21));  //огромный шрифт
          oled.setCursor(9,2);
          oled.print(F(" ..  "));        //точки вместо пробела, менее заметны при обновлении
          oled.setCursor(9,2);
          oled.print((temperature),1); //вывод температуры
          oled.setCursor(50,2);
          oled.print(F("/"));         //знак цельсия
          }
       }
      }
     
  16. b707

    b707 Гуру

    Gritsan
    ну что, задача решена? отмучались?
     
  17. Gritsan

    Gritsan Нерд

    Нет)) рано обрадовался. Пробелы тоже остаются как мусор, белым квадратом. Если что то толковое получится напишу. Спасибо еще раз
     
  18. akl

    akl Гуру

    команды для датчика температуры убери из основного цикла вовнутрь 5-секундного, а то он теребонькается тысячи раз в секунду

    что с этими пробелами непонятно. Я хз насчет всяких там прозрачных шрифтов, но мне кажется у прозрачных шрифтов и пробел должен быть прозрачный, а он типа инвертированный получается.

    попробуй вместо принт("5 пробелов") сделать
    oled.writeAsciiInternal(' ');
    oled.writeAsciiInternal(' ');
    oled.writeAsciiInternal(' ');
    oled.writeAsciiInternal(' ');
    oled.writeAsciiInternal(' ');
    вот так 5 раз
     
    Последнее редактирование: 5 авг 2021
    Gritsan нравится это.
  19. akl

    akl Гуру

    еще желательно это проверить на обычном нормальном шрифте, а то этот огромный FONTHISKYF21 как-то не очень понятно откуда взят и почему вдруг он стал огромный, если это он https://github.com/datacute/TinyOLED-Fonts/blob/master/src/HISKYF21_font.h то там обычный 6х8
     
  20. Gritsan

    Gritsan Нерд

    Шрифт рисовал сам. Там только цифры и несколько знаков, за основу брал подобный цифровой шрифт из этой же папки. Точно, пробел то я не добавлял в шрифт....
    Стыдно
     
    akl нравится это.