millis
- Войдите на сайт для отправки комментариев
Чт, 13/06/2019 - 19:23
Хотел сделать управление светом при помощи millis , но смог настроить только 12/12, нужно 18/6 (18 часов светит , 6 часов выключено(сделал на реле)), но к сожалению моих навыков не хватает чтобы сделать такой режим
а скетч?
а скетч?
Для вставки скетча наверное тоже навыков нет
unsigned long previousMillis = 0; const long interval_1 = 21600000 const long interval_2 = 64800000 int led = 13; int interv = interval_2; void setup() { pinMode(led, OUTPUT); Serial.begin(9600); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interv) { if (interv == interval_2) interv = interval_1; else interv = interval_2; previousMillis = currentMillis; Serial.println(interv); digitalWrite(led, !digitalRead(led)); } }unsigned long previousMillis = 0; const long interval_1 = 21600000 const long interval_2 = 64800000 int led = 13; int interv = interval_2; void setup() { pinMode(led, OUTPUT); Serial.begin(9600); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interv) { if (interv == interval_2) interv = interval_1; else interv = interval_2; previousMillis = currentMillis; Serial.println(interv); digitalWrite(led, !digitalRead(led)); } }artmob - код вполне грамотный, просто все переменные времен, включая интервал ! - тоже сделайте unsigned long
"Всё уже украдено до нас..." artmob, учитесь пользоваться поиском. Эта тема уже поднималась не раз, например, http://arduino.ru/forum/programmirovanie/eshche-raz-migaem-svetodiodom-b...
unsigned long previousMillis = 0; const long interval_1 = 21600000 const long interval_2 = 64800000 int led = 13; int interv = interval_2; void setup() { pinMode(led, OUTPUT); Serial.begin(9600); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interv) { if (interv == interval_2) interv = interval_1; else interv = interval_2; previousMillis = currentMillis; Serial.println(interv); digitalWrite(led, !digitalRead(led)); } }artmob, никогда так не делайте. Код надо копировать точно (копи-пастом) - а не так, как Вы это сделали. Что Вы нам подсунули? Оно ведь даже не компилируется!!! Как же Вы его загружаете? Это неуважение к сообществу.
Но, собственно, я не об этом. Как решить проблему Вам уже сказали, я хотел лишь добавить совет - не привыкайте так писать. Вот что у Вас за числа 21600000, и 64800000? Вы, ежели вдруг с бодуна будете, сразу поймёте что это?
Совсем нетрудно ведь один раз написать простые макросы:
А один раз их написав, всегда записывать, например
Разве так не читабельнее?
да вот, а не программисты пишут в лоб, то-есть, что вижу о том и пою )))
#define SECONDS(x) ((x) * 1000UL) #define MINUTES(x) (SECONDS(x) * 60UL) #define HOURS(x) (MINUTES(x) * 60UL) #define DAYS(x) (HOURS(x) * 24UL) #define WEEKS(x) (DAYS(x) * 7UL) unsigned long interval_1 = SECONDS(6); unsigned long interval_2 = SECONDS(18); unsigned long previousMillis = 0; int led = 13; byte flag = 0; void setup(){ pinMode(led, OUTPUT); Serial.begin(9600); digitalWrite(led, HIGH); flag = 1; previousMillis = millis(); } void loop(){ if (millis() - previousMillis >= interval_2 && flag ==1) { digitalWrite(led, LOW); flag = 0; previousMillis = millis(); } if (millis() - previousMillis >= interval_1 && flag ==0) { digitalWrite(led, HIGH); flag = 1; previousMillis = millis(); } }можно конечно сэкономить один байт ОЗУ на глобальной переменной используюя в качестве флага
само состояние пина выхода в ущерб более сотни байт памяти программ, но не нужно )))
#define SECONDS(x) ((x) * 1000UL) #define MINUTES(x) (SECONDS(x) * 60UL) #define HOURS(x) (MINUTES(x) * 60UL) #define DAYS(x) (HOURS(x) * 24UL) #define WEEKS(x) (DAYS(x) * 7UL) unsigned long interval_1 = HOURS(0) + MINUTES(0) + SECONDS(6); unsigned long interval_2 = HOURS(0) + MINUTES(0) + SECONDS(18); unsigned long previousMillis = 0; int led = 13; void setup(){ pinMode(led, OUTPUT); Serial.begin(9600); digitalWrite(led, HIGH); flag = 1; previousMillis = millis(); } void loop(){ if (millis() - previousMillis >= interval_2 && digitalRead(led)== HIGH) { digitalWrite(led, LOW); previousMillis = millis(); } if (millis() - previousMillis >= interval_1 && digitalRead(led)== LOW) { digitalWrite(led, HIGH); previousMillis = millis(); } }Смею предположить, что ТС нужен не просто таймер, а суточный таймер. (привязка к началу суток). А тут уж без RTC не обойтись.
А ещё надо настройки периодов кнопками менять. А ещё чтоб не пропадали при перезагрузках. А ещё RTC подводить...
Не обязательно. Пусть сам встаёт и ровно в полночь нажимает Reset
Не обязательно. Пусть сам встаёт и ровно в полночь нажимает Reset
А для вставания в 23:55 и нажимания спаять устройство на ардуине с RTC.
Пусть сам встаёт и ровно в полночь нажимает Reset
Не обязательно самому, можно нанять кого-нибудь.
https://www.arduinolibraries.info/libraries/sw-rtc можно обойтись без толкового майора.
https://www.arduinolibraries.info/libraries/sw-rtc можно обойтись без толкового майора.
Пусть сам встаёт и ровно в полночь нажимает Reset
Не обязательно самому, можно нанять кого-нибудь.
зачем нанимать? у некоторых...
для этой самой штуки есть своя законная жена )))
Дороже выйдет.
а вот если применить битовые оперции, хотя бы на чтение, то экономим не только ОЗУ но и память программ )))
#define SECONDS(x) ((x) * 1000UL) #define MINUTES(x) (SECONDS(x) * 60UL) #define HOURS(x) (MINUTES(x) * 60UL) #define DAYS(x) (HOURS(x) * 24UL) #define WEEKS(x) (DAYS(x) * 7UL) unsigned long interval_1 = HOURS(0) + MINUTES(0) + SECONDS(6); unsigned long interval_2 = HOURS(0) + MINUTES(0) + SECONDS(18); #define port PORTB #define pin 5 unsigned long previousMillis = 0; int led = 13; void setup(){ pinMode(led, OUTPUT); Serial.begin(9600); digitalWrite(led, HIGH); previousMillis = millis(); } void loop(){ // if (millis() - previousMillis >= interval_2 && digitalRead(led)== HIGH) { // if (millis() - previousMillis >= interval_2 && bitRead(PORTB,5) == HIGH) { if (millis() - previousMillis >= interval_2 && bitRead(port,pin) == HIGH) { digitalWrite(led, LOW); previousMillis = millis(); } // if (millis() - previousMillis >= interval_1 && digitalRead(led)== LOW) { // if (millis() - previousMillis >= interval_1 && bitRead(PORTB,5) == LOW) { if (millis() - previousMillis >= interval_1 && bitRead(port,pin) == LOW) { digitalWrite(led, HIGH); previousMillis = millis(); } }а если воспользоваться битовыми операциями и для записи в порт, то экономия места под программу составит еще пару сотен байт )))
#define SECONDS(x) ((x) * 1000UL) #define MINUTES(x) (SECONDS(x) * 60UL) #define HOURS(x) (MINUTES(x) * 60UL) #define DAYS(x) (HOURS(x) * 24UL) #define WEEKS(x) (DAYS(x) * 7UL) unsigned long interval_1 = HOURS(0) + MINUTES(0) + SECONDS(6); unsigned long interval_2 = HOURS(0) + MINUTES(0) + SECONDS(18); #define port PORTB #define pin 5 unsigned long previousMillis = 0; int led = 13; void setup(){ pinMode(led, OUTPUT); Serial.begin(9600); bitWrite(port,pin,HIGH); // digitalWrite(led, HIGH); previousMillis = millis(); } void loop(){ // if (millis() - previousMillis >= interval_2 && digitalRead(led)== HIGH) { // if (millis() - previousMillis >= interval_2 && bitRead(PORTB,5) == HIGH) { if (millis() - previousMillis >= interval_2 && bitRead(port,pin) == HIGH) { bitWrite(port,pin,LOW); //digitalWrite(led, LOW); previousMillis = millis(); } // if (millis() - previousMillis >= interval_1 && digitalRead(led)== LOW) { // if (millis() - previousMillis >= interval_1 && bitRead(PORTB,5) == LOW) { if (millis() - previousMillis >= interval_1 && bitRead(port,pin) == LOW) { bitWrite(port,pin,HIGH); // digitalWrite(led, HIGH); previousMillis = millis(); } }#define SECONDS(x) ((x) * 1000UL) #define MINUTES(x) (SECONDS(x) * 60UL) #define HOURS(x) (MINUTES(x) * 60UL) #define DAYS(x) (HOURS(x) * 24UL) #define WEEKS(x) (DAYS(x) * 7UL) #define port PORTB #define pin 5 PROGMEM const unsigned long interval[2] = {HOURS(0) + MINUTES(0) + SECONDS(1), HOURS(0) + MINUTES(0) + SECONDS(2)}; unsigned long previousMillis; void setup(){ port = DDRB = 1 << pin; } void loop(){ bool b = bitRead(port,pin); unsigned long Millis = millis(); if (Millis - previousMillis >= pgm_read_dword_near(&interval[b])) { bitWrite(port,pin,!b); previousMillis = Millis; } }#define SECONDS(x) ((x) * 1000UL) #define MINUTES(x) (SECONDS(x) * 60UL) #define HOURS(x) (MINUTES(x) * 60UL) #define DAYS(x) (HOURS(x) * 24UL) #define WEEKS(x) (DAYS(x) * 7UL) #define port PORTB #define pin 5 PROGMEM const unsigned long interval[2] = {HOURS(0) + MINUTES(0) + SECONDS(1), HOURS(0) + MINUTES(0) + SECONDS(2)}; unsigned long previousMillis; void setup(){ port = DDRB = 1 << pin; } void loop(){ bool b = bitRead(port,pin); unsigned long Millis = millis(); if (Millis - previousMillis >= pgm_read_dword_near(&interval[b])) { bitWrite(port,pin,!b); previousMillis = Millis; } }красиво!!!
не совсем понимаю 14 строку, DDRB это настройка на выход?
не совсем понимаю 14 строку, DDRB это настройка на выход?
Запись единицы в пятый бит регистра Data Direction Register порта B, т.е. запись единицы для пина PB5. Запись единицы в регистр DDRx настраивает пин на выход.
не совсем понимаю 14 строку, DDRB это настройка на выход?
Запись единицы в пятый бит регистра Data Direction Register порта B, т.е. запись единицы в PB5. Запись единицы настраивает пин на выход.
это понятно, там же не только настраивает на выход я так понимаю и устанавливает на нём 1?
То-есть выполнение программы идёт по арабско-армянски, справо налево
Нет, только настраивает на выход. Чтобы установить на пине высокий уровень, нужно PORTB |= 1 << pin;
UPD: Ой, извиняюсь. Не заметил выше дефайн #define port PORTB. Таки да, сразу настраивает на выход и устанавливает высокий уовень, Вы правы.
Нет, только настраивает на выход. Чтобы установить на пине высокий уровень, нужно PORTB |= 1 << pin;
UPD: Ой, извиняюсь. Не заметил выше дефайн #define port PORTB. Таки да, сразу настраивает на выход и устанавливает высокий уовень.
Вывел в сериал, при первом вхождении в порту 1 однако
То-есть выполнение программы идёт по арабско-армянски, справо налево
Можно сначала записать единицу в PORTx, а потом в DDRx. В таком случае сразу включится внутренняя подтяжка, а потом пин переведётся на выход. В принципе без разницы, куда сначала писать единицу - в DDRx или в PORTx.
а если булеву заменить на байт, то еще 8 байт экономим в блоке программного кода )))
#define SECONDS(x) ((x) * 1000UL) #define MINUTES(x) (SECONDS(x) * 60UL) #define HOURS(x) (MINUTES(x) * 60UL) #define DAYS(x) (HOURS(x) * 24UL) #define WEEKS(x) (DAYS(x) * 7UL) #define port PORTB #define pin 5 PROGMEM const unsigned long interval[2] = {HOURS(0) + MINUTES(0) + SECONDS(1), HOURS(0) + MINUTES(0) + SECONDS(2)}; unsigned long previousMillis; void setup(){ //Serial.begin(9600); port = DDRB = 1 << pin; } void loop(){ // bool b = bitRead(port,pin); byte b = bitRead(port,pin); unsigned long Millis = millis(); if (Millis - previousMillis >= pgm_read_dword_near(&interval[b])) { // Serial.println(b); bitWrite(port,pin,!b); previousMillis = Millis; } }