Написал код. В loop() можно увидеть таймер на millis() с переменной timing.
По какой-то неявной для меня причине, после 10-го срабатывания данного таймера, таймер перестаёт работать, что приводит к постоянному вызову функции bip().
void setup() {
Serial.begin(9600);
pinMode(8, INPUT_PULLUP); //На вход
pinMode(10, INPUT_PULLUP); //На вход
pinMode(4, OUTPUT);
pinMode(2, OUTPUT);
pinMode(7, OUTPUT);
}
void flick(int period){
digitalWrite(7, 1);
delayMicroseconds(period*200);
delayMicroseconds(period*200);
delayMicroseconds(period*200);
delayMicroseconds(period*200);
delayMicroseconds(period*200);
digitalWrite(7, 0);
delayMicroseconds(period*200);
delayMicroseconds(period*200);
delayMicroseconds(period*200);
delayMicroseconds(period*200);
delayMicroseconds(period*200);
}
void bip(int period){
int Time = millis();
digitalWrite(2, 1);
while(millis() - Time < 100) flick(period);
digitalWrite(2, 0);
}
void loop() {
float test_t[56]={45.5, 41.7, 38.5, 35.7, 33.3, 31.2, 29.4, 27.8, 26.3, 25.0, 23.8, 22.7, 21.7, //Создаём массив периодов для монохромных мельканий в режиме "тест"
20.8, 20.0, 19.2, 18.5, 17.9, 17.2, 16.7, 16.1, 15.6, 15.2, 14.7, 14.3, 13.9,
13.5, 13.2, 12.8, 12.5, 12.2, 11.9, 11.6, 11.4, 11.1, 10.9, 10.6, 10.4, 10.2,
10.0, 9.8, 9.6, 9.3, 9.2, 9.0, 8.8, 8.7, 8.5, 8.4, 8.2, 8.1, 8.0, 7.8, 7.7, 7.6, 7.5};
int Button = 1, button_press = 0, lvl = 0, CFFF, CFDF, key = 1, timing = 0, freq;
while(true){
Button = digitalRead(8);
if(!Button) button_press = 1;
if(Button && button_press && !lvl){
lvl = 2; freq = 65;
button_press = 0;
digitalWrite(2, 1);
delay(100);
digitalWrite(2, 0);
}
if(lvl == 2){
if(!timing) timing = millis();
if (millis() - timing < 3000) {
flick(test_t[freq-10]);
if(button_press && Button){
CFDF = freq; lvl = 3;
int timeD = millis() - timing;
digitalWrite(2, 1);
delay(1000);
digitalWrite(2, 0);
}
}else{
--freq; timing = millis();
bip(test_t[freq-10]);
}
}
}
}