Код на картинке работает неправильно. При нажатии кнопки в консоли должна появиться надпись 1 раз. Но надпись бесконечно пишется. Помогите решить проблему. Я джун, не судите пжлст.
Код вставляется в текст сообщения. Между отправками нет проверок на то, было ли уже отправлено сообщения для текщего нажатия, поэтому сообщения будут отправляться постоянно, пока зажата кнопка. Решение — флаги. Как пример: Кнопочный переключатель.
Дело в том, что конструкция Код (C++): void loop() { // put your main code here, to run repeatedly: } есть бесконечный цикл. Он выполняется постоянно и непркрывно. Как только микроконтроллер дойдёт до нижней фигурной скобки }, он перейдёт к верхней { и начнётся всё с начала. При рабочей частоте в 16 МГц, в вашем случае, будет выполняться несколько тысяч раз в секунду. Даже при самом кратком нажатии на кнопку он успеет прокрутиться много-много раз. И каждый раз он будет проверять нажатие кнопки, обнаруживать её и слать в serial ваше сообщение. Это очень, очень кратко. А что-бы в этом разобраться надо учить теорию.
Код (C++): pinMode(A0, INPUT_PULLUP); ... boolean button = degitalRead(A); if(button == 1) {...} Подозреваю, что с такими настройками состояние нажатой кнопки должно быть равно "0", а не "1".
1. Входы А0-А5 ценны свойствами аналогового входа. Нафига на них вешать примитивные кнопки ? Для этого есть тупые цифровые пины. 2. Если там INPUT_PULLUP - значит состояние не нажатой кнопки ==1, тк подключен внутренний резистор подтяжки входа к плюсу питания. Соответственно кнопка должна притягивать в ноль и код надо переделать под ноль. Дребезг кнопки обычно не больше 50 миллисекунд. После первого обнаруженного нуля засекаем время. Через 50 мсек - снова читаем. Если ноль сохраняется - выставляем флаг "обнаружено нажатие".
в атиньке каждый вход - аналоговый. Теперь что - вообще дискретные сигналы никуда не подавать? А если в схеме аналоговых сигналов вообще нет? у самой разбитой кнопки - не дольше 20.
Больше Дела-меньше слов! Код (Text): bool state = true; //флаг взведен void setup() { pinMode(A0, INPUT); //A0 это вход! Serial.begin(9600); } void loop() { if (digitalRead(PIR)&&(state)) { // если включился датчик и флаг взведен Serial.println("Goodnight moon!"); //пишем письма state=false; // Сбросим флаг шоб никогда более } }
Система должна флаг снова взвести чтобы очередное нажатие отследить. Надо задержку делать, чтоб понять - кнопку отпустили или это всё еще дребезг жужжит. А то по вашему коду получится - посмотрел на Луну и "помер". Не все АТмеловские процессоры - АТтини >)))
Согласен не по фен шую антидребезг, Гайвер Батон, и другие рок Звёзды. Задача была другая показать ТС-Как? Дальше пусть сам умные книшки читает. Это один из способов-в лоб. Есть ещё 100500. Хотя у меня работает и так на Эхо-репитере без антидребезгов кусок кода оттуда выдран.
Вот вы разошлись-то ТС только от одной новости, что LOOP это цикл - уже в осадок выпал и в ветке не появляется. а вы ему дребезг принялись обьяснять