Проблема с прерываниями.

Евгений74
Offline
Зарегистрирован: 08.05.2012

 Всем привет. В ходе познания основ программирования и робототехники столкнулся с следующей проблемой:

Имеется Ардуино Уно, драйвер моторов robocraft.ru/blog/arduino/657.html, тележка с двумя ведущими колесами, и оптический энкодер( колесико прокрутки из оптической мыши) установленное в центре тележки.

Идея: Робот передвигается вперед и одновременно считает колличество проиденного пути.

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

#include <Servo.h>
#include <LMotorShield.h>

LMotorShield lms;
float encoder_left = 0;
void setup() {
{  
  pinMode(2,INPUT);//вход 2
  attachInterrupt(0, Encoder_L, RISING);
  Serial.begin(9600);
  lms.begin(LMS_SERVOS);
}
pinMode(3,OUTPUT); // Motor A скорость
pinMode(7,OUTPUT); // Motor A направление
pinMode(11,OUTPUT); // Motor B скорость
pinMode(8,OUTPUT); // Motor B направление
}
void Forward() { // Подпрограмма движения робота вперед
digitalWrite(3,HIGH);
digitalWrite(7,LOW);
digitalWrite(11,HIGH);
digitalWrite(8,LOW);
}

void loop()
{
 Forward();
 }
void Encoder_L(){
        encoder_left += 0.1;
 Serial.println(encoder_left);
 }

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Ловим помехи? Про потягивающий резиcтор не забыли. Либо внешний присобачить, либо внутренний подключить digitalWrite(2,HIGH);

Евгений74
Offline
Зарегистрирован: 08.05.2012

Да скорее всего помехи, рядом стоит двигатель. Подтягивающий резистор ставил та фототранзисторе на выходе, пробовал отдельно подтянуть ПИН 2 к GND резистором на 5,1 кОм. Все равно идет самопроизвольный набег счетчика, потом вообще виснет. По вашемк совету попробовал сделать так

void loop()
{
 digitalWrite(2,HIGH); 
 Forward();
}
void Encoder_L(){
        encoder_left += 0.1;
 Serial.println(encoder_left);
}

 

Не помогло. Может что то упустил? 

Евгений74
Offline
Зарегистрирован: 08.05.2012

Если энкодер не подключен, то без подтягивания ПИН2 на GND происходит произвольное срабатывание прерываний, если подтянуть, то все нормально. Если еще подцепить энкодер, то опять происходит произвольное прерывание

leshak
Offline
Зарегистрирован: 29.09.2011

 Ну во первых, подтяжку стоит достаточно включить один раз. там же где pinMode выставляете. А не каждый раз в цикле. Ни на что это не влиется, но просто в каждом цикле - одно лишние действие.

Во вторых. Нужно разобратся куда вы вообще пин хотите подтягивать. Внутреня - подтягиваеть умеет только к питанию.

То есть когда энкодер не трогаем - на пине стоит 1.

Так если вы внутренюю включили "к питанию", а внешнюю "к земле", то вы получили "кто кого перетянет" (не страшно, не опасно, просто "может не работать").

Но опять-таки нужно решить куда же вы тянуть хотите. Зависит от того что вы подключили на выход С энкодера (обычно средняя нога). Если туда вы подали землю, то "тянуть" нужно к питанию (+5v) (это обычная схема включения). Тянуть можно либо внутреней, либо внешней.

Если вы на C подали питание, то тянуть нужно "к земле" (тут уже только внешнюю использовать прийдется).

Если "подтяжки не помогли", то тут уже нужно смотреть что у вас происходит с питанием. Возможно оно прыгает (а зависы говорят в эту пользу). Может коротнули что-то, либо моторы слишком мощьные и просаживают питание.

 

Евгений74
Offline
Зарегистрирован: 08.05.2012

У оптической мышки как я понял стоят фототранзистор сдвоенный, то есть центральная нога это сдвоенный коллектор, а по бокам два эмиттера (или наоборот, не помню) . Я подал на центральную ногу GND, а с крайней сделал вывод на ПИН2, подтянув крайнюю ногу к GND через резистор 5,1 кОм. На драйвере моторов стоит конденсатор на 100mF, должен убирать просадку в напряжении, моторы вот такие www.aliexpress.com/product-fm/505652927-2pcs-lot-High-quality-tyre-Reduction-motor-fasteners-TT-motor-intelligent-car-wheels-wholesalers.html

Сам чайник, поэтому не могу разобраться.

Евгений74
Offline
Зарегистрирован: 08.05.2012

 Попробую разобрать еще раз энкодер и проверить, может действительно  КЗ

Евгений74
Offline
Зарегистрирован: 08.05.2012

 Не правильно написал. На центральную ногу подал +5 В. С крайней выход на ПИН и подтяжка к GND

 

Евгений74
Offline
Зарегистрирован: 08.05.2012

Моя проблема так и не решена. Двигатели создают помеху на фототранзистор. Попробовал соединить контакты двигателя керамикой на 0,1 мкФ. И каждый вывод двигателя соединил с корпусом двигателя так же керамикой 0,1 мкФ. Не помогло. Подключил двигатель поменьше, с ним проблем нет, но он мне не подходит. Возможно ли еще как нибудь загосить помехи от электромотора. 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Попробуйте уменьшить резистор подтяжки до 1 кОм 

Евгений74
Offline
Зарегистрирован: 08.05.2012

 

AlexFisher пишет:

Попробуйте уменьшить резистор подтяжки до 1 кОм

Не помогло. Попробовал вообще убрать подтяжку. Фототранзистор на свет вообще перестал реагировать, а на двигатель осталось по прежнему. 

ximik666
Offline
Зарегистрирован: 22.06.2012

 Добрый вечер! никто так и не решил проблему с наводками от двигателя на счетчик оборотов (энкодер)?

Евгений74
Offline
Зарегистрирован: 08.05.2012

ximik666 пишет:

 Добрый вечер! никто так и не решил проблему с наводками от двигателя на счетчик оборотов (энкодер)?

Пока кроме замены двигателя на менее мощный ни чего не придумал. А как у вас реализовано решение энкодера, и какой ДД используете?

 

ximik666
Offline
Зарегистрирован: 22.06.2012

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

ximik666 пишет:

 Добрый вечер! никто так и не решил проблему с наводками от двигателя на счетчик оборотов (энкодер)?

Пока кроме замены двигателя на менее мощный ни чего не придумал. А как у вас реализовано решение энкодера, и какой ДД используете?

 

Я использую готовый энкодер и платформу

http://www.dfrobot.com/index.php?route=product/product&filter_name=encod...

 http://www.dfrobot.com/index.php?route=product/product&path=37_111&product_id=97#.UEy_W40aOSo

Пробывал ставить кондеры на двигатели и на питание, разделил питание контроллера и моторов, все бесполезно! даже когда один энкодер отключен, он все равно что то считате!

Евгений74
Offline
Зарегистрирован: 08.05.2012

 ximik666 Какой драйвер моторов используете на 1 А или на 2 А?

ximik666
Offline
Зарегистрирован: 22.06.2012

Вот такой http://robotshop.su/e-store/catalog/203/1176/ , на 1.2 ампера

wowan
Offline
Зарегистрирован: 12.09.2012

Добрый день.

Проблема один в один.  Вот только драйвер двигателя другой ( 4 А на канал):

http://www.electronshik.ru/card/drayver-kollektornogo-dvigatelya-4-kanal...

Шунтирующий кондер стоит на моторчике (1шт на каждом).

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

Так что тоже очень жду новых идей - что можно сделать :)
 

 

wowan
Offline
Зарегистрирован: 12.09.2012

Со своей проблемой я разобрался. Может кому поможет информация. 
 

Оказалось, что помехи возникают не на энкодере, а их содает драйвер двигателей. У меня по схеме датчик втыкается в драйвер, а из него уже идет провод на контроллер. По схеме должен был сигнал выходить такой же как и входить, но в жизни оказалось все иначе :) Как только я сигнальный провод от энкодера подключил напрямую к Ардуино, сразу стали идти нормальные импульсы.

ssvs111
ssvs111 аватар
Offline
Зарегистрирован: 11.07.2014

ximik666 пишет:

 Добрый вечер! никто так и не решил проблему с наводками от двигателя на счетчик оборотов (энкодер)?

Есть решение проблеммы: Устраняем помехи при прерываниях

Столкнулся с похожей проблеммой с внешним прерыванием INT0. Коммерческий проэкт, вешаю на пин 2 монетоприемник по прерыванию. В обработчике прерывания подсчитываю импульсы, прибавляю к сумме. Все работает, но...

Если отверткой или щупом тестера касаюсь земли или пин 2  - происходят хаотические прерывания.

Менял номиналы подтягивающих резисторов, а позже стягивающих. Паралельно входу ставил конденсаторы, диоды. Менял питание, ничего не помогало. Сделал по другому: пин 2 соединил с пином 4, который назначил на вход и в обработчике добавил условие что считать импульсы можно, если пин 4 в этот момент притянут к земле.

Причину хаотических прерываний я так и не понял, но ясно одно - она не связана с уровнем на пине 2

вот код:

[code]
int oldmoney = 0;
volatile int money = 0; //сумма денег в боксе
byte coinin = 2; //пин монетоприемника
int pricepulse = 10; //цена импульса
 
void setup() {
  Serial.begin (9600);
  Serial.println (money);
  pinMode(coinin, INPUT);
  pinMode(4, INPUT);// защита от помех
  digitalWrite (coinin, HIGH); //подтягиваем к VCC
  attachInterrupt(0, count_pulse, FALLING); //обработка монетника
  }
void loop() {
   if (oldmoney != money) {
    Serial.println (money);
    oldmoney = money;
  }
}
void count_pulse() { //обработка монетника
  detachInterrupt(0);
  if (digitalRead (4)==LOW)  money = money + pricepulse;
  attachInterrupt(0, count_pulse, FALLING);
}
 

 

[/code]
Надеюсь я кому-то помогу...
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а зачем отклчюаешь прерывание? есть вероятность что пока пин считываешь еще одно придет?

нельзя сразу с 4 пина на прерывание повесить? или при попадании монеты дается 2 сигнала? что монета есть и какая монета на 4 пине. так?

можно написать так

pinMode(4, INPUT_PULLUP);

сразу подтяжка включится. не надо digitalWrite

в прерывании можно и не считывать пин. просто флаг менять. а в лупе по флагу считывать

 

ssvs111
ssvs111 аватар
Offline
Зарегистрирован: 11.07.2014

Монетник это таже кнопка между пином и землей, скорость максимум 8 импульсов в секунду - еще одгодно не придет.

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

По поводу pullup это я извращался по разному, рабочий вариант, на результат не повлиял

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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

ssvs111
ssvs111 аватар
Offline
Зарегистрирован: 11.07.2014

К питанию притягивал и к земле притягивал, до доработки результат тот же. А как лучше фильтры и экранирование применять? И как лучше землю разводить? Расскажите поподробней. Думаю многим, и мне в том числе будет интересно

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ssvs111, это слишком большая тема, и я не слишком большой специалист по ней :) Советую погуглить, там на тему зашиты от помех целые диссертации есть :) Основы "землеводства" доступным языком можно у ДиХалта почитать. Там-же в комментариях читателей так-же есть очень полезные ссылки.

ssvs111
ssvs111 аватар
Offline
Зарегистрирован: 11.07.2014

Очень полезные статьи, спасибо

boomych
Offline
Зарегистрирован: 28.12.2013

Столкнулся с аналогичной проблемой - совершенно непредсказуемая помеха по прерыванию. Ставил подтяжки, обвесил все фильтрами по питанию как гирляндой - ничего не меняется. Но у меня не монетоприемник, а 6-импульсный датчик скорости в машине. При чем глубоко пофиг - подключен выход датчика к дуине или из порта дуины просто провод торчит без подключения.

Вариант с двумя портами интересен, но тут возникает вопрос: какое время проходит с момента отработки attachinterrupt до последующего digitalRead? Хватит ли этого времени на считывание импульса датчика скорости?

И еще мысль бродит, но никак не могу ее оформить. Что, если использовать attachinterrupt не по RISING или FALLING, а по CHANGE? В этом случае можно четко отловить фронт-тыл сигнала на меандре, длительность импульса и т.д. И дальше смотреть по длительности импульса - если меньше какого-то значения, то помеха, если больше - полезный сигнал. Но нигде не могу найти длительность импульса для стандартного датчика скорости. И, опять же, непонятно - в датчике скорости с изменением скорости меняется только частота сигнала или скважность тоже?

ssvs111
ssvs111 аватар
Offline
Зарегистрирован: 11.07.2014

Если есть помеха по прерыванию, то изменение режима прерывания ни к чему не приведет, потому что ( повторюсь) ложное прерывание происходит не потому что изменилось состояние пина прерывания, а по другой непонятной причине, и измерять длительность импульса в обработчике не к чему не приведет.. К тому же с изменением скорости будет меняться длительность входного импульса

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


volatile int counter;
#define coin 2 //пин под прерывания

void setup() {
  pinMode(coin, INPUT_PULLUP); //подтягиваем к VCC
  attachInterrupt(0, count_pulse, FALLING);
}
void loop() {
  // бла бла бла
}

void count_pulse() { 	//обработка прерывания
  if (digitalRead (coin) == LOW) counter++;	// подсчет только «правильных» прерываний
}

 

Olm
Offline
Зарегистрирован: 09.10.2014

Я на внешних прерываниях так и не смог добиться стабильной работы энкодера без помех с кабелем 20 метров(ближе никак). Проблему решил опросом состояний пинов  по прерыванию по таймеру и условие - несколько раз подряд  считать одинаковое состояние пинов энкодера чтоб исключить помехи, и еще RC фильтр низких частот парралельно.

Seriga
Offline
Зарегистрирован: 01.06.2015

Я пришел к выводу, что помеха идет не по питанию, а является внешней электромагнитной. Если пин прерывания не подключен то все отлично, а вот если присоединить к нему небольшой длины провод то тут начинается свистопляска. 

Seriga
Offline
Зарегистрирован: 01.06.2015

Я тоже пришел именно к такому решению. Но к сожалению оно всё-таки тоже не работает.

Olm
Offline
Зарегистрирован: 09.10.2014

Вот калькулятором для расчета фильтра низких частот пользовался.

http://gyrator.ru/rc-filter

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

Подбирай резистор и конденсатор так чтоб на этой частоте Амплитуда выходного сигнала,

была ниже 2х вольт чтоб ноль читался на частотах выше максимальной 

 

acelamond
Offline
Зарегистрирован: 19.10.2014

Seriga пишет:

Я пришел к выводу, что помеха идет не по питанию, а является внешней электромагнитной. Если пин прерывания не подключен то все отлично, а вот если присоединить к нему небольшой длины провод то тут начинается свистопляска. 

 

Друг, выложи код с опросом одинакового состояния пинов, ато ППЦ, та же хрень помехи, вращаю 2 двигателя, считаю обороты через оптопару по прерыванию. Помехи затрахали уже. Махаюсь с этим вопросом больше половины года.

ssvs111
ssvs111 аватар
Offline
Зарегистрирован: 11.07.2014

Важный момент:  недопустимо использовать внутренний подтягивающий резистор на пине прерывания, только внешний

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ssvs111 пишет:

Важный момент:  недопустимо использовать внутренний подтягивающий резистор на пине прерывания, только внешний

Наверное стоит обосновать такое категоричное заявление?

ssvs111
ssvs111 аватар
Offline
Зарегистрирован: 11.07.2014

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ssvs111, думаю у вас проблема была в другом, но применив внешнюю подтяжку случайно удалось приглушить помеху. Особенно исходя из того, что вы пишите в #18.  Всё это обход проблемы, а не решение. Скорее всего у вас что-то с разводкой питания. Где-то что-то отвалилось, может плюс, может питание, и МК начинает цеплять любые наводки, пришедшие даже через воздух. По крайней мере то, что вы писали про глюк при касании пальцем общего провода -это типичный признак отвалившейся земли.  Необходима тотальная прозвонка всех линий питания микроомметром. Измерение тока потребления  по плюсу и по минусу. МК, как любая кмоп-микросхема может работать вообще без питания, беря крохи с любого из своих подключенных входов, и создавая полную иллюзию работоспособности. Например та-же внешняя подтяжка может питать и сам МК, и облегчать ему работу при отсутствии основного питания.

alexky
Offline
Зарегистрирован: 18.03.2016

ssvs111 пишет:

ximik666 пишет:

 Добрый вечер! никто так и не решил проблему с наводками от двигателя на счетчик оборотов (энкодер)?

Есть решение проблеммы: Устраняем помехи при прерываниях

Столкнулся с похожей проблеммой с внешним прерыванием INT0. Коммерческий проэкт, вешаю на пин 2 монетоприемник по прерыванию. В обработчике прерывания подсчитываю импульсы, прибавляю к сумме. Все работает, но...

Если отверткой или щупом тестера касаюсь земли или пин 2  - происходят хаотические прерывания.

Менял номиналы подтягивающих резисторов, а позже стягивающих. Паралельно входу ставил конденсаторы, диоды. Менял питание, ничего не помогало. Сделал по другому: пин 2 соединил с пином 4, который назначил на вход и в обработчике добавил условие что считать импульсы можно, если пин 4 в этот момент притянут к земле.

Причину хаотических прерываний я так и не понял, но ясно одно - она не связана с уровнем на пине 2

вот код:

[code]
int oldmoney = 0;
volatile int money = 0; //сумма денег в боксе
byte coinin = 2; //пин монетоприемника
int pricepulse = 10; //цена импульса
 
void setup() {
  Serial.begin (9600);
  Serial.println (money);
  pinMode(coinin, INPUT);
  pinMode(4, INPUT);// защита от помех
  digitalWrite (coinin, HIGH); //подтягиваем к VCC
  attachInterrupt(0, count_pulse, FALLING); //обработка монетника
  }
void loop() {
   if (oldmoney != money) {
    Serial.println (money);
    oldmoney = money;
  }
}
void count_pulse() { //обработка монетника
  detachInterrupt(0);
  if (digitalRead (4)==LOW)  money = money + pricepulse;
  attachInterrupt(0, count_pulse, FALLING);
}
 

 

[/code]
Надеюсь я кому-то помогу...

Проект PRO Mini и монетоприемник. Все вышеописанные проблемы в наличии. Сделал как описано в цитате. Проблема решилась наполовину. Т.е. исчезли ложные прерывания при трогании отверткой любого провода. Причем именно отверткой, любой. При трогании голыми руками никаких ложных сработок небыло. Но остались ложные прерывания при трогании отверткой 2-го пина. Проблема решилась задержкой. Так как в обработчике прерывания не работает delay(), а минимальный импульс с монетоприемника 15ms, то до опроса состояния pin 2 ввел цикл до 1000 пустых опросов pin2 (начинал со 100 - уже работает). В Вашем коде это выглядело бы так:

void count_pulse() { //обработка монетника
int s; 
detachInterrupt(0);
  for (int s=0; s <= 1000; s++) {digitalRead(4);   }
 if (digitalRead (4)==LOW)  money = money + pricepulse;
  attachInterrupt(0, count_pulse, FALLING);
}
 
AVPD
Offline
Зарегистрирован: 16.04.2017

Проблема та же, использую плату с STM32F103C8T6 из под Arduino. На 3х внешних прерываниях сидят кнопки и оптопары управления. + Одно внешнее прерывание используется в схеме без длинных цепей. Схемотехника простая - внешний подтягивающий к Vcc 3.3в коротится на землю кнопкой или транзистором оптопары 4n35. При касании земли,  +питания, оптопар и еще чего угодно прерывания отрабатывают в случайном порядке или все сразу, т.е. совершенно хаотично и непредсказуемо. Совершенно не пойму схему действия помехи. Пробовал питание от АКБ, не помогает. На входах допаивал емкости, менял номиналы подтягивающих.  Такое впечатление, что проблема сидит в разводке самих плат ардуино и прочих подобных.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AVPD, это разводка земли. Входящий сигнал на МК или исходящий из МК возвращается по "длинной земле"  на входные порты, подключенные к прерываниям. Решение -требуется разводка земли по всем правилам науки.

Vredina
Offline
Зарегистрирован: 12.05.2021

Я столкнулся с аналогичной проблемой и тоже не разобрался в природе помех. В моем случае помехи возникали спорадически два раза в год ;) Пропадали после изменения схемы или просто так. решил проблему изменением кода на:

volatile boolean ch2;
volatile long IMP2 = 0;

void setup(){
pinMode(2, INPUT_PULLUP);//  Impuls 2
attachInterrupt(digitalPinToInterrupt(2), Imp_1, CHANGE);
}

void loop(){
}

void Imp_1() {
  if (digitalRead(2) == HIGH){
      if (digitalRead(2) == HIGH){
          if (digitalRead(2) == HIGH) ch2 = true;
      }
  }
  if (digitalRead(2) == LOW){
      if (digitalRead(2) == LOW){
          if (digitalRead(2) == LOW){
              if (ch2 == true){
                IMP2++; impS = true;
              }
              ch2 = false;
          }
      }
  }
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Что за бред все куда прозаичнее.

void MyINTERRUPT(){
static uint32_t interval=millis();
if(inteval-millis()>=5){//здесь 5 время дребезга
IMP++;
interval=millis();
}
}
//Зачем вам прерывание по CHANGE ?

//Если нужно направление вращения то, все точно так же элементарно и не важно FALLING RISING

if(interval-millis()>=5){
interval=millis();
if(digitalRead(Enc_A)==digitalRead(Enc_B))IMP++;
else IMP--;
}

 

Alex_Mn
Offline
Зарегистрирован: 07.05.2021

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


const unsigned int D = 100; 

unsigned long btnTimer;                                       // обьявляем переменную для определения нажатия кнопки во времени

volatile boolean intFlag1 = false;                            // обьявляем переменную (1 кнопки) для прерывания.


void setup() {
  pinMode(2, INPUT_PULLUP);                                   //задаем на 2 пин вход режим PULLUP, прерывание 0 (1 кнопки)
  
  attachInterrupt(digitalPinToInterrupt(2), buttonPressed1, FALLING); // функция для создания внешнего прерывания на контакте 2 для события повышения уровня (с HIGH на LOW)
}

void loop() {                                  

  if (digitalRead(2) == LOW && intFlag1 == true && millis() - btnTimer >= D) {
    btnTimer = millis();
    intFlag1 = false;                              // сбрасываем его и продолжаем
чето делаем;
  }

}



void buttonPressed1() {                          // функция отработки нажатия 1 кнопки.

  if (digitalRead(2) == LOW) {
    btnTimer = millis();                         // записываем время когда сработал флаг
    intFlag1 = true;                             // поднимаем флаг 1.
  }
}