Режимы свечения светодиода с помощью потенциометра

Bushmanov
Offline
Зарегистрирован: 18.05.2020
#define potent_pin 0   // сюда подключена средняя нога потенциометра
int val;               // переменная для хранения значения с потенциометра
const int btn = 2;     // присваиваю переменую btn к ножке 2
int led_pin=3;         // присваиваю переменую Led_pin к ножке 3

void setup() {
  pinMode(led_pin, OUTPUT); // Инициализируем цифровой вход/выход в режиме выхода.
  pinMode(btn, INPUT); // Инициализируем цифровой вход/выход в режиме входа.
  Serial.begin(9600);
  pinMode(led_pin, OUTPUT); // Инициализируем цифровой вход/выход в режиме выхода.
  pinMode(btn, INPUT); // Инициализируем цифровой вход/выход в режиме входа.
}

void loop() {

  val = analogRead(potent_pin);     // запомнить показания с потенциометра
  val = map(val, 0, 1023, 0, 20);   // перевести в диапазон 0.. 20
  val = constrain(val, 0, 20);      // ограничить диапазон 0.. 20
  delay(10);                      // задержка в 1 секунду

  if (digitalRead(btn) == HIGH) { // Если кнопка нажата 
    if (val == 19 || val == 20) { 
      digitalWrite(led_pin, HIGH);// зажигаем светодиод
      delay(1000);
      digitalWrite(led_pin, LOW); // выключаем светодиод
  }
  }
 
}

Принцип работы.

1. Потенциометром выбираем режим от 1 до 10(В данном случае их 20, но для точности я выбрал по 2, т.е . два значения отвечают за 1 режим ).

2.В зависимости от режима условием загорается светодиод на определенный период ( 1 режим 0.1 секунда ... 10 режим 1 секунда)

Проблема: Если зажать кнопку светодиод работает мерцанием светодиода с частотой заданной функцией delay. А мне нужно чтобы после зажатия кнопки он отработал режим(загорание на 1 секунду) и потух. Добрые люди подскажите что не так. xD

p.s Условия режимов загорания светодиодов нет. В коде только 10 режим.

b707
Offline
Зарегистрирован: 26.05.2017

воспользоваться переменной-флагом. Как только кнопка нажата - поднимаем флаг, включаем и выключаем светодиод с нужной задежкой и пока флаг не опустится - больше на кнопку не реагируем.

Флаг опускам только тогда, когда кнопка отжата.

Задержку на светодиоде лучше переписать на миллис, на delay() будет работать не совсем корректно

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Почему строки 7 и 10, 8 и 11 одинаковые ?

Bushmanov
Offline
Зарегистрирован: 18.05.2020

Верно подметили ;)

Bushmanov
Offline
Зарегистрирован: 18.05.2020

Уже исправил

Bushmanov
Offline
Зарегистрирован: 18.05.2020
boolean butt_flag = 0;
boolean butt;
boolean led_flag = 0;
unsigned long last_press;
void setup() {
  pinMode(2, INPUT_PULLUP);
  Serial.begin(9600);
  pinMode(3, OUTPUT);
}

void loop() {
  butt = !digitalRead(2); // считать текущее положение кнопки
  
  if (butt == 1 && butt_flag == 0 && millis() - last_press > 100) {
    butt_flag = 1;
    Serial.println("Вкл");
    led_flag = !led_flag;
    digitalWrite(3, led_flag);
    last_press = millis();
  }
  if (butt == 0 && butt_flag == 1) {
    butt_flag = 0;
    Serial.println("Выкл");
  }
}

Ну вот что удалось. Но оно работает не корректно. По началу когда нажимаешь на кнопку все верно. Включает - Выключает. А потом может работать как обычно нажал на кнопку загорелось, еще раз нажал выключило.