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("Кнопка отпущена");
}
Запомните правило - в общем случае в обработчике прерывания (у вас это - функцияОдин нюанс в мониторе порта
button_press() ) - нельзя обращаться к Serial.И в третьих, сбрасывать миллис на предыдущее значение тоже надо внутри условия.Во-вторых, если статус меняется после выполнения условия, то и выводить его нужно внутри отработки условия
Во-первых, у вас переменная state отображает не состояние кнопки, а включение-выключение светодиода. Поэтому сообщение в Сериал надо поправить.Если можно исправьте 5 ошибок.
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("Лампочка выключена");
}
}