Таймер обратного отсчета

Wadiy
Offline
Зарегистрирован: 03.03.2018

Доброго времени суток. Нужна помощь в создании СКЕТЧА для таймера обратного отсчета на ардуино. Задача сделать таймер показывающий на 1 LED экране сколько прошло лет от заданной точки, на 2 - месяцев, 3 - недель, 4 - дней, 5- часов:секунд. LED экраны думаю использовать Tm1637 4-разрядный 0.56 дюймов 7 сегментов. 

ven-til
Offline
Зарегистрирован: 13.02.2018

 Для начала нужно собрать устройство.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Т.е. у Вас будет пять экранов? ну, Вы сначала их соберите, запустите и для начала покажите на 1-ом цифру 1, на втором - цифру 2, на третьем, цифру 3, а тогда и поговорим. Тем более, что скетч очень сильно зависит от того, как именно Вы их соберёте.

Wadiy
Offline
Зарегистрирован: 03.03.2018

В этом тоже есть вопрос. Мне мужно в схему включать часы реального времени или нужно только ардуино и экраны.

Wadiy
Offline
Зарегистрирован: 03.03.2018

Сколько искал не нашел ни одного проекта чтобы отсчитывали именно так. 

Wadiy
Offline
Зарегистрирован: 03.03.2018

думаю использовать такой. или есть что-нибудь более дешево и сердито.

b707
Онлайн
Зарегистрирован: 26.05.2017

Wadiy пишет:

Сколько искал не нашел ни одного проекта чтобы отсчитывали именно так. 

а вы не ищите "именно так" Поищите скетчи часов на ардуино - их в сети десятки. А когда научитесь выводить текущее время - только именно научитесь, а не тупо скопируете готовое - думаю, переделать в обратный таймер труда не составит.

mag155
Offline
Зарегистрирован: 21.12.2017

Всем привет! Как по состояние трех входов запустить три не зависимых таймера ?

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

mag155,

void setup(){
  // ...
  pinMode(in1,INPUT_PULLUP);
  pinMode(in2,INPUT_PULLUP);
  pinMode(in3,INPUT_PULLUP);
}

void loop(){
  // ...
  if(!digitalRead(in1)){
    if(millis()-timer1>=interval1){
      // do shit
      timer1=millis();
    }
  }
  // same 2 more times with in2, timer2 interval2, etc
  // ...
}

Яш надеюсь доходит что timer1,2,3 имеет тип unsigned long, тип interval1,2,3 - целое, что время в миллисекундах (название функции намекает) и in1,2,3 - дефайны на номера выводов на кот. отсл. состояние. Алсо INPUT_PULLUP подразумевает что эти выводы не могут быть A6, A7.

mag155
Offline
Зарегистрирован: 21.12.2017

Но разве millis не использует один таймер ? Потому как все три должны работать не зависимо друг от друга .

mag155
Offline
Зарегистрирован: 21.12.2017

И импульс на вкл. Таймера очень короткий. То есть нажали подождали а потом включили тут не пройдет .Нужно есть импульс ждем потом включаем и так 3 независимых канала. Подскажите как это реализовать ?

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Вы разные имена переменной с меткой времени видите? timer1, timer2 и т. д.

millis() одна, да делает за всех.

Если импульс короткий - программу из условия вытащить в друге условие по флагу, а вместо неё в условии нажатия кнопки на выводе ставить этот флаг. Предусмотреть чем его сбрасывать.

Если импуль очень короткий - всё как сказано выше, но условие кнопки будет не if(!digitalWrite(x)) а в функции, которая делается обработчиком при помощи attachInterrupt(). Так же, с флагом дабы не было затупов, либо внутри этой функции на некоторое время detachInterrupt(). Учтите, что внутри функций-обработчиков прерываний время не работает (вызов millis() возвращает одно и то же число).

mag155
Offline
Зарегистрирован: 21.12.2017

А как же тогда менять время от импульса до включения входа если millis возвращает одно и тоже число ?

mag155
Offline
Зарегистрирован: 21.12.2017

До включения выхода .

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mag155 пишет:
Всем привет! Как по состояние трех входов запустить три не зависимых таймера ?

Молча. Есть 100500 способов.

1. Лоховской способ. Новичкам он кажется самым простым, но на самом деле, чтобы его отладить нужно быть ... не новичком: завести три пары переменных (начала - продолжительность) и все три отрабатывать на одном миллисе.

2. более или менее нормальный. Завести класс "таймер". Создать три экземпляра (если надо, то и пять) и спокойно ими пользоваться. Намного проще и потому легче отлаживать.

Остальные 100498 способов я пока опущу.

mag155 пишет:
Но разве millis не использует один таймер ? Потому как все три должны работать не зависимо друг от друга .

Памереть и не вставать!

mag155
Offline
Зарегистрирован: 21.12.2017

Идею я понял. Берем таймер завод им три переменные и считаем. Меня запутала информация где автор писал что один таймер может считать одно действие То есть для 3 действий надо три таймера. Но как я понял каждый таймер может работать с несколькими переменными. А но если мы используем например таймер который использует шим то параллельно с ним шим уже работать не будет. Так.?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

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

mag155
Offline
Зарегистрирован: 21.12.2017

При частоте импульсов 100 герц простое считывание состояние входа if(!digitalWrite(x)) будет успевать ?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Успевать куда?

mag155
Offline
Зарегистрирован: 21.12.2017

Отслеживать состояние входа и запускать таймер. То есть считываем импульс запускаем таймер после отсчета таймера вкл. Выход.

nik182
Онлайн
Зарегистрирован: 04.05.2015

Однозначно.

mag155
Offline
Зарегистрирован: 21.12.2017

Это радует.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Гуглить TTimerList

После празьников/запоя я исправленную версию выкладу.

Покашто там AddStopped неправильно работает

mag155
Offline
Зарегистрирован: 21.12.2017

Ок.

mag155
Offline
Зарегистрирован: 21.12.2017

Всем привет нашел вот такой таймер который запускается по приррыванию. Вопрос как допилить так чтоб когда происходит прерывание проверять по какой из фаз оно прошло то есть какой из трех входов активный запускать таймер и включать свой выход по истичению таймера?

#define dimPin 4
#define zeroPin 2
#include <CyberLib.h> // шустрая библиотека для таймера
volatile int tic, Dimmer;

void setup() {
  Serial.begin(9600);
  pinMode(dimPin, OUTPUT);
  digitalWrite(dimPin, 0);
  pinMode(zeroPin, INPUT);                 // настраиваем порт на вход для отслеживания прохождения сигнала через ноль
  attachInterrupt(0, detect_up, FALLING);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень

  StartTimer1(timer_interrupt, 40);        // время для одного разряда ШИМ
  StopTimer1();                            // остановить таймер

  Serial.println("Start");
}

void loop() {

  // раскомментировать для ввода числа диммирования чеерез монитор порта (0 - 255)
  if (Serial.available()) {
    Dimmer = Serial.parseInt();
    Serial.println(Dimmer);
  }
  
  // раскомментировать для управления потенциометром (аналоговый А0)
  // Dimmer = map(analogRead(0), 0, 1023, 240, 0);
}

//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
void timer_interrupt() {       // прерывания таймера срабатывают каждые 40 мкс
  tic++;                       // счетчик
  if (tic > Dimmer)            // если настало время включать ток
    digitalWrite(dimPin, 1);   // врубить ток
}

void  detect_up() {    // обработка внешнего прерывания на пересекание нуля снизу
  tic = 0;                                  // обнулить счетчик
  ResumeTimer1();                           // перезапустить таймер
  attachInterrupt(0, detect_down, RISING);  // перенастроить прерывание
}

void  detect_down() {  // обработка внешнего прерывания на пересекание нуля сверху
  tic = 0;                                  // обнулить счетчик
  StopTimer1();                             // остановить таймер
  digitalWrite(dimPin, 0);                  // вырубить ток
  attachInterrupt(0, detect_up, FALLING);   // перенастроить прерывание
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mag155 пишет:

Вопрос как допилить 

А как все нормальные люди пилят?

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

А как все нормальные люди пилят?

И самое смешное, это не прикол. Именно таким образом, боец из южных республик, тогдашнего СССР, срезал швелер выступающий из стены первого блока РоАЭС, примерно на уровне третьего этажа. На вопрос, накуя так, ответил: Командир сказала, ровно со стеной. Был премирован дембелем.

mag155
Offline
Зарегистрирован: 21.12.2017

Клас !!!