Несколько мигающих светодиодов с разными интервалами, азбука Морзе A включена

led

Добрый вечер,

Я пишу код Arduino для вспышки нескольких светодиодов в разных последовательностях с разных контактов. Все работает хорошо, однако я не могу определить, как добавить в Азбуку Морзе последовательность вспышек.

В идеале последовательность должна быть 1 с, 1 с выключена, 3 с включена, 3 с выключена. затем повторяйте непрерывно, это будет для МО (А) буи

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

// A is 1s, B is 2.5s, C is 4s, D is 5s, F is 6s, G is 8s, H is 10s , 

#define aLed 2
#define bLed 3
#define cLed 4
#define dLed 5
#define fLed 6
#define gLed 7
#define hLed 8


void setup() {
  pinMode(aLed, OUTPUT); //pin2 Output
  pinMode(bLed, OUTPUT); //pin3 Output
  pinMode(cLed, OUTPUT); //pin4 Output
  pinMode(dLed, OUTPUT); //pin5 Output
  pinMode(fLed, OUTPUT); //pin6 Output
  pinMode(gLed, OUTPUT); //pin7 Output
  pinMode(hLed, OUTPUT); //pin8 Output
 

}

void loop() {
  BlinkA(1000);
  BlinkB(2500);
  BlinkC(4000); 
  BlinkD(5000);
  BlinkF(6000);
  BlinkG(8000);
  BlinkH(10000);
 
}
 void BlinkA (int interval){
   static long prevMill = 0;
   if ((millis() - prevMill) >= interval){ 
    prevMill = millis(); 
    digitalWrite(aLed, !digitalRead(aLed));
 } 
}
void BlinkB (int interval){
   static long prevMill = 0;
   if (((long)millis() - prevMill) >= interval){ 
    prevMill = millis(); 
    digitalWrite(bLed, !digitalRead(bLed));
  }
 }
  void BlinkC (int interval){
   static long prevMill = 0;
   if ((millis() - prevMill) >= interval){ 
    prevMill = millis(); 
    digitalWrite(cLed, !digitalRead(cLed));
 } 
}
 void BlinkD (int interval){
   static long prevMill = 0;
   if ((millis() - prevMill) >= interval){ 
    prevMill = millis(); 
    digitalWrite(dLed, !digitalRead(dLed));
 } 
}
 void BlinkF (int interval){
   static long prevMill = 0;
   if ((millis() - prevMill) >= interval){ 
    prevMill = millis(); 
    digitalWrite(fLed, !digitalRead(fLed));
 } 
}
 void BlinkG (int interval){
   static long prevMill = 0;
   if ((millis() - prevMill) >= interval){ 
    prevMill = millis(); 
    digitalWrite(gLed, !digitalRead(gLed));
 } 
}
 void BlinkH (int interval){
   static long prevMill = 0;
   if ((millis() - prevMill) >= interval){ 
    prevMill = millis(); 
    digitalWrite(hLed, !digitalRead(hLed));
 } 
}

, 👍0

Обсуждение

чтобы отформатировать список кодов, поместите "~ ~ ~ " в пустую строку перед кодом ... и то же самое в пустой строке после кода, @jsotola

в чем заключается ваш вопрос?, @jsotola

Будет ли этот ответ полезен? https://arduinoprosto.ru/q/48588/37523, @VE7JRO

Повторите "_1с включено, 1с выключено, 3с включено, 3с выключено": Это означало бы ввод со скоростью 1,2 слова в минуту! Никто, даже полный новичок, не идет так медленно. Если вы хотите, чтобы кто-то мог прочитать букву “А” до того, как ему станет скучно, вы не должны опускаться ниже ≈ 5 WPM (240 мс включено, 240 мс выключено, 720 мс включено, 720 мс выключено)., @Edgar Bonet

@EdgarBonet, если только он не хочет имитировать мигание маяка. Они могут идти так медленно и время от времени использовать шаблоны азбуки Морзе., @PMF

https://github.com/MajenkoLibraries/Blinker, @Majenko

https://github.com/MajenkoLibraries/MorseStatus, @Majenko


1 ответ


2

несколько мигающих светодиодов с разными интервалами (не все периодические)...

Я изменил ваш вопрос, надеюсь, не изменив его значения.

Исходя из этого вопроса, я бы предложил использовать конечный автомат. Предполагая, что вы используете функции "BlankI()" с разными именами для каждого светодиода, рассмотрите возможность добавления функций конечного автомата к 1 из этих функций для управления "непериодическим" светодиодом. Рассмотрим State Machine с 4 состояниями по одному для каждого действия:

  1. Индикатор горит в течение 1 секунды.
  2. Индикатор погас на 1 секунду.
  3. Индикатор горит в течение 3 секунд.
  4. Индикатор погас на 3 секунды.

Используйте счетчик (глобальный или статический, чтобы сохранять его значение между вызовами этой функции) для отслеживания состояний. Используйте шаблон кодирования переключателя/регистра, чтобы установить для "prevMill" соответствующую временную задержку для текущего состояния.

,