Помогите с SimpleTimer.
- Войдите на сайт для отправки комментариев
Хочу разобраться с работой SimpleTimer.
В библиотеке в файле SimpleTimer.txt нашел такое:
"Чтобы навсегда забыть о millis(), lastMillis, previousMillis и расстановке флагов
посмотрите простенькую бибпиотеку:
http://arduino.cc/playground/Code/SimpleTimer
Сказка!
В сетупе
timer.setInterval(15000, RepeatTask);
timer.setTimeout(10000, OnceOnlyTask);
timer.setInterval(1000, DigitalClockDisplay);
timer.setTimer(1200, TenTimesTask, 10);
В лупе только timer.run();
Сама с миллисами работает,
можно выполнять единожды, можно энное количество раз, можно периодически...
Таймеры можно разрешать, запрещать, удалять, рестартовать как угодно(но обычно это не надо)
Очень удобно работает setTimeout - вставляется вместо delay()
"
Решил испытать простоту. Но....
#include <SimpleTimer.h>
int LED =16;
int LED2 =15;
int buttonPin = 3;
int buttonState = 0;
SimpleTimer timer;
void OnceOnlyTask() {
digitalWrite(LED,LOW);
digitalWrite(LED2, HIGH);
}
void setup() {
timer.setTimeout(2000, OnceOnlyTask);
pinMode(LED, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH)
{
timer.run();
}
else
{
digitalWrite(LED, HIGH);
digitalWrite(LED2, LOW);
}
}
Не работает как я хочу- (по нажатию кнопки задержка 2 сек и потом леды меняют состояние)
Если кнопку нажимаешь сразу после загрузки бутлоадера-какая-то задержка есть. А если нажимаю кнопку после 2 сек - леды переключаются сразу.Получается таймер сразу начинает работать , до команды timer.run();
1. как подключена кнопка?
2. рекомендую почитать вот тут http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...
Кнопка подключена к +5в и к 3му выводу,который через 10кОм подключен к земле.
И я бы хотел научиться пользоваться SilpleTIMER. В примерах все понятно . а на практике как использоать -не пойму. (Уровень IQ ARDU=0,00001-начинающий.)
В библиотеке в файле SimpleTimer.txt нашел такое:
"Чтобы навсегда забыть о millis(), lastMillis, previousMillis и расстановке флагов
посмотрите простенькую бибпиотеку:
http://arduino.cc/playground/Code/SimpleTimer
Сказка!
В сетупе
timer.setInterval(15000, RepeatTask);
timer.setTimeout(10000, OnceOnlyTask);
timer.setInterval(1000, DigitalClockDisplay);
timer.setTimer(1200, TenTimesTask, 10);
В лупе только timer.run();
Сама с миллисами работает,
можно выполнять единожды, можно энное количество раз, можно периодически...
Таймеры можно разрешать, запрещать, удалять, рестартовать как угодно(но обычно это не надо)
Очень удобно работает setTimeout - вставляется вместо delay()
"
Решил испытать простоту. Но....
Не работает как я хочу- (по нажатию кнопки задержка 2 сек и потом леды меняют состояние)
Если кнопку нажимаешь сразу после загрузки бутлоадера-какая-то задержка есть. А если нажимаю кнопку после 2 сек - леды переключаются сразу.Получается таймер сразу начинает работать , до команды timer.run();
Странно, "В библиотеке в файле SimpleTimer.txt" нашел...
Это мой комментарий на форуме...
Все не так сложно, попробуйте вот это:
#include <SimpleTimer.h> int LED =13; int buttonPin = 3; int buttonState = 0; SimpleTimer timer; void Led_ON() { digitalWrite(LED,HIGH); timer.setTimeout(1000, Led_OFF); } void Led_OFF(){ digitalWrite(LED,LOW); } void setup() { pinMode(LED, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); } void loop() { timer.run(); buttonState = digitalRead(buttonPin); if (buttonState == LOW){ timer.setTimeout(2000, Led_ON); } }Через 2 секунды после замыкания на землю третьего (3) входа платы
включает светодиод на 13 выходе и затем через секунду его выключает.
Спасибо ,trembo .Попробовал ваш код немного изменив его, так как у меня кнопка подключена к 5в и вход подтянут к земле через 10кОм.
#include <SimpleTimer.h> int LED =13; int buttonPin = 3; int buttonState = 0; SimpleTimer timer; void Led_ON() { digitalWrite(LED,HIGH); timer.setTimeout(1000, Led_OFF); } void Led_OFF(){ digitalWrite(LED,LOW); } void setup() { pinMode(LED, OUTPUT); pinMode(buttonPin, INPUT); } void loop() { timer.run(); buttonState = digitalRead(buttonPin); if (buttonState == HIGH){ timer.setTimeout(2000, Led_ON); } }Все ОК. Буду эксперементировать дальше для более полного понимания.
То же пытаюсь разобратся с данной библиотекой. Возник вопрос, как остановить timer.setTimeout, если произошло нажатие на кнопу ON в течении 60 секунд после нажатия кнопки OFF, пока идет отчет времени? По моему мнению, что то должно быть вместо заков вопроса, нон не могу понять что.
#include <SimpleTimer.h> SimpleTimer timer; int ledPin = 13; int buttonPinON = 5; int buttonPinOFF = 6; void myLOW() { digitalWrite(ledPin, LOW); } void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPinON, INPUT); digitalWrite(buttonPinON, HIGH); pinMode(buttonPinOFF, INPUT); digitalWrite(buttonPinOFF, HIGH); } void loop() { timer.run(); if (digitalRead(buttonPinON) == LOW) { ?????? digitalWrite(ledPin, HIGH); } else if (digitalRead(buttonPinOFF) == LOW) { timer.setTimeout(60000, myLOW); } }http://playground.arduino.cc/Code/SimpleTimer#F_disable
http://playground.arduino.cc/Code/SimpleTimer#F_disable
Я видел данный оператор, но не понял как его использовать. Что такое timerId?
Порядковый номер таймера, в вашем случае это 0 или 1.
Порядковый номер таймера, в вашем случае это 0 или 1.
Попробовал и 0 и 1 не получается, таймер не останавливается.
if (digitalRead(buttonPinON) == LOW) { timer.disable(1); digitalWrite(ledPin, HIGH); } else if (digitalRead(buttonPinOFF) == LOW) { timer.setTimeout(60000, myLOW); }Я так понимаю, что timerId должен как то объявлен, но все равно не разберусь как.
int id = 0; void loop() { if (digitalRead(buttonPinON) == LOW) { timer.disable(id); digitalWrite(ledPin, HIGH); } else if (digitalRead(buttonPinOFF) == LOW) { id = timer.setTimeout(60000, myLOW); } }Да и вообще переставайте пользоваться такими бесполезно-"полезными" библиотеками!
#define ledPin 13 #define buttonPinON 5 #define buttonPinOFF 6 void setup() { pinMode(ledPin, OUTPUT); digitalWrite(buttonPinON, HIGH); digitalWrite(buttonPinOFF, HIGH); } void loop() { static uint32_t millis_start = 0; if(!digitalRead(buttonPinON)) { digitalWrite(ledPin, HIGH); millis_start = 0; } else if(!digitalRead(buttonPinOFF)) millis_start = millis(); if(millis_start && millis()-millis_start >= 60000) { millis_start = 0; digitalWrite(ledPin, LOW); } }maksim, спасибо!
Первый вариант с библиотекой SimpleTimer, что то всеравно не работает, зато великолепно работает второй вариант, сейчас пытаюсь разобратся и адаптировать для своих нужд. Так как с ардуино начал разбиратся совсем недавно есть несколько вопросов.
1. (!digitalRead(buttonPinON)) это аналог (digitalRead(buttonPinON) == LOW) при условии, что в setup задано digitalWrite(buttonPinON, HIGH);?
2. Для чего static?
3. Почему uint32_t, я так понимаю это заданно 32 бита, а не int?
4. И чем принципиально отличается int buttonPinON = 5; и #define buttonPinON 5?
..... Возник вопрос, как остановить timer.setTimeout .....
http://playground.arduino.cc/Code/SimpleTimer#F_setTimeout
After f has been called, the interval is deleted, therefore the value timerId is no longer valid.
Он и так однократный по своей природе: запустили когда надо, отработал и исчез, совсем исчез.
В отличии от setInterval который всегда работает.
Да и вообще переставайте пользоваться такими бесполезно-"полезными" библиотеками!
Не совсем согласен.
Глядя на это я вижу что через 60 секунд выполнится LED_ON
А вот глядя на это... таких чЮвств почему-то не возникает...
if(millis_start && millis()-millis_start >= 60000) { millis_start = 0; digitalWrite(ledPin, LOW); }Я хочу написать почти человеческим языком:
Через столько-то времени влючи ,пожалуйста, светодиод,
а какой там millis разберись сам, прошу Тебя, о Великий и Могучий Ардуин!
Я хочу ...
Только потом не удивляйтесь, если выполнив вашу хотелку, микроконтроллер не осилит собственно саму задачу - все весьма ограниченные ресурсы могут быть израсходованы намного быстрее, чем вы того хотите.
1. (!digitalRead(buttonPinON)) это аналог (digitalRead(buttonPinON) == LOW) при условии, что в setup задано digitalWrite(buttonPinON, HIGH);?
2. Для чего static?
3. Почему uint32_t, я так понимаю это заданно 32 бита, а не int?
4. И чем принципиально отличается int buttonPinON = 5; и #define buttonPinON 5?
1. Да и без условий digitalWrite() для вывода настроенного на вход включает "подтяжку".
2. Что бы не обьявлять переменную глобально.
3. http://arduino.ru/forum/programmirovanie/vopros#comment-8495
4. Тем что int занимает в памяти 2 байта, а #define ничего.
Тут еще немного про static написано.
Вот тут во втором примере показано как работать со ссылкой на таймер http://blog.ilyaplot.ru/arduino_setinterval/
Если нужно добавить второй, добавляем перед setup() строчку
а в setup() пишемгде interval - задержка, а callback - функция
Вообще в документации все хорошо описано. Посидите со словарем.
Никаких int ledTimer2; и ledTimer2= ...... прочтите , там всё разжёвано:
http://arduino.ru/forum/programmirovanie/pomogite-s-simpletimer#comment-...
в ledTimer2 пишется int таймера. Потом через эту переменную можно управлять таймером. Не надо управлять - не нужна переменная.
в ledTimer2 пишется int таймера. Потом через эту переменную можно управлять таймером. Не надо управлять - не нужна переменная.
помогите пожалуйста написать код без использования delay()
byte vibroPin[5] = {3,5,6,9,10}; void setup(){ for (int a = 0; a < 5; a++) { pinMode(vibroPin[a], OUTPUT); } } void loop(){ for (int a = 0; a < 5; a++) { digitalWrite(vibroPin[a], HIGH); delay(1000); digitalWrite(vibroPin[a], LOW); } }нужно, чтоб ардуинка в процессе на кнопку реагировала.
прошу прощения за ламерский вопрос, всю голову себе сломал.
Мигаем светодиодом без delay()
Максим, спасибо за наводку, я все это уже изучил. Но не могу применить на пяти светодиодах, точнее если нужно одновременно всеми помигать, то это пожалуйста, а вот чтоб сначала первый вкл. выкл., затем второй вкл. выкл и т.д., не получается.
byte vibroPin[5] = {3,5,6,9,10}; void setup(){ for (byte a = 0; a < 5; a++) pinMode(vibroPin[a], OUTPUT); digitalWrite(vibroPin[0], HIGH); } void loop() { static uint32_t pre_millis = 0; if(millis()-pre_millis > 1000) { pre_millis = millis(); static byte a = 0; digitalWrite(vibroPin[a], LOW); a++; if(a == 5) a = 0; digitalWrite(vibroPin[a], HIGH); } }Тезка, спасибо огромное!
Я не смог выйти за границы цыкла(
Не расскажите, что означает static uint32_t, конкретно интересует uint32_t, не гуглится).
http://arduino.ru/forum/programmirovanie/vopros#comment-8495
помогите пожалуйста написать код без использования delay()
byte vibroPin[5] = {3,5,6,9,10}; void setup(){ for (int a = 0; a < 5; a++) { pinMode(vibroPin[a], OUTPUT); } } void loop(){ for (int a = 0; a < 5; a++) { digitalWrite(vibroPin[a], HIGH); delay(1000); digitalWrite(vibroPin[a], LOW); } }нужно, чтоб ардуинка в процессе на кнопку реагировала.
прошу прощения за ламерский вопрос, всю голову себе сломал.
Нашол вот такую штуку для помигать с разным или одинаковым периодом
// Мигаем одним, двумя...10ю диотами с разным периодом // Задержка вместо delay!!!!!!! Может быть как t1 так и число int led = 13; int led2 = 10; unsigned long x; //Переменная для прошедшего периода "led" unsigned long b; //Переменная для прошедшего периода "led2" int t1 = 1000; //Время void setup() { pinMode(led, OUTPUT); pinMode(led2, OUTPUT); x = millis(); } void loop() { if (x != (millis() / t1)) { x = millis() / t1; digitalWrite(led, !digitalRead(led)); } if (b != (millis() / 250)) { b = millis() / 250; digitalWrite(led2, !digitalRead(led2)); } }А вообще когда писал код, то столкнулся с проблемой замирания программы при выполнении delay()
Стаж у меня не большой, поэтому о существовании библиотек решающих проблему не знал.
Написал вот такую Функцию которая и выручает меня все время
//Функция паузы int pause(int y) { bool x = 0; if (millis() - currentTime2 >= y) x = 1, currentTime2 = millis(); return x; }bool c = 0; void loop() for (int i = 8; i > 0; ) { c = pause (500); if (c == 1) { digitalWrite(led, !digitalRead(led)); //D13_Inv;//pin 13, +/- i = i - 1; c=0; } }что-то не могу разобраться как с этим SimpleTimer сделать такое:
а) раз в сутки в 19 часов включить LED1 на 5 минут. Ну или хотя бы просто раз в сутки, то с какого момента тогда будет отсчет?
б) то же самое, но дважды в сутки для LED2.
1. Вам нужны часики.
2. Очччччень коряво можно сделать примерно так:
Запускаем timer.setTimeout( 19часов, ЛЕД1_ОН);
В Таске ЛЕД1_ОН включаем ЛЕД1, запускаем таймаут на 5 минут - таск ЛЕД1_ОФФ.
В таске ЛЕД1_ОФФ выключаем ЛЕД1, и запускаем новый таск на (4 часа 55 минут)
Его срабатывание запускает ЛЕД1_ОН
Можно удалить, перенёс в новую тему.
http://arduino.ru/forum/programmirovanie/taimer-s-2-mya-usloviyami
В скетч особо не всматривался. Но судя по нему вы освоили работу с миллис. Зачем вам библиотека SIMPLE TIMER?Для наглядности?Что-бы как delay вставлять?
Здраствуите,
как сбросить таймера при перехода состояния start_stop пина.
#include <SimpleTimer.h> const int PLZ = 6; //start_stop const int LED_1 = 10; //plasma const int LED_2 = 11; //air int SF_1 = 0; int a = 0; int plasma_id; int air_id ; SimpleTimer timer; //***************AIR************************** void air() { digitalWrite(LED_1,LOW); digitalWrite(LED_2,HIGH); air_id = timer.setTimeout(4000, ISJ); } void ISJ(){ digitalWrite(LED_2,LOW); } // **************PLASMA*********************** void check(){ if(digitalRead(LED_2)==LOW && a==0) { digitalWrite(LED_1,HIGH); cut; } else{ plasma; } } void plasma(){ plasma_id = timer.setTimeout(2000,cut); } void stoptimer(){ digitalWrite(LED_2,LOW); } void cut(){ digitalWrite(LED_1,HIGH); if(a == 0) { digitalWrite(LED_1,LOW); } } void setup(){ pinMode(PLZ, INPUT_PULLUP); pinMode(LED_1, OUTPUT); pinMode(LED_2, OUTPUT); } void loop(){ timer.run(); SF_1 = digitalRead(PLZ); if(SF_1 == LOW) { delay(50); } if(SF_1 == LOW && a == 0) { check();//1 stoptimer();//2 plasma();//3 a = 1; } if(SF_1 == HIGH && a == 1) { delay(50); } if(SF_1 == HIGH && a == 1) { air(); a = 0; } }Есть очень удобная альтернатива SimpleTimer - библиотека plcStandardLib_1, она содержит таймеры и триггеры. Есть подробное описание и примеры. Она портирована из среды программирования промышленных контроллеров - CodeSys. Работает напрямую с пином. Настройки наглядно видно всего в двух строчках.
#include <plcStandardLib_1.h> int LED = 13; TP TP1(1000); //Инициализация единичного импульса, 1000мс (1сек). ////////////Soft_RTC settings unsigned long timeNow = 0; unsigned long timeLast = 0; //Time start Settings: int seconds = 0; int minutes = 0; /////////////////////////////// void Soft_RTC() { //функция программных часов реального времени timeNow = millis()/1000; seconds = timeNow - timeLast; if (seconds == 60) { timeLast = timeNow; minutes = minutes + 1; } Serial.println(seconds); } void setup() { pinMode(LED, OUTPUT); Serial.begin(9600); } void loop() { Soft_RTC(); digitalWrite(LED, TP1.Run(minutes == 1)); //При наступлении заданного времени, на выводе 13 //появится единичный импульс, длительностью 1сек. }Доброе время. Подскажите как применив библиотеку SimpleTimer заменить delay(500); я правильно понимаю, что нужно создать некую функцию, а потом её вызывать timer.setTimeout(500, функция); не могу сообразить, что в теле функции должно прописываться. Если не сложно покажите пример, скажем функции NOdelay () {...}. Спасибо.