Один светодиод управляется двумя кнопками - одна из которых действует как тумблер

Попытка управлять этим светодиодом с помощью этих 2 кнопок - одна кнопка, которая запускает короткую мигающую последовательность, другая кнопка действует как тумблер, одна лампочка нажатия включена, другая лампочка нажатия выключена.

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

#include <ezButton.h>

const int flashing_pin = 2; 
const int switch_pin = 3;
const int led_pin = 8; 

ezButton button(switch_pin);

int ledState = LOW; 

void setup() {
  Serial.begin(9600); 
  pinMode(led_pin, OUTPUT); 
  pinMode(switch_pin,INPUT_PULLUP);
  pinMode(flashing_pin,INPUT_PULLUP); 
  button.setDebounceTime(50); 
}

void loop() {
  button.loop(); 

  if(button.isPressed()) {
    Serial.println("Press");

    ledState = !ledState;

    digitalWrite(led_pin, ledState); 
  }
  
  if( digitalRead(flashing_pin) == LOW )   {
    doFlash(4);
  }  
}  

void doFlash(uint8_t number_of_times)  {
  while(  number_of_times-- > 0 ) {
    digitalWrite(led_pin,HIGH);
    delay(250);
    digitalWrite(led_pin,LOW);
    delay(250);
  }  
  
}

Чтобы вкратце объяснить чего я хочу;

  • если светодиод выключен - последовательность мигания работает как "ВКЛ. ВЫКЛ. ВКЛ. ВЫКЛ.".
  • если светодиод включен - последовательность мигания работает как "ВЫКЛ. ВКЛ. ВЫКЛ. ВКЛ.".

, 👍2

Обсуждение

'digitalWrite(led_pin,HIGH); является проводным ... 'digitalWrite(led_pin,!ledstate); противоположно текущему состоянию, @jsotola

Я заставил его работать! Но меня смущает состояние цикла, в моем исходном коде есть правило doFlash(4); и задержка 250 - но при использовании !ledstate 4 мигания больше не являются 4-мя циклами времени (ВКЛ-ВЫКЛ), это половина его, а задержка 250 вдвое больше времени, это половина цикла. second....so для того чтобы получить желаемую "частоту" 4 мигания за 2 секунды, мне нужно поставить doFlash 8 и задержку 125....не могу понять почему :D но это работает, @Varonne

Моя флэш часть кода теперь такова; void doFlash(uint8_t number_of_times) { while( number_of_times-- > 0 ) { ledState = !ledState; digitalWrite(led_pin, ledState); задержка(125); digitalWrite(led_pin, ledState); задержка(125); }, @Varonne

я думаю, что вы не очень внимательно смотрели на то, что написали, @jsotola

ledState = !ledState не входит в код мигания, @jsotola

Я исправлю это - но это действительно работает так, как я намеревался. Но если это плохая практика в программировании, я пересмотрю ее, я учусь., @Varonne

"4 мигания больше не являются 4-мя временными циклами (ВКЛ. - ВЫКЛ.)`... как же это так, как вы намеревались?, @jsotola

О - о, я имел в виду, что после того, как я изменил код, последовательность была правильной и с заданной скоростью. Но когда у меня будет время, я попробую использовать фиксированные значения для цикла., @Varonne