Таймер по сигналу.

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Всем доброго.

Есть такая задача: Имеем три кнопки(1, 2, 3) и одно реле. Каждое нажатие на кнопку  "1" добавляет 1 минуту, этим задаем время. Реле включается. Пока удерживаем кнопку "2" заданное время отсчитывается в обратном порядке, отпускаем - отсчет останавливается. Нажатием кнопки "3" делаем сбром времени в 0:00. Реле выключается по достижении времени 0:00 либо при сбросе времени(что одно и то же.) Время соответственно выводится на экран.

Интересует, как организовать обратный отсчет?

X-Dron
Offline
Зарегистрирован: 24.01.2015

Тима пишет:

Пока удерживаем кнопку "2" заданное время отсчитывается в обратном порядке, отпускаем - отсчет останавливается.

При следующем нажатии на 2 отсчет с максимального значения, или с того на котором остановились?

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

С того, на котором остановился.

X-Dron
Offline
Зарегистрирован: 24.01.2015

Что-нибудь типа такого

    #include <DI.h>         //подключаем библиотеку DI - обработка дискретного входа из набора библиотек от X-Dron  
    #include <Timer_P.h>    //подключаем библиотеку Timer_P - работа с таямерами из набора библиотек от X-Dron
    
    #define Condition_PIN 2     //PIN кнопки условия работы таймера 
    #define Reset_PIN 3         //PIN кнопки сброса таймера
    #define Set_PIN 4           //PIN кнопки установки таймера
    #define Relay_PIN 7         //PIN реле
    
    Timer_P Timer;               //создание и инициализация объекта Timer_Test класса Timer_P
    // Создание объектов типа "Дистретный вход" они посажены описанные выше пины. Фильтр антидребезга 10мс.
    DI Condition_IN(Condition_PIN, 10);              
    DI Reset_IN(Reset_PIN, 10);
    DI Set_IN(Set_PIN, 10);
    boolean Set_IN_Old;
    long Dur;
    
    void setup() {
      //Режимы выходов 
      pinMode(Relay_PIN, OUTPUT);
      //делать pinMode для входов не нужно. Они инициализируются при создании объекта класса DI
      //при работе со входами используется INPUT_PULLUP-режим. Значения входов нормализовываются во время обработки класса.
      //замкнутая кнопка - логическая 1.
      Serial.begin(9600); 
    }
    
    void loop() {
      // Обновляем значение дискретных входов
      // Производится их считывание с пинов и фильтрация через внутреннюю переменную класса. 
      Condition_IN.DI_Refresh();
      Reset_IN.DI_Refresh();
      Set_IN.DI_Refresh();

      //Запускаем таймер по фильтрованной кнопке запуска таймера.
      //Сброс выполнения таймера по фильтрованной кнопке сброса таймера.
      //Режим работы таймера - Mode = 1 extended pulse 
      digitalWrite(Relay_PIN, Timer.Timer(Condition_IN.DI_Read(), Reset_IN.DI_Read(), 0, Dur));
      
      //Получаем значение отсрочки срабатывания таймера
      long T_Remains = Timer.GetRemains();
      Serial.println(T_Remains);
      if (Set_IN.DI_Read() && !Set_IN_Old) Dur = Dur + 60000;
      if (Reset_IN.DI_Read()) Dur = 0;
      Set_IN_Old = Set_IN.DI_Read();
    }

Библиотека  здесь

https://github.com/X-Dron/X-Dron_lib/archive/master.zip

Это для схемы со стягивающим резистором

X-Dron
Offline
Зарегистрирован: 24.01.2015

Тима пишет:

С того, на котором остановился.

тогда не подходит