Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
18.04.2014, 19:31
|
#1
|
Прохожий
Регистрация: 18.04.2014
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Таймер включения нагрузки на 10 минут на ARDUINO UNO
Добрый день.
Подскажите, как можно решить следующую задачу на ARDUINO. Необходимо запрограммировать включение мотора от кнопки ровно на 10 минут, не используя функцию delay(), т.е. цикл loop не должен
останавливаться.
В любой момент двигатель можно выключить и включать этой же кнопкой, но он автоматически
должен отключаться через 10 мин после включения. В качестве индикатора включения насоса
будет служить индикатор LED13.
PHP код:
|
// Таймер включения мотора на 10 минут //
const int buttonPOWER = 7; // Кнопка включения и выключения мотора, 10k на землю. const int LedPOWER = 13; // Выход на реле мотора
// Переменные для работы с кнопкой int buttonStatePOWER = 0; int old_val = 0; int state = 0;
int StartMotor = 0; // Маркер запуск мотора unsigned long previousMillisMotor = 0; // Засекаем время на момент включения Мотора unsigned long currentTime; // Переменная текущего времени программы
void setup() { pinMode(buttonPOWER, INPUT); pinMode(LedPOWER, OUTPUT); digitalWrite(LedPOWER, LOW); Serial.begin(9600); // монитор порта для диагностики }
void loop() {
// ----------Организация кнопки POWER включение и выключение с защитой от дребезга контактов---- buttonStatePOWER = digitalRead(buttonPOWER); if ((buttonStatePOWER == HIGH)&&(old_val == LOW)) { state = 1 - state; delay(200); } old_val = buttonStatePOWER; if (state == 1) { if ((StartMotor == 0)&&(old_val == HIGH)) { unsigned long previousMillisMotor = millis(); // // Засечка времени выполняется 1 раз за включение мотора Serial.println("StartMotor=1"); Serial.println(previousMillisMotor); // смотрим время засечки } StartMotor=1; } else { StartMotor=0; Serial.println("StartMotor=0");}
// -------------------------------------------------------
//--------------Управление мотором------------------------ if (StartMotor == 1) { digitalWrite(LedPOWER, HIGH); // включение мотора
// далее, действия при включении мотора // опрос теплового и т.д. } if (StartMotor == 0) { digitalWrite(LedPOWER, LOW); // выключение мотора
// далее, действия при выключении мотора } }
|
Последний раз редактировалось SyrBrandon; 19.04.2014 в 12:01.
|
|
|
|
18.04.2014, 23:15
|
#2
|
Гражданин KAZUS.RU
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Re: Таймер включения нагрузки на 10 минут на ARDUINO UNO
Использовать таймеры. В обработчике инкрементировать переменную.
Я надеюсь в ардуино доступ к ним есть...
|
|
|
|
19.04.2014, 09:42
|
#3
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Таймер включения нагрузки на 10 минут на ARDUINO UNO
Сообщение от SyrBrandon
|
Подскажите, как можно решить следующую задачу. Необходимо запрограммировать включение мотора от кнопки ровно на 10 минут, не используя функцию delay(), т.е. цикл loop не должен
останавливаться.
В любой момент двигатель можно выключить и включать этой же кнопкой, но он автоматически
должен отключаться через 10 мин после включения. В качестве индикатора включения насоса
будет служить индикатор LED13.
|
Вами приведен скетч Дуринды. Для чего? Ведь судя по вопросу, он написан не вами. У вас есть понимание этого скетча?
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
19.04.2014, 10:32
|
#4
|
Прохожий
Регистрация: 18.04.2014
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Таймер включения нагрузки на 10 минут на ARDUINO UNO
Добрый день.
swat24, опыта работы с таймером на сегодняшний день у меня не было, и как это грамотно реализовать на Ардуине.
ut1wpr, это сборная солянка из разных источников. В общем принцип действия этого скетча понятен, в данный момент он включает и выключает светодиод (он же мотор), при нажатии на кнопку pin 7 (кнопка +5v и pin 7). При включении мотора, на COM-порт выводится 2 строки: "StartMotor=1" и
"26449" (время засечки), при отключении на COM-порт выводится "StartMotor=0" (постоянно бежит). *Вот как бы сделать, чтобы эта строка исполнялась только один раз.
Но в этом коде не хватает условия по отключению светодиодиода по прошествию 10 минут. Была попытка использовать функцию millis() текущее время, с условием if (millis() -previousMillis ›= 10 мин), т.е. при включении мотора мы засекаем время в переменную previousMillis ( unsigned long previousMillisMotor = millis(); ) , затем при наступлении условия millis() -previousMillis ›= 10 мин, должно происходить отключение.
но эта связка у меня почему то не работала. Отключение не происходило. Скорее всего что то делал не так. Вот и прошу помощи, как это сделать грамотно. Готового примера на просторах интернета не нашел, возможно этот пример кому нибудь пригодится из новичков для своих творческих работ. Прошу не пинайте сильно, все мы учимся. Заранее спасибо.
Последний раз редактировалось SyrBrandon; 19.04.2014 в 11:03.
|
|
|
|
19.04.2014, 12:33
|
#5
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Таймер включения нагрузки на 10 минут на ARDUINO UNO
Сообщение от SyrBrandon
|
Отключение не происходило. Скорее всего что то делал не так. Вот и прошу помощи, как это сделать грамотно. Готового примера на просторах интернета не нашел, возможно этот пример кому нибудь пригодится из новичков для своих творческих работ. Прошу не пинайте сильно, все мы учимся. Заранее спасибо
|
Какую цель вы преследуете? Если вам нужен готовый скетч - я могу вам написать. За деньги. Если вы хотите написать сами, придется учиться. Бесплатно. В первом случае вы и дальше будете просить, чтобы кто-то вам что-то еще написал. Во втором - сможете писать и для себя и для других. Выбирайте.
Если все-таки сами - тогда не "лепите из кусков". Постарайтесь понять, что делает каждый из "выдранных" вами кубиков, сложите эти кубики, как вам нужно и наслаждайтесь.
А прерывания придется изучить. На дом. сайте Дуринды (да и вообще в инете) есть множество и уроков и готовых примеров. Пройдя этот путь станете программистом. Сойдя с него останетесь "попрошайкой". Без обид.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
19.04.2014, 13:13
|
#6
|
Прохожий
Регистрация: 18.04.2014
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Таймер включения нагрузки на 10 минут на ARDUINO UNO
ut1wpr Спасибо за ответ, без обид, буду изучать.
|
|
|
|
19.04.2014, 14:25
|
#7
|
Прохожий
Регистрация: 18.04.2014
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Таймер включения нагрузки на 10 минут на ARDUINO UNO
Все, задача решена. Была найдена грубая ошибка в описании типа переменной и ещё одна синтаксическая. Код управления мотором будет выглядеть так
Цитата:
|
const unsigned long TimePower=600000; // Время работы мотора, 600 000 сек (10 мин)
// тип unsigned long 0 ... 4294967295 32Bit
loop ........
..............
//--------------Управление мотором------------------------
if (StartMotor == 1) {
digitalWrite(LedPOWER, HIGH); // включение мотора
//---- Функция выключения через 10 минут--------------------
currentTime = millis(); // считываем текущее время
if (currentTime ›= (previousMillisMotor+TimePower)) // сравниваем текущий таймер с переменной previousMillisMotor + 10 мин.
{
StartMotor=0;
previousMillisMotor = currentTime; // в previousMillisMotor записываем новое значение
}
//----------------------------------------------------------
// далее, действия при включении мотора
// опрос теплового и т.д.
}
if (StartMotor == 0) {
digitalWrite(LedPOWER, LOW); // выключение мотора
// далее, действия при выключении мотора
}
}
|
Последний раз редактировалось SyrBrandon; 19.04.2014 в 14:31.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:54.
|
|