Помогите со скетчем для Arduino Nano, пожалуйста!
- Войдите на сайт для отправки комментариев
Сб, 17/02/2018 - 21:35
Здравствуйте! Делаю светофор для ребёнка. И у меня вопрос: как сделать для него скетч, в котором вместо delay() используется millis(). Вот скетч, сделанный на delay():
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
}
void loop() {
digitalWrite(2, HIGH);
delay(27000);
digitalWrite(3, HIGH);
delay(3000);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
delay(30000);
digitalWrite(4, LOW);
}
Для чего вам миллис в такой простой программе?
Хочу сделать настройку задержки через потенциометр. Звучит глупо, но так надо.
#138
Нет, ну миллис - это модно и современно, но тогда вам придется нагородить кучу флагов или конечный автомат написать. Справитесь?
Moжет просто в delay натыкать переменных, значение которых рассчитывать по map() в зависимости от положения потенциометра - значения на A-входе?
ага, но считываться значения когда будут? Раз в 1 минуту???
Подкрутили - кнопка ресет. Быстро надежно и голова не болит.https://www.youtube.com/watch?v=Z0NwqOPDQNE
И мне каждую секунду перезагружать ардуинку? Или как?
зато общение будет с ребенком. А потом ребенка можно научить крутить и кнопку нажимать. Вводить ребенка в серьезные дела.
Вот, конечный автомат, разбирайтесь:
typedef enum { msStep0, msStep1, msStep2, msStep3 } MachineState; MachineState machineState = msStep0; unsigned long timer = 0; void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); } void loop() { switch(machineState) { case msStep0: { digitalWrite(2, HIGH); timer = millis(); machineState = msStep1; } break; case msStep1: { if(millis() - timer > 27000) { digitalWrite(3, HIGH); timer = millis(); machineState = msStep2; } } break; case msStep2: { if(millis() - timer > 3000) { digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, HIGH); timer = millis(); machineState = msStep3; } } break; case msStep3: { if(millis() - timer > 30000) { digitalWrite(4, LOW); timer = millis(); machineState = msStep0; } } break; } // switch }То раз в минуту, то раз в секунду... Поищите на форуме тему про конечные автоматы, ЕвгенийП подробно все расписывал, чуть ли не в картинках.
Вот прямо на Вашу тему - http://arduino.ru/forum/programmirovanie/sketch-svetofora-bez-delay
И вообще, просто вбейте в правом верхнем углу в окне поиска слово сфетофор. Его до Вас уже столько народу делало.
Ведь, не искали, правда же?
И мне каждую секунду перезагружать ардуинку? Или как?
Поставьте регулировщика и пусть светофор вручную включает. А то вдруг "чатланин" поедет, а Ваша глупая автоматика "ку" не сделает - нехорошо.
ага, но считываться значения когда будут? Раз в 1 минуту???
А какой смысл менять частоту чаще, чем 1 раз за период?