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

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

  1. Gritsan

    Gritsan Нерд

    • 4.1 — Некропостинг
    Тема конечно старая. Но может у кого хорошее настроение, захочет помочь.
    Имею tinny 85 и OLED экран, подключение по i2c.
    Если в цикле обновлять(очищать) экран, то получаю мигание. Без очистки все работает, пока температура не изменит количество знаков и соответственно, оставляет "мусор". Хочу очищать экран один раз, когда температура станет менее 10 градусов и еще раз если станет выше.
    Но как правильно сделать это не могу сообразить.
    Код (C++):
     }
       float temperature =  ((data[1] << 8) | data[0]) * 0.0625; //температура
                                                            //if(ON!=1)      очистка при включении
                                                            //{oled.clear();
                                                            // ON=1;}
     
         if(clearOled == false&&stat==1)      //если очистки не было и ...
         {oled.clear();
         clearOled = false;
         stat=3;}                     // чтобы очитска выполнилась один раз

       
          if(temperature>30&&stat==3)  // вывод температуры больше 30
          {oled.setCursor(10, 0);
          oled.setFont(FONT6X8);
          oled.print(F("TEMP:"));

           oled.setFont((FONTHISKYF21));
          oled.setCursor(9,2);
          oled.print((temperature),1);
          oled.setCursor(50,2);
           oled.print(F("/"));
           clearOled = false;}         //очитска была

           if(temperature<30&&stat==3)     вывод температуры меньше 30
           {oled.setCursor(10, 0);
          oled.setFont(FONT6X8);
          oled.print(F("TEMP+:"));

           oled.setFont((FONTHISKYF21));
          oled.setCursor(9,2);
          oled.print((temperature),1);
          oled.setCursor(50,2);
           oled.print(F("/"));
           clearOled = false;}              //очистка была, но если false, то очитска зациклится
     
  2. b707

    b707 Гуру

    не вижу смысла в переменных clearOled и stat - они у вас всегда false и 3 соответствено.
    Смысл флага в том. чтобы одна процедура программы делала его, к примеру. true. а другая - false
     
    Gritsan нравится это.
  3. akl

    akl Гуру

    чтобы не было глюков при изменении количества знаков, можно делать тупо вот так
    Код (C++):

    oled.setFont((FONTHISKYF21));
    oled.setCursor(9,2);
    oled.print("     ");//нужное количество пробелов чтоб затереть всю предыдущую температуру
    oled.setCursor(9,2);
    oled.print((temperature),1);
     
    но конечно в прицнипе выводить что-то на экран надо только тогда, когда что-то изменилось, а не каждый раз в цикле просто так.
     
    Gritsan нравится это.
  4. Gritsan

    Gritsan Нерд

    С пробелами пробовал, отрисовавыется белая мигающая строчка.
     
  5. Gritsan

    Gritsan Нерд

    Это я испытывал разные комбинации. В итоге или экран обновляется всегда или не обновляется.
     
  6. akl

    akl Гуру

    я правильно понял, что ты тупо выводишь на экран в цикле 100 тысяч раз в секунду?
    надо отслеживать изменения переменных, типа вот так
    Код (C++):

    if(temperature_old!=temperature){//если температура или еще че поменялось
       temperature_old=temperature;
       refresh_flag=1;//взводим флаг
    }
    if(davlenie_old!=davlenie){//так все выводимые переменные
       davlenie_old=davlenie;
       refresh_flag=1;//взводим флаг
    }
    ......
    .....
    if(refresh_flag){//видим что флаг поднялся
      refresh_flag=0;
       oled.setFont((FONTHISKYF21));
    oled.setCursor(9,2);
      oled.print((temperature),1);//выводим всё
       oled.print((davlenie),1);//выводим всё и т.д.

    }
     
    можно все команды экранные собрать в одну кучу и реагировать на поднятие флага (refresh_flag), можно отдельно по месту регистрации изменения выводить конкретную величину, но удобнее весь экран в одну функцию запихивать и передавать сигнал на обновление экрана.

    Ну и опрашивать датчики надо с разумной скоростью, а то если показания будут 100 раз в секунду меняться, то и экрану будет тяжко

    еще как можно делать с пробелами
    Код (C++):

    oled.print((temperature),1);
    oled.print("  ");
     
    то есть после цифр всегда дописывать пару пробелов, если длина цифр будет меняться на 1-2 знака это поможет. Главное чтоб при максимальной длине что-то лишнее не потерлось справа
     
    issaom и Gritsan нравится это.
  7. akl

    akl Гуру

    еще есть способ для эстетов - использовать форматированный вывод с заполнением пробелами. Но вроде ардуина не умеет делать sprintf с дробными числами типа float, но это можно легчайше преодолеть
     
  8. Gritsan

    Gritsan Нерд

    Задержку просто добавить забыл, извините.
    Достаточно и одного раза в 4 секунды. Пытаюсь сделать обычный термометр по сути.
    Спасибо за массу вариантов. Вечером попробую применить.
     
  9. Gritsan

    Gritsan Нерд

    :(К сожалению, не вышло применить такой подход. Если делать как в коде и добавить очистку экрана вместе с выводом на экран, то он будет мигать каждый раз при изменении температуры.Без очистки все тоже самое. С пробелом тоже перепроверил, он отрисовывается белой мигающей строкой.
    А возможно отслеживание количества знаков температуры?
     
  10. b707

    b707 Гуру

    конечно, температуру же измеряет ваша программа :)

    Я так и не понял - вы с флагами-то разобрались? или так и чистите экран при каждом проходе луп?
     
    Gritsan нравится это.
  11. akl

    akl Гуру

    а я не понял как строчка пробелов пожет приводить к белому миганию. что там за экран то? и что за библиотека. ваще, обычные библиотеки олед типа адафрутов в аттини не должны влезать, там памяти не хватит.

    еще желательно код целиком показать
     
  12. Gritsan

    Gritsan Нерд

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

    b707 Гуру

    откуда такой вывод? какая вообще связь между тем. что флага два и состояния экрана два?

    Попытайтесь включить логику.
    Состояния флага никак не связаны с тем. что температура выше 30 или ниже. Состояние флага показывает другое - надо очищать экран или нет. Экран мы очищаем только тогда, когда состояние экрана сменилось. Поэтому вариантов флага только два - экран менялся и экран не менялся. А как экран менялся - нас не интересует. интересует только факт. что это было.
    Поэтому состояний экрана может быть сколько угодно - хоть десять. двадцать или сто. А флагов в любом случае только два.

    И вы пытайтесь вникнуть в то. что вам пишут. иначе зачем мы вообще теряем время.
    А то писали, давали вам советы - вы пишете что ничего не помогает. а по факту оказывается. что вы даже не пробовали! Зачем же врать то?
     
  14. Gritsan

    Gritsan Нерд

    Библиотека tiny4kOled. Другие либо не влазят либо не смог их понять.
    Вечером покажу код целиком.[​IMG] Вот так обновляется пробелом
     
    Последнее редактирование: 4 авг 2021
  15. parovoZZ

    parovoZZ Гуру

    А что за экран? Очищать его за кой?
     
    Feofan нравится это.
  16. Gritsan

    Gritsan Нерд

    Крайне жаль, что так выглядит(. А как быть с температурой ниже 30? Еще один флаг добавить? Пишу по памяти с телефона, с ошибками конечно.


    Код (C++):
    bool refresh_flag=0;.  //флаг обновления
    int old_temp;

    if(temperatura>30)         //если выше 30
    {temperatura=old_temp}       //температура не сменилась
    bool refresh_flag=0;.       // Флаг опущен

    if(temp_old!=temperature)       //если не равна-сменилась.
    {oled.clear(); }
    refresh_flag=1;       //очищаем экран и поднимаем флаг.


    if (refresh_flag){         //видим что флаг поднялся
      refresh_flag=0;
       oled.setFont((FONTHISKYF21));
    oled.setCursor(9,2);
      oled.print((temperature),1);//выводим всё


     
     
    Последнее редактирование: 4 авг 2021
  17. parovoZZ

    parovoZZ Гуру

    Либо ТС не понимает в логике, либо я МУДАК. Объясните мне - на кой хер вся эта возня с флагами для аналогывх значений???
     
  18. b707

    b707 Гуру

    так же, как с температурой выше 30...

    вы опять ничего не поняли :(
    Читайте внимательнее - флаг с конкретной температурой никак не связан! Поэтому ваш вопрос "как быть с температурой ниже 30?" - лишен смысла
     
  19. b707

    b707 Гуру

    дело не в аналоговых значениях.
    Насколько я понял ТС, когда у него меняется число знаков в занчении температуры - на дисплее остается мусор.
    и вот. вместо того чтобы отслеживать сам факт изменения строчки на экране - он городит какие флаги. пробелы. очистку всего экрана 10 тыс раз в секунду.

    Главная проблема - не аппаратная, она в понимании - человек просто не понимает. что делает...
     
  20. b707

    b707 Гуру

    Gritsan - если все так плохо - разместите заказа в платном разделе, кто-нить напишет вам код за тысячу-другую... нет сил уже смотреть на эти м;%;довые страдания...

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