Помогите с SimpleTimer.

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

Хочу разобраться с работой 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();

 

toc
Offline
Зарегистрирован: 09.02.2013

1. как подключена кнопка?

2. рекомендую почитать вот тут http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

Кнопка подключена к +5в и к 3му выводу,который через 10кОм подключен к земле.

4ERTIK
Offline
Зарегистрирован: 24.03.2013

 И я бы хотел научиться пользоваться  SilpleTIMER. В примерах все понятно . а на практике как использоать -не пойму. (Уровень IQ ARDU=0,00001-начинающий.)

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

nikolaki пишет:

В библиотеке в файле 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 выходе и затем через секунду его выключает.

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

Спасибо ,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);
  }

}

Все ОК. Буду эксперементировать дальше для более полного понимания.

 

lti1
Offline
Зарегистрирован: 12.05.2013

То же пытаюсь разобратся с данной библиотекой. Возник вопрос, как остановить 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);
    }
}
maksim
Offline
Зарегистрирован: 12.02.2012
lti1
Offline
Зарегистрирован: 12.05.2013

maksim пишет:

http://playground.arduino.cc/Code/SimpleTimer#F_disable

timer.disable(timerId);

Я видел данный оператор, но не понял как его использовать. Что такое timerId?

maksim
Offline
Зарегистрирован: 12.02.2012

Порядковый номер таймера, в вашем случае это 0 или 1.

 

lti1
Offline
Зарегистрирован: 12.05.2013

maksim пишет:

Порядковый номер таймера, в вашем случае это 0 или 1.

Попробовал и 0 и 1 не получается, таймер не останавливается.

    if (digitalRead(buttonPinON) == LOW)
    {
      timer.disable(1);
      digitalWrite(ledPin, HIGH);
    }
        
    else if (digitalRead(buttonPinOFF) == LOW)
    {
      timer.setTimeout(60000, myLOW);
    } 

Я так понимаю, что timerId должен как то объявлен, но все равно не разберусь как.

maksim
Offline
Зарегистрирован: 12.02.2012
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);
  }
}

 

lti1
Offline
Зарегистрирован: 12.05.2013

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?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

lti1 пишет:

..... Возник вопрос, как остановить 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 который всегда работает.

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

maksim пишет:

Да и вообще переставайте пользоваться такими бесполезно-"полезными" библиотеками!

Не совсем согласен.

timer.setTimeout(60000, LED_ON);

Глядя на это я вижу что через 60 секунд выполнится   LED_ON

А вот глядя на это... таких чЮвств почему-то не возникает...

if(millis_start && millis()-millis_start >= 60000)
  {
    millis_start = 0;
    digitalWrite(ledPin, LOW);
  }

Я хочу написать почти человеческим языком:

Через столько-то времени влючи ,пожалуйста, светодиод,

а какой там  millis разберись сам, прошу Тебя,  о Великий и Могучий Ардуин!

step962
Offline
Зарегистрирован: 23.05.2011

trembo пишет:

Я хочу ...

Только потом не удивляйтесь, если выполнив вашу хотелку, микроконтроллер не осилит собственно саму задачу - все весьма ограниченные ресурсы могут быть израсходованы намного быстрее, чем вы того хотите.

maksim
Offline
Зарегистрирован: 12.02.2012

lti1 пишет:

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 написано.

ilyaplot
Offline
Зарегистрирован: 26.06.2014

Вот тут во втором примере показано как работать со ссылкой на таймер http://blog.ilyaplot.ru/arduino_setinterval/

Если нужно добавить второй, добавляем перед setup() строчку 

int ledTimer2;

 а в setup() пишем 

ledTimer2 = timer.setInterval(interval, callback);

где interval - задержка, а callback - функция

Вообще в документации все хорошо описано. Посидите со словарем.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Никаких int ledTimer2;   и ledTimer2=  ......  прочтите , там всё разжёвано:

http://arduino.ru/forum/programmirovanie/pomogite-s-simpletimer#comment-...

ilyaplot
Offline
Зарегистрирован: 26.06.2014

в ledTimer2 пишется int таймера. Потом через эту переменную можно управлять таймером. Не надо управлять - не нужна переменная.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

ilyaplot пишет:

в ledTimer2 пишется int таймера. Потом через эту переменную можно управлять таймером. Не надо управлять - не нужна переменная.

 

manamaser
Offline
Зарегистрирован: 02.10.2014

помогите пожалуйста написать код без использования 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);
  }
}

нужно, чтоб ардуинка в процессе на кнопку реагировала.

прошу прощения за ламерский вопрос, всю голову себе сломал.

maksim
Offline
Зарегистрирован: 12.02.2012
manamaser
Offline
Зарегистрирован: 02.10.2014

Максим, спасибо за наводку, я все это уже изучил. Но не могу применить на пяти светодиодах, точнее если нужно одновременно всеми помигать, то это пожалуйста, а вот чтоб сначала первый вкл. выкл., затем второй вкл. выкл и т.д., не получается.

maksim
Offline
Зарегистрирован: 12.02.2012
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);
  }
}

 

manamaser
Offline
Зарегистрирован: 02.10.2014

Тезка, спасибо огромное!

Я не смог выйти за границы цыкла( 

Не расскажите, что означает static uint32_t, конкретно интересует uint32_t, не гуглится).

maksim
Offline
Зарегистрирован: 12.02.2012
vosara52
Offline
Зарегистрирован: 28.11.2014

manamaser пишет:

помогите пожалуйста написать код без использования 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));
  }
}
 
vosara52
Offline
Зарегистрирован: 28.11.2014

А вообще когда писал код, то столкнулся с проблемой замирания программы при выполнении 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;
        }
      }

 

Vittorio
Offline
Зарегистрирован: 02.02.2015

что-то не могу разобраться как с этим SimpleTimer сделать такое:

а) раз в сутки в 19 часов включить LED1 на 5 минут. Ну или хотя бы просто раз в сутки, то с какого момента тогда будет отсчет?

б) то же самое, но дважды в сутки для LED2.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

1.  Вам нужны часики.
2. Очччччень коряво можно сделать примерно так:

Запускаем    timer.setTimeout( 19часов, ЛЕД1_ОН);
В Таске ЛЕД1_ОН включаем ЛЕД1, запускаем таймаут на 5 минут - таск ЛЕД1_ОФФ.
В таске ЛЕД1_ОФФ выключаем ЛЕД1, и запускаем новый таск на (4 часа 55 минут)
Его срабатывание запускает ЛЕД1_ОН

 

mutis
Offline
Зарегистрирован: 24.09.2015

Можно удалить, перенёс в новую тему.

http://arduino.ru/forum/programmirovanie/taimer-s-2-mya-usloviyami

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

В скетч особо не всматривался. Но судя по нему вы освоили работу с миллис. Зачем вам библиотека SIMPLE TIMER?Для наглядности?Что-бы как delay вставлять?

mutis
Offline
Зарегистрирован: 24.09.2015

Здраствуите,
как сбросить таймера при перехода состояния 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;
  }  
}

 

Fireforce
Offline
Зарегистрирован: 08.09.2017

Есть очень удобная альтернатива 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сек.
}