Кнопка в Arduino

EugeneFrol

★✩✩✩✩✩✩
17 Апр 2024
62
11
50
Итак, Вы нажали на кнопку - на пине D2 5-вольт и что происходит дальше?
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
652
103
При нажатии на кнопку на пин 2 подаю 5 вольт( в исходном состоянии пин через резистор на корпусе) и ничего не происходит, диод не светит.
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
652
103
Взял мультиметр, прозвонил всё, оказалось макетка подвела, не было одного контакта. Теперь знаю несколько способов для нажатия кнопки. Наверное самый лучший способ по прерыванию кнопки. Благодарю всех за участие.
 
Изменено:

SlavaZagaynov

★✩✩✩✩✩✩
27 Ноя 2019
196
37
www.youtube.com
@VictorArx, ' э, ты куда,
а какже сенсорные кнопки?
они прикольные, с индикатором, без дребезга, есть разные режимы работы, можно антенку допаять.
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
652
103
Записал ещё код, работает, всё переключает. Один нюанс в мониторе порта отображается двойное нажатие кнопки, хотя нажимаю один раз.
C++:
const byte button =  2;
const byte led =  5;

volatile boolean state = false;


void setup() {
pinMode(button, INPUT);
pinMode(led, OUTPUT);

attachInterrupt (0, button_press, RISING);

Serial.begin(9600);


}

void loop() {
digitalWrite (led, state);
}

void button_press () {
static unsigned long millis_prev;

if (millis() - 100  > millis_prev)state = !state; //

millis_prev = millis();






if (state) Serial.println("Кнопка нажата");
        else Serial.println("Кнопка отпущена");


}
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
3,379
980
Один нюанс в мониторе порта
Запомните правило - в общем случае в обработчике прерывания (у вас это - функция button_press() ) - нельзя обращаться к Serial.
Вам еще повезло, что программа работает, вообще-то она должна была зависнуть.
 
  • Лойс +1
Реакции: VictorArx

poty

★★★★★★★
19 Фев 2020
3,599
1,028
@VictorArx, во-первых, при вычислении интервалов нужно отнимать предыдущее время от текущего и сравнивать с интервалом.
Во-вторых, если статус меняется после выполнения условия, то и выводить его нужно внутри отработки условия.
В-третьих, @bort707, прав: внутри прерывания использовать сложные функции нельзя, особенно, если они также работают на прерываниях.
 

bort707

★★★★★★✩
21 Сен 2020
3,379
980
Во-вторых, если статус меняется после выполнения условия, то и выводить его нужно внутри отработки условия
И в третьих, сбрасывать миллис на предыдущее значение тоже надо внутри условия.
В общем на пять строчек обработчика прерывания пять ошибок...
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
652
103
@bort707, это можно как то исправить, чисто из спортивного интереса или это невозможно? Если можно исправьте 5 ошибок.

@poty, если я правильно понял, это практически нельзя исправить, внутри условия тоже сериалы ставил.
 

bort707

★★★★★★✩
21 Сен 2020
3,379
980
Если можно исправьте 5 ошибок.
Во-первых, у вас переменная state отображает не состояние кнопки, а включение-выключение светодиода. Поэтому сообщение в Сериал надо поправить.
А для остального надо просто добавить скобки
C++:
void button_press () {
static unsigned long millis_prev;

if (millis() - millis_prev > 100) {
    state = !state;
    millis_prev = millis();
    if (state) Serial.println("Лампочка горит");
    else Serial.println("Лампочка выключена");
  }
}
И да, я же вас предупреждал, что Сериал внутри прерывания лучше не использовать? - не привыкайте к неправильному. А то потом будете сидеть и думать, почему у вас программа виснет
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
652
103
@bort707, благодарствуйте, подправил код и всё работает, как надо. Ошибка не в нужное место вставил
state = !state;
 

SlavaZagaynov

★✩✩✩✩✩✩
27 Ноя 2019
196
37
www.youtube.com
ради интереса поискал что-же пишут в интернетах про прерывания и обработку кнопок по прерыванию.
и немножко офигел, кругом дичь и тупость.
адекватное описание и примеры нашел там...
там про 8266, возможно есть такое же и для уны