Тема конечно старая. Но может у кого хорошее настроение, захочет помочь. Имею 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, то очитска зациклится
не вижу смысла в переменных clearOled и stat - они у вас всегда false и 3 соответствено. Смысл флага в том. чтобы одна процедура программы делала его, к примеру. true. а другая - false
чтобы не было глюков при изменении количества знаков, можно делать тупо вот так Код (C++): oled.setFont((FONTHISKYF21)); oled.setCursor(9,2); oled.print(" ");//нужное количество пробелов чтоб затереть всю предыдущую температуру oled.setCursor(9,2); oled.print((temperature),1); но конечно в прицнипе выводить что-то на экран надо только тогда, когда что-то изменилось, а не каждый раз в цикле просто так.
я правильно понял, что ты тупо выводишь на экран в цикле 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 знака это поможет. Главное чтоб при максимальной длине что-то лишнее не потерлось справа
еще есть способ для эстетов - использовать форматированный вывод с заполнением пробелами. Но вроде ардуина не умеет делать sprintf с дробными числами типа float, но это можно легчайше преодолеть
Задержку просто добавить забыл, извините. Достаточно и одного раза в 4 секунды. Пытаюсь сделать обычный термометр по сути. Спасибо за массу вариантов. Вечером попробую применить.
К сожалению, не вышло применить такой подход. Если делать как в коде и добавить очистку экрана вместе с выводом на экран, то он будет мигать каждый раз при изменении температуры.Без очистки все тоже самое. С пробелом тоже перепроверил, он отрисовывается белой мигающей строкой. А возможно отслеживание количества знаков температуры?
конечно, температуру же измеряет ваша программа Я так и не понял - вы с флагами-то разобрались? или так и чистите экран при каждом проходе луп?
а я не понял как строчка пробелов пожет приводить к белому миганию. что там за экран то? и что за библиотека. ваще, обычные библиотеки олед типа адафрутов в аттини не должны влезать, там памяти не хватит. еще желательно код целиком показать
Не разобрался. У меня два условия чтобы экран обновился один раз когда температура выше 30градусов и один раз когда ниже 30 градусов. У флага два состояния. Вот и выход что экран будет мигать при одном из условий.
откуда такой вывод? какая вообще связь между тем. что флага два и состояния экрана два? Попытайтесь включить логику. Состояния флага никак не связаны с тем. что температура выше 30 или ниже. Состояние флага показывает другое - надо очищать экран или нет. Экран мы очищаем только тогда, когда состояние экрана сменилось. Поэтому вариантов флага только два - экран менялся и экран не менялся. А как экран менялся - нас не интересует. интересует только факт. что это было. Поэтому состояний экрана может быть сколько угодно - хоть десять. двадцать или сто. А флагов в любом случае только два. И вы пытайтесь вникнуть в то. что вам пишут. иначе зачем мы вообще теряем время. А то писали, давали вам советы - вы пишете что ничего не помогает. а по факту оказывается. что вы даже не пробовали! Зачем же врать то?
Библиотека tiny4kOled. Другие либо не влазят либо не смог их понять. Вечером покажу код целиком. Вот так обновляется пробелом
Крайне жаль, что так выглядит(. А как быть с температурой ниже 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);//выводим всё
Либо ТС не понимает в логике, либо я МУДАК. Объясните мне - на кой хер вся эта возня с флагами для аналогывх значений???
так же, как с температурой выше 30... вы опять ничего не поняли Читайте внимательнее - флаг с конкретной температурой никак не связан! Поэтому ваш вопрос "как быть с температурой ниже 30?" - лишен смысла
дело не в аналоговых значениях. Насколько я понял ТС, когда у него меняется число знаков в занчении температуры - на дисплее остается мусор. и вот. вместо того чтобы отслеживать сам факт изменения строчки на экране - он городит какие флаги. пробелы. очистку всего экрана 10 тыс раз в секунду. Главная проблема - не аппаратная, она в понимании - человек просто не понимает. что делает...
Gritsan - если все так плохо - разместите заказа в платном разделе, кто-нить напишет вам код за тысячу-другую... нет сил уже смотреть на эти м;%;довые страдания... чтоб не подозревали меня в корысти - я участвовать в разработке не буду