Запуск и остановка проблескового маячка и сирены кнопкой

lsus
Offline
Зарегистрирован: 11.11.2020

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

void setup()
{
  pinMode(3, INPUT);
  pinMode(4, OUTPUT);
  pinMode(5, INPUT);
  pinMode(6, OUTPUT);
}

void loop()
{ 
  if (digitalRead(3)==HIGH){
    digitalWrite(6,HIGH);
    digitalWrite(4,HIGH);
    delay(300);
    digitalWrite(6,LOW);
    digitalWrite(4,LOW);
    delay(300);
    digitalWrite(6,HIGH);
    digitalWrite(4,HIGH);
 }
  else
  if (digitalRead(5)==HIGH){
    digitalWrite(4,LOW);
    digitalWrite(6,LOW);}
  


 

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

взять активный зуммер и запитать его параллельно с маячком

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А препод методичку дал какуюнить?  Чо там написано?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

Чо там написано?

Там поди написано, что код должен, для начала, компилироваться, а у ТС с этим напряг :-(

5N62V
Offline
Зарегистрирован: 25.02.2016

lsus пишет:

 Выключить маячок с помощью второй кнопки. 

A нафига Вам вторая кнопка? Логично было бы тыцнул кнопку - мигалка замигала, еще раз тыцнул - перестала мигать. а?  Но при написании кода надо учесть, что мигалка - зло, если она не у скорой помощи. ;)

напрмер так: 

#define BUTTON_PRESSED_TIME 200
#define BUTTON_PIN 3
#define MIGALKA 4
#define SIRENA 6
#define PERIOD_ON_OFF 300

bool isButtonPressed(){//подразумеваем,  что вход подтянут к питанию
	static uint32_t timer = 0;
	if(!digitalRead(BUTTON_PIN) && timer == 0)timer = millis();
	if(timer != 0 && digitalRead(BUTTON_PIN)){
		bool res = (millis() - timer >= BUTTON_PRESSED_TIME)? true:false;
		// как вариант bool res = (millis() - timer >= BUTTON_PRESSED_TIME);
		timer = 0;
		return res;
	}
	return false;
}

void controlMigalka( bool state){
	static uint32_t timer = millis();
	static bool _state = false;
	if(!state){
       driveOutput(_state = false);
		return;
	}
	else{
		if(millis() - timer >= PERIOD_ON_OFF){
			driveOutput(_state = !_state);
			timer = millis();
		}
		else return;
	}
}
	
	void driveOutput(bool state){
		digitalWrite(MIGALKA, state);
		digitalWrite(SIRENA, state);		
	}

void setup()
{
}

// Add the main program code into the continuous loop() function
void loop()
{
static bool migalka_state = false;
if(isButtonPressed())migalka_state = !migalka_state;
controlMigalka(migalka_state);
}

По идее должно работать, хотя я не проверял по причине не совсем трезвого состояния :)

v258
Offline
Зарегистрирован: 25.05.2020

5N62V пишет:

По идее должно работать, хотя я не проверял по причине не совсем трезвого состояния :)

Не будет - пины не настроены ))

5N62V
Offline
Зарегистрирован: 25.02.2016

v258 пишет:

Не будет - пины не настроены ))

Семен Семеныч! :)))) Да, это в моих обычаях, каюсь :))