Приходится удерживать кнопку для переключения режимов.

weskar7

✩✩✩✩✩✩✩
12 Мар 2023
8
0
Здравствуйте подскажите пожалуйста почему когда переключаю режимы на короткое нажатие кнопка не реагирует а надо чуть подержать как исправить?
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Потому что в коде есть операторы delay().
Код нужно переписать в неблокирующем режиме, заменив все делеи на миллис
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Что за ардуина у вас?
Для уно-нано
Первой строчкой в setup() вставляете
C++:
Serial.begin(115200);
первой строчкой в loop()
C++:
Serial.println("*");
 

weskar7

✩✩✩✩✩✩✩
12 Мар 2023
8
0
@bort707,у меня нано. И потом в мониторе порта надо посмотреть время?
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
в мониторе порта надо посмотреть время
"Показать отметки времени" внизу слева.


И не забудьте скорость соединения (внизу справа) правильно выставить.

Вывод в монитор скопируйте и выложите в форум - 10-20 строчек
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
472
134
@weskar7,
Ваша задача трудно выполнима, без понимания, что код делает, и насколько его можно изменить.
Например у вас отрисовка экрана занимает 10 секунд. (это не так, это утрирование) Как должна программа реагировать на нажатие кнопки во время отрисовки?
  • Прервать ее и начать выполнять новые действия? Тогда насколько это допустимо для разных этапов прорисовки.
  • Дождаться окончания прорисовки и потом отработать новое нажатие? Но тогда теряется тактильная связь, и это становится похожим на то, что есть сейчас.
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
611
145
А вот интересно режим 2 и 4 срабатывает когда-нибудь? Странный код
C++:
if(digitalRead(3)==HIGH&&flag==0) //если кнопка нажата
// и перемення flag равна 0, то …
{
regim++;
flag=1;
       
regim++;
flag=1;
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
// плюс защита от "дребезга" 100%
if(regim>5) //ограничим количество режимов
{
regim=1;//так как мы используем только одну кнопку,
// то переключать режимы будем циклично
}
}
if(digitalRead(3)==LOW&&flag==1)//если кнопка НЕ нажата
//и переменная flag равна — 1, то …
{
flag=0; //обнуляем переменную "knopka"
}
Вот они современные "программисты" для которых нужны терабайты как ПЗУ, так ОЗУ, десятки гигаГерц тактовой частоты и бесконечное число ядер для выполнения бессмысленных операций.
C++:
myOLED.update();
delay(500);
  myOLED.setFont(MegaNumbers);
  myOLED.print("-", 51, 12);
  myOLED.update();
  delay(500);                       // Пауза
Две паузы по полсекунды
 

weskar7

✩✩✩✩✩✩✩
12 Мар 2023
8
0
@viktor1703, я не говорю что я программист я это собрал и того что уже было . И две паузы уже были в скетче если одну из них убрать то двоеточие на экране времени начинает быстро мигать пробовал. Так вторая строчка закоментироанная. @viktor1703,

@bort707,вот что показывает просто идет время. когда стоит в начале картинка время быстро считается стоит переключить на часы идет как и должно


20:30:55.390 -> *
20:30:55.460 -> *
20:30:55.527 -> *
20:30:55.595 -> *
20:30:55.663 -> *
20:30:55.730 -> *
20:30:55.798 -> *
20:30:55.867 -> *
20:30:55.935 -> *
20:30:56.036 -> *
20:30:56.103 -> *
20:30:56.172 -> *
20:30:56.239 -> *
20:30:56.308 -> *
20:30:56.374 -> *
20:30:56.442 -> *
20:30:56.510 -> *
20:30:56.578 -> *
20:30:56.646 -> *
20:30:56.714 -> *
20:30:56.783 -> *
20:30:56.850 -> *
20:30:56.918 -> *
20:30:56.987 -> *
20:30:57.054 -> *
20:30:57.123 -> *
20:30:57.191 -> *
20:30:57.260 -> *
20:30:57.327 -> *
20:30:57.428 -> *
20:30:57.496 -

@weskar7,закоментировал все delay стало переключаться лучше. но теперь не мигает двоеточие времени
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
за 56-ую секунду кнопка была опрошена 15 раз, что довольно медленно для любого кода. Энкодер например вообще работать откажется с такой скоростью. И для того что бы кнопка сработала надо что бы было зафиксировано 2 ее состояния, а это от одного до 2-х циклов, т.е. подержать ее придется 0,07 - 0,15 секунды. В принципе не долго, но это если не сработают другие задержки.

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

Вот тут хорошая статья https://community.alexgyver.ru/threads/programmirovanie-konechnyx-avtomatov-bez-delay.2657
 

weskar7

✩✩✩✩✩✩✩
12 Мар 2023
8
0
@Старик Похабыч,да если убрать один delay с времени то двоеточие начинает быстро мигать... а что надо сделать чтоб не надо было держать?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
Стараться не использовать delay. Есть случаи когда оно полезно, но это как правило алгоритмы, не делающие несколько параллельных дел.
Прочитать статью, ссылку на которую и я привел выше.
Учиться программировать

По миллис я вот тут еще расписывал https://community.alexgyver.ru/threads/pomigaem-svetodiodom-opjat.4493/

Дисплей как я понимаю i2c, черно-белый, 128х64 ?
Тут надо понять, что скорость обновления такого дисплея хоть и может достигать в прыжке 10 кадров в секунду, в целом остается довольно медленной.
Поэтому 1-ое что надо сделать определиться как часто надо обновлять экран ? А может его надо обновлять не по времени , а по изменениям данных ? Но это дополнительные вопросы, на будущее.
Допустим у вас дисплей обновляется как надо и достаточно часто.
Задача выводить знак ":" или пустое место " " в нужное время.
Самое простое решение всегда выводить переменную в нужное место. Допустим это будет переменная
char dvoetochie
Тогда применяя миллис из конечных автматов можно сделать такой код:
C++:
char dvoetochie=":";
...
static tmr_dv=millis();
if (millis()-tmr_dv>499)
{
    tmr_dv=millis();
    if (dvoetochie==':') dvoetochie=" ";
    else dvoetochie=":";
}
Такой код будет менять символ хранящийся в переменной dvoetochie c пробела на двоеточие и обратно каждые 500 мс, т.е. раз в пол секунды.
И никакого delay!
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
Переменная должна быть глобальной, а код в цикле loop
Но и вывод двоеточия надо тоже править.

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

а базовый уровень это :
1) Уметь читать простой код и понимать его . Есть любители завернуть все в такие идиомы, что волосы дыбом. Об этом речи нет. Но это подразумевает базовые знания языка программирования.
2) Уметь находить ошибки и исправлять их
3) Прошивать платы самостоятельно
4) Уметь ставить библиотеки , библиотеки нужной версии!
5) Понимать как подключать устройства без схемы, речь не идет о сложных подключениях, где возможны варианты, но таких не так уж и много на начальном этапе.
6) Ну копировать проекты, правильно их переносить с одного пк на другой.

Кто еще что придумает - дополняйте.
 

weskar7

✩✩✩✩✩✩✩
12 Мар 2023
8
0
@Старик Похабыч, просто за то время сколько выдумали что мне написать вы уже 100 раз могли поправить код и я бы вам был благодарен. просто не понимаю смысла зачем тогда писать если не хотите помочь.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
100 раз могли поправить код
Работа она дураков любит, да.
Но т.к. код изначально кривой, то я жалею свои глаза и нервную систему.
А если у Вас много благодарности, то Вам в раздел заказов. А тут раздел программирования, я пытался чему то научить, но не на то поле зерно бросаю. Хотя есть несколько человек, с которым я с удовольствием помогаю чем могу. У низ есть главное - желание научиться.
 
  • Лойс +1
Реакции: poty

bort707

★★★★★★✩
21 Сен 2020
3,058
910
за то время сколько выдумали что мне написать вы уже 100 раз могли поправить код
Это было бы плохой услугой. Если вам дать готовый код - вы ничему не научитесь. И когда вам понадобится изменить еще пару строчек в программе - снова упретесь в тупик.
Правильный подход - это учиться писать самому. Да, я могу поправить этот код за час, а у вас это займет месяц. Ничего страшного. Зато спустя месяц вы будете знать, как пишутся неблокирующие программы и следующий код напишете значительно быстрее. В итоге выиграют все, и вы - в первую очередь.
 
  • Лойс +1
Реакции: poty

poty

★★★★★★✩
19 Фев 2020
3,233
942
Вообще не понимаю, зачем заниматься программированием, если нет ни знаний, ни интереса? Результат будет нулевой в любом случае.
Для реализации собственных идей чужими руками есть масса других способов, включая раздел предложения идей на этом сайте. По крайней мере силы участников не будут использованы втёмную, как сейчас.
Ну, а если есть организаторские способности, то существуют краудфандинговые платформы. Собираете коллектив, выходите с предложением, получаете финансирование, оплачиваете работу профессиональных программистов. Да, придётся подтянуть как презентационный компонент, так и ответственность на себя взять.