мне нужен простой скетч для управления 1 светодиодом двумя кнопками. 1 кнопка имеет нормально разомкнутый контакт(но) 2-я нормально замкнутый(нз) Логика работы такая. При первом нажатии на 1-ю кнопку(контакт но) светодиод должен загореться и не тухнуть при отпускании Если при зажженом светодиоде нажать вторую кнопку ( контакт нз) то светодиод должен потухнуть и не загораться при отпускании кнопки. При втором нажатии на 1-ю кнопку (контакт но) светодиод должен потухнуть, и так по кругу
Алиса
Разберу задачу пошагово и предоставлю готовый скетч для Arduino.
Логика работы
- Кнопка 1 (НО — нормально разомкнутая): при нажатии включает светодиод, который остаётся включённым после отпускания кнопки.
- Кнопка 2 (НЗ — нормально замкнутая): при нажатии выключает светодиод, который остаётся выключенным после отпускания.
- Второе нажатие кнопки 1 выключает светодиод — и так по кругу.
Схема подключения
- Светодиод: анод через резистор 220 Ом к пину 13, катод к GND.
- Кнопка 1 (НО): один контакт к GND, второй к пину 2, также подключить подтягивающий резистор 10 кОм от пина 2 к 5 В.
- Кнопка 2 (НЗ): один контакт к 5 В, второй к пину 3, также подключить стягивающий резистор 10 кОм от пина 3 к GND.
Скетч для Arduino
cpp
// Пины подключения
const int ledPin = 13; // Пин светодиода
const int button1Pin = 2; // Пин кнопки 1 (НО)
const int button2Pin = 3; // Пин кнопки 2 (НЗ)
// Переменные состояния
int ledState = LOW; // Текущее состояние светодиода
int button1State; // Текущее состояние кнопки 1
int lastButton1State = HIGH; // Предыдущее состояние кнопки 1 (для антидребезга)
int button2State; // Текущее состояние кнопки 2
int lastButton2State = LOW; // Предыдущее состояние кнопки 2 (для антидребезга)
// Для антидребезга
unsigned long lastDebounceTime1 = 0;
unsigned long lastDebounceTime2 = 0;
const unsigned long debounceDelay = 50; // Задержка антидребезга в мс
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);
digitalWrite(ledPin, ledState);
}
void loop() {
// Читаем состояние кнопок
int reading1 = digitalRead(button1Pin);
int reading2 = digitalRead(button2Pin);
// Обработка антидребезга для кнопки 1
if (reading1 != lastButton1State) {
lastDebounceTime1 = millis();
}
if ((millis() - lastDebounceTime1) > debounceDelay) {
if (reading1 != button1State) {
button1State = reading1;
if (button1State == LOW) { // Кнопка 1 нажата (НО контакт замыкается на GND)
ledState = !ledState; // Инвертируем состояние светодиода
}
}
}
// Обработка антидребезга для кнопки 2
if (reading2 != lastButton2State) {
lastDebounceTime2 = millis();
}
if ((millis() - lastDebounceTime2) > debounceDelay) {
if (reading2 != button2State) {
button2State = reading2;
if (button2State == HIGH) { // Кнопка 2 нажата (НЗ контакт размыкается от 5 В)
ledState = LOW; // Выключаем светодиод
}
}
}
// Обновляем состояние светодиода
digitalWrite(ledPin, ledState);
// Сохраняем текущие состояния для следующего цикла
lastButton1State = reading1;
lastButton2State = reading2;
}
Пояснения к коду
- Антидребезг (debouncing): кнопки могут давать ложные срабатывания при нажатии из‑за дребезга контактов. Код использует задержку 50 мс для фильтрации ложных сигналов.
- Логика кнопок:
- Кнопка 1 (НО): в покое — 5 В (HIGH), при нажатии — GND (LOW).
- Кнопка 2 (НЗ): в покое — 5 В (HIGH), при нажатии — разрыв цепи (может быть LOW).
- Состояние светодиода хранится в переменной ledState и меняется только при подтверждённом нажатии кнопки.
Проверка работы
- Загрузите скетч в Arduino.
- Нажмите кнопку 1 — светодиод должен загореться.
- Нажмите кнопку 2 — светодиод должен погаснуть.
- Нажмите кнопку 1 снова — светодиод погаснет (или загорится, если был выключен).