Бузер и Ик-приемник на ардуино. Что-то пошло не так.

Димон82

✩✩✩✩✩✩✩
26 Дек 2021
1
0
Оформи код соответствующим тэгом
Доброго времени суток форумчане! Для начала хотел бы Вас поздравить с новым ламером на форуме!
Насмотрелся я вашего Alexgyver на yuotube, кстати огромное ему Спасибо за видосы и сайты, и решил смастерить на ардуино сигнализацию для машинки дочери. Первая часть скетча (с ик-пульта типа ставить и снимать с сигнализации авто - мигать светодиодом и пищать бузером) прошла довольно таки легко и решил дополнить все это полицейской сиреной - пищать с кнопки тем же бузером и моргать двумя другими светодиодами.
Суть проблемы такова, что часть с ик-пультом работает отлично, пока не включишь сирену - после того сирена отрабатывает ик-пульт больше не работает (судя по светодиоду распаянному на ардуино команда с пульта проходит но не отрабатывает), хотя сирена снова включается и работает. Идет пятый день борьбы между мной и ардуино и путем методом научного тыка я выяснил, что если не использовать функцию tone(), а просто включать бузер, то все работает отлично. Код я честно повыдирал из других работ.
Скетч выглядит так:

#include <IRremote.h>
#define buzzer 5 // подключаем пьезоэлемент к контакту 5 ШИМ
int RECV_PIN = 2;
int LED1_PIN = 8;
int LEDG_PIN = 4;
int i; // Задаём переменную для цикла for вверх
int x; // Задаём переменную для цикла for вниз

boolean buttonWasUp = true;
boolean ledEnabled = false;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(LED1_PIN, OUTPUT);
pinMode(LEDG_PIN, OUTPUT);
pinMode(buzzer, OUTPUT); //объявляем пин 5 как выход.
pinMode(7, OUTPUT);
pinMode(6, INPUT_PULLUP);
}

void loop() {

if (irrecv.decode(&results)) {
Serial.println(results.value);
irrecv.resume();

switch (results.value) {
case 0xF700FF:
digitalWrite(LEDG_PIN, HIGH); // зажигаем светодиод
digitalWrite(buzzer, HIGH);
delay(250); // ждем 1 секунду
digitalWrite(buzzer, LOW);
delay(250);
digitalWrite(LEDG_PIN, LOW); // выключаем светодиод
break;
case 0xF7807F:
digitalWrite(LEDG_PIN, HIGH); // зажигаем светодиод
digitalWrite(buzzer, HIGH);
delay(250); // ждем 1 секунду
digitalWrite(buzzer, LOW);
delay(250);
digitalWrite(buzzer, HIGH);
digitalWrite(LEDG_PIN, LOW); // выключаем светодиод
delay(250);
digitalWrite(buzzer, LOW);
digitalWrite(LEDG_PIN, HIGH); // зажигаем светодиод
delay(500); // ждем 1 секунду
digitalWrite(LEDG_PIN, LOW); // выключаем светодиод
break;
}
}
boolean buttonIsUp = digitalRead(6); // узнаем, отпущена ли кнопка сейчас
if (buttonWasUp && !buttonIsUp) { // если кнопка была отпущена и не отпущена сейчас
delay(7);// исключаем дребезг контактов тактовой кнопки
buttonIsUp = digitalRead(6); // и считываем сигнал с кнопки снова

if (!buttonIsUp) {// если кнопка нажата, то переворачиваем сигнал светодиода
ledEnabled = !ledEnabled;
byte a = 2;
while (a--) {
for (i = 200; i < 1500; i += 10) { // пройдёмся циклом по диапазону частот от 200Гц до 1500Гц с шагом 10
tone(buzzer, i);
delay(20);
}
for (x = i; x > 200; x -= 10) { // пройдёмся циклом по диапазону частот от 1500Гц до 200Гц с шагом 10
tone(buzzer, x);
delay(20);
}
noTone(buzzer); // сделаем паузу
}
}
}
}

Может кто знает почему функция Tone() отключает другую половину кода?