Генератор сигнала SOS

lsus
Offline
Зарегистрирован: 11.11.2020
Задание:После нажатия на кнопку, зуммер и светодиод начинают передавать сигнал SOS. Все Выключается с помощью второго нажатия кнопки.
У меня по итогу постоянно передает сигнал, нажав снова на кнопку ничего не происходит
код:
const int btn=3;
int k=0;
const int buzz=4;
const int led=5;
byte val=0;
bool state=0;
void setup()
{
  pinMode(btn, INPUT);
  pinMode(buzz, OUTPUT);
  pinMode(led, OUTPUT);
}

void loop()
{
  val=digitalRead(btn);
  if (val==HIGH){
    state=!state;
    delay(200);
  }
  if (state==true){
    // "S"
  for (k=0;k<3;k+=1){
    digitalWrite(buzz, HIGH);
    digitalWrite(led,HIGH);
  	delay(500);   // пауза 1,5 секунды
    digitalWrite(buzz, LOW);
    digitalWrite(led,LOW);
  	delay(500); // пауза 1,5 секунды
  }
  delay(300); // Задержка
  // "O"
  for (k=0;k<3;k+=1){
    digitalWrite(buzz, HIGH);
    digitalWrite(led,HIGH);
  	delay(1000); // пауза 3 секунды
    digitalWrite(buzz, LOW);
    digitalWrite(led,LOW);
  	delay(1000); // пауза 3 секунды
  }
  delay(300); // Задержка
  // "S"
  for (k=0;k<3;k+=1){
    digitalWrite(buzz, HIGH);
    digitalWrite(led,HIGH);
  	delay(500); // пауза 1,5 секунды
    digitalWrite(buzz, LOW);
    digitalWrite(led,LOW);
    delay(500);} // пауза 1,5 секунды
  }else{
    digitalWrite(buzz,LOW);
    digitalWrite(led,LOW);}
  }

 

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Избавиться в первую очередь от делей в коде. http://arduino.ru/tutorials/BlinkWithoutDelay

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ua6em пишет:

значит кнопку надо на прерывание повесить

Сказали "А" скажите и "Бэ..э". А че с прерыванием-то делать?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mykaida пишет:

ua6em пишет:

значит кнопку надо на прерывание повесить

Сказали "А" скажите и "Бэ..э". А че с прерыванием-то делать?

обработать )))
на сёдня лимит добрых дел исчерпан

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

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

Уважаемый ТС - Изучите мигание без delay(), как советуют Вам в посте #1

А лучше - напишите нормальный алгоритм.

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

ua6em пишет:

одну из самых красивых математических реализаций (по моему мнению) можно глянуть тут


Что в ней такого красивого? Идея бинарного кодирования знаков - очевидна, я бы даж сказал банальна, а реализация ничего особенного, даже вывод бита написан через деление, а не сдвиг

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:
ua6em пишет:

одну из самых красивых математических реализаций (по моему мнению) можно глянуть тут

Что в ней такого красивого? Идея бинарного кодирования знаков - очевидна, я бы даж сказал банальна, а реализация ничего особенного, даже вывод бита написан через деление, а не сдвиг

кому очевидно, кому не очень, я впервые увидел, понравилось, неожиданно было, что так можно и азбуку Морзе закодировать...
ЗЫ "...Ну Иоан...Ну Грозный..."

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lsus, азбука Морзе не допускает произвольных длительностей сигналов и пауз - все длительности тщательно увязаны друг с другом. Посмотрите пост по ссылке ua6em, там с длительностями более или менее нормально, если не считать, что в таблице отсутствует, собственно, сигнал SOS, который передается совсем не так, как строка "SOS".

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Я пошел на подвиг:

Давайте разберемся с задачей. По нажатию кнопки надо передать сигнал "SOS". А по второму нажатию прервать этот сигнал.

Сразу не понимаю - если "SOS", то кирдык. И передавай его, пока тебя не спасут. Или подал "SOS", посмотрел вокруг, да нет - вроде девки нормальные, "отменить"?

Далее "SOS" надо передать полностью, а то будет непонимание. Передадите SO..., а там и додумают ...си. Т.е. кнопка должна сработать после передачи полного текста.

Tres - тут умные люди советовали использовать прерывания. Согласен - используйте! По нажатии кнопки ставьте флаг и проверяйте его после "SOS".

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Еще раз: сигнал SOS - это не строка "SOS", это - единственный символ. Поэтому передать только SO невозможно.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

andriano пишет:

Еще раз: сигнал SOS - это не строка "SOS", это - единственный символ. Поэтому передать только SO невозможно.

У ТС - "SOS" - это *уй чего. Поэтому в его программе можно передать даже слово *лядь, но закодированно.