Хитрое реле задержки

Тема в разделе "Arduino & Shields", создана пользователем johnnie, 7 янв 2019.

  1. johnnie

    johnnie Нуб

    Дано:

    Есть датчик потока воды ГВС в котле. Он 3-х проводной: +5В, Общий, Выход.
    Когда потока воды нет, на выходе либо 0В, либо +5В. Когда есть - импульсы, частота которых пропорциональна потоку.

    Надо:

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

    Есть:

    Мозги и руки. На Arduino проектов не делал, но делал на ATMELах в ассемблере.
    Помогите набросать код, ведь он простой будет, или пните в нужную сторону с алгоритмом.
     
    Последнее редактирование: 7 янв 2019
  2. Belkin

    Belkin Гик

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

    Для начала помигайте светодиодиком, потом поиграйтесь с кнопками (светодиод не отключайте, используйте).
    Затем поинтересуйтесь термином "таймер" и его (таймера) использованием.
    Примеров навалом.
    Остальное само придет... ;)

    Если "не придет", то вам - в "Закажу..."... ;)
     
  3. parovoZZ

    parovoZZ Гуру

    Всё просто - тактирование таймера (он же просто счетчик) вешаешь на внешний пин. На этот пин подаешь свои импульсы. В цифровом компараторе вводишь необходимое число (то бишь период или N импульсов). По совпадению значений в счетчике и компараторе разрешаешь прерывание. Ну а дальше делаешь всё, что захочешь.
    Да, пока счетчик тикает, можешь в сон залечь - таймер (он же просто счетчик) теперь тикает асинхронно и в МК не нуждается)
    Let's GO!
     
  4. johnnie

    johnnie Нуб

    Мне импульсы считать не надо, мне секунды считать надо. Обязательно буду впадать в сон, как только научусь это делать.

    Вот, что я накидал:

    Начальная инициализация:

    1. TRANSMIT = 0; // Разрешение передачи
    2. TransmitDelay = 0; // Задержка передачи в секундах
    3. Разрешить только прерывание по фронту на входе;
    -----------------------------------------------------------------------------------

    Обработчик прерывания по фронту на входе:

    if TRANSMIT then OUT = IN
    else if TransmitDelay == 0
    then 1. Запретить прерывание по фронту на входе
    2. Обнулить аппаратный счетчик по входу
    3. Разрешить прерывание по окончанию счета таймера (переполнения?);
    4. Запустить таймер по кругу на 1 секунду.
    -----------------------------------------------------------------------------------

    Обработчик прерывания окончания счета от таймера:

    1. Если аппаратный счетчик по входу == 0,
    то TRANSMIT = 0
    TransmitDelay = 0
    запретить прерывания от таймера
    остановить таймер
    Разрешить прерывание по фронту на входе
    иначе TransmitDelay++;

    2. if TransmitDelay == N
    then TRANSMIT = 1
    Разрешить прерывание по фронту на входе
    3. Обнулить аппаратный счетчик по входу
     
    Последнее редактирование: 7 янв 2019
  5. johnnie

    johnnie Нуб

    Вот код для повтора входа на выход (без условий пока):
    Код (C++):
    const int INPin = 2;  // номер вывода входа
    const int OUTPin =  13;  // номер вывода выхода пока со светодиодом

    volatile int INState = 0;  // переменная для чтения состояния входа

    void setup()
    {
      // настроить вывод OUT на выход:
      pinMode(OUTPin, OUTPUT);
      // настроить вывод IN на вход:
      pinMode(INPin, INPUT);
      // прикрепить прерывание к вектору ISR
      attachInterrupt(0, pin_ISR, CHANGE);
    }

    void loop()
    {
      // Здесь будем спать
    }

    void pin_ISR()
    {
      INState = digitalRead(INPin);
      digitalWrite(OUTPin, INState);
    }
     
    Последнее редактирование: 7 янв 2019