Дано: Есть датчик потока воды ГВС в котле. Он 3-х проводной: +5В, Общий, Выход. Когда потока воды нет, на выходе либо 0В, либо +5В. Когда есть - импульсы, частота которых пропорциональна потоку. Надо: В разрыв сигнального провода поставить Arduino Nano, которая будет вырезать первые N секунд каждой серии импульсов. Есть: Мозги и руки. На Arduino проектов не делал, но делал на ATMELах в ассемблере. Помогите набросать код, ведь он простой будет, или пните в нужную сторону с алгоритмом.
Все, что нужно для успешного начала ! Не мешало бы добавить познаний в электротехнике... Для начала помигайте светодиодиком, потом поиграйтесь с кнопками (светодиод не отключайте, используйте). Затем поинтересуйтесь термином "таймер" и его (таймера) использованием. Примеров навалом. Остальное само придет... Если "не придет", то вам - в "Закажу..."...
Всё просто - тактирование таймера (он же просто счетчик) вешаешь на внешний пин. На этот пин подаешь свои импульсы. В цифровом компараторе вводишь необходимое число (то бишь период или N импульсов). По совпадению значений в счетчике и компараторе разрешаешь прерывание. Ну а дальше делаешь всё, что захочешь. Да, пока счетчик тикает, можешь в сон залечь - таймер (он же просто счетчик) теперь тикает асинхронно и в МК не нуждается) Let's GO!
Мне импульсы считать не надо, мне секунды считать надо. Обязательно буду впадать в сон, как только научусь это делать. Вот, что я накидал: Начальная инициализация: 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. Обнулить аппаратный счетчик по входу
Вот код для повтора входа на выход (без условий пока): Код (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); }