ARDUINO 2 кнопки и светодиод

Dimzik280

✩✩✩✩✩✩✩
26 Май 2024
1
0
Рекомендуется оформить вопрос в соответствии с правилами раздела
Помогите пожалуйста, я не могу написать нормальный код.
Я бы хотел чтобы светодиод включался одной кнопкой, а выключался другой. Если можно, то чтобы при этом мигал. Потом попробую сам сделать чтобы при нажатии кнопки на включение светодиода включался звук в МП3 модуле, а на отключение светодиода звук будет останавливаться.

P.S. Пытаюсь сделать кнопку АЗ-5 для умного дома на закрытие двери.
 

gsmtest

✩✩✩✩✩✩✩
3 Июн 2024
4
0
Arduino 2 кнопки:
#include <avr/io.h>
#include <avr/interrupt.h>

// Настройка режимов работы пинов
void setup() {
  pinMode(13, OUTPUT); // пин светодиода
 // pinMode(12, OUTPUT); // пин выход управления
  pinMode(3, INPUT_PULLUP);   // пин кнопка ВЫКЛ
  pinMode(2, INPUT_PULLUP);   // пин кнопка ВКЛ
}

// Основной цикл программы
void loop() {
  // Чтение состояния пинов 2 и 3
  if (digitalRead(2) == LOW) {
    // Если кнопка на пине 2 нажата, устанавливаем HIGH на пинах 12 и 13
    //digitalWrite(12, HIGH);
    digitalWrite(13, HIGH);
  } else if (digitalRead(3) == LOW) {
    // Если кнопка на пине 3 нажата, устанавливаем LOW на пинах 12 и 13
    //digitalWrite(12, LOW);
    digitalWrite(13, LOW);
  }
}
 

Сузунец

✩✩✩✩✩✩✩
19 Июн 2024
18
8
42
Сузун
Вот набросал код с "мигалкой":
C++:
#define LED_PIN 13        // Пин к которому подключен светодиод
#define SOUND_PIN 12    // Пин управления звуком
#define BTN_ON 2        // Кнопка ВКЛ
#define BTN_OFF 3        // Кнопка ВЫКЛ
//---------------------------------------------------------------------------
// Настраиваем пины
void setup() {
    pinMode(LED_PIN, OUTPUT);
    pinMode(SOUND_PIN, OUTPUT);
    pinMode(BTN_ON, INPUT_PULLUP);
    pinMode(BTN_OFF, INPUT_PULLUP);
}
//---------------------------------------------------------------------------
// Сам цикл
void loop() {
    static bool on_off;
    if (onClick(BTN_ON))    on_off = true;
    if (onClick(BTN_OFF))    on_off = false;
   
    blink_led(on_off);
    digitalWrite(SOUND_PIN, on_off);
}
//---------------------------------------------------------------------------
// Функция мигания диодом
void blink_led(bool blink)
{
    static uint32_t _timer;
    if (blink && millis() - _timer >= 500) { // Мигаем с частотой 1Гц
        _timer = millis();
        digitalWrite(LED_PIN, !digitalRead(LED_PIN));
        }
    else if (!blink) digitalWrite(LED_PIN, LOW); // Гасим диод если не нужно моргать
};
//---------------------------------------------------------------------------
// Функция обработки нажатия кнопок
bool onClick(uint8_t _pin) {
    static bool _flag;
    static uint32_t _tmr;
    bool btnState = digitalRead(_pin);
   
    // Программное устранение дребезга контактов
    if (!btnState && !_flag && millis() - _tmr >= 100) {
        _flag = true;
        _tmr = millis();
        return true;
        }
    if (btnState && _flag) {
        _flag = false;
        _tmr = millis();
        }
    return false;
};
Если немного изменить код, то можно обойтись одной кнопкой:
C++:
// Эти строки...
if (onClick(BTN_ON))    on_off = true;
if (onClick(BTN_OFF))    on_off = false;
// Поменять на...
if (onClick(BTN_ON))    on_off = !on_off;
 
Изменено: