Здравствуйте форумчане, вот с внучком решил поиграться с ардуино и упёрлись в пока что неразрешимую загадку, delay тормозит работу с кнопкой но красиво зажигает ЛЕДы,
пробовал разные способы с millis тогда Леды работают как попало, есть один вариант с millis который как то заработал но тогда надо писать свой таймеры задержки для каждого ЛЕДа.
#define bt 2
byte p = 6;
byte p1 = 13; // даём пинам имена
byte flag1 = 0; // переменная для работы
byte flag2 = 0; // переменная для работы
uint32_t time = 0; // отсчёт, время для millis()
int settime = 50; //время для сравнения
int led[] = {6, 7, 8, 9, 10, 11, 12, 13}; //массив пины с которыми будем работать
//////////////////////////////////////////////////////////////////////////////
void setup() {
for (int l = 0; l < 8; l++) {
pinMode(led[l], OUTPUT); //пины из масива, задаём режим работы на выход
}
pinMode(bt, INPUT); // пин, режим работы на вход для кнопки
Serial.begin(9600); // включаем монитор порта
}
//////////////////////////////////////////////////////////////////////////////
void loop() {
if (millis() - time > settime) {
time = millis();
if (flag2 == 1) {
up(500);
} // функция бегущая волна ЛЕДов 13->6 если положение флага2=1
if (flag2 == 3) {
down(1000);
} // функция бегущая волна ЛЕДов 6->13 если положение флага2=3
}
button(); // функия кнопки
}
//////////////////////////////////////////////////////////////////////////////
void up(int settimeON) {
/*p1 = p1 - 1; // вариант без цикла for
if (p1 < 6) {
p1 = 13;
}
digitalWrite(p1, HIGH); // включаем ЛЕД
delay(settimeON); // ждём
digitalWrite(p1, LOW); // выключаем ЛЕД
Serial.println(p1); // пишем в монитор какой пин
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
for (p1 = 13; p1 > 5; p1--) { // вариант с циклом for
digitalWrite(p1, HIGH); // включаем ЛЕД
delay(settimeON); // ждём
digitalWrite(p1, LOW); // выключаем ЛЕД
Serial.println(p1); // пишем в монитор какой пин
}
}
/////////////////////////////////////////////////////////////////////////////////
void down(int settimeON) {
/*p = p + 1;
if (p > 13) { // вариант без цикла for
p = 6;
}
digitalWrite(p, HIGH);
delay(settimeON);
digitalWrite(p, LOW);
Serial.println(p);
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
for (p = 6; p < 14; p++) { // вариант с циклом for
digitalWrite(p, HIGH);
delay(settimeON);
digitalWrite(p, LOW);
Serial.println(p);
}
}
/////////////////////////////////////////////////////////////////////////////////
void button() {
if (digitalRead(bt) == LOW && flag1 == 0) { //читаем состояние кнопки и флага1
flag1 = 1; // меняем состояние флаг1
flag2 = flag2 + 1; // меняем состояние флаг2 на один шаг
if (flag2 > 4) {
flag2 = 0; // сбрасывае флаг2 в исходное положение при достижении условия
}
}
if (digitalRead(bt) == HIGH && flag1 == 1) { //опять читаем состояние кнопки и флага1
flag1 = 0; //сбрасывае флаг в исходное положение
}
Serial.print(flag1); //пишем в монитор состояние флага1
Serial.println(flag2); //пишем в монитор состояние флага2
}