Управление реле одной кнопкой ардуино без фиксации

Урок 8 — Подключаем реле к Arduino. Пример работы и скетч

Подключить реле к Arduino достаточно просто. Для примера мы будем использовать Скетч и подключения из урока: Урок2. Нажатие кнопки без ложных срабатываний.Устраняем дребезг кнопки

В схеме вместо светодиода с резистором подключим реле. Вот так выглядит схема подключения реле к Arduino UNO . К другим версиям например Arduino NANO схема не будет иметь отличий.

Как видим, схема не многим отключается от исходного примера.

Реле может управлять различными бытовыми приборами.

Пара фоток сделанных при снятии видео по данному уроку: Подключение реле к Arduino.

Скетч можно взять из Урок 2. Нажатие кнопки без ложных срабатываний. Устраняем дребезг кнопки без изменений.

Для более красивого и читабельного кода заменим переменную ledPin на relayPin . Так же заменим вспомогательную переменную ledOn на relayOn. У нас получиться вот такой скетч управления реле.

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

Если подключить реле через кнопку с фиксацией . Вот по такой схеме.

То у нас все будет работать отлично. В качестве источника питания 5В можно использовать MICRO USB адаптер 5pin, при подключении от компьютера или адаптера. Так же можно подключить через понижающий трансформатор, например вот такой.

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

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

Понравилась статья? Поделитесь ею с друзьями:

Источник

Arduino.ru

Включение-выключение светодиода одной и той же кнопкой без фиксации.

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

Вобщем программить я толком еще не начал даже наверно :-) так, склеиваю куски примеров :-)

Вопрос такой: Ребят, помогите написать скетч по принципу:

есть 2 светодиода. изначальное состояние — LOW.

pin 2,3 пусть будут кнопки.

при нажатии pin2 загорается диод1, при повторном нажатии диод1 гаснет.

с pin3 и диодом2 картина та же. Работать они должны независимо.

Ну и плюс учесть дребезг контактов. Никак немогу определиться с алгоритмом (точнее просто немогу начать)

Кнопка без фиксации.

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

Первое что пришло в голову.

Возможно можно и уменьшить код или сделать его более красивым.
Если так то напишите. И мне интересно!

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

Взяли готовый код из соседней ветки, малость его перелопатили, взяли отдельно 2 кнопки на подтягивающих резисторах и вместо светодиодов взяли пару реле. Ну не суть :-)

int i = 0;
int k = 0;
int val = 0;
int k1 = 0;
int val1 = 0;
int state = 0;
int old_val = 0;
int state1 = 0;
int old_val1 = 0;

void setup() <
Serial.begin(9600);
pinMode(9, OUTPUT);
pinMode(13, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(6, OUTPUT);
pinMode(8, INPUT);
pinMode(7, INPUT);
>

void loop() <
//digitalWrite(13, HIGH);

val = digitalRead(7);
val1 = digitalRead(8);

old_val = val; // val is now old, let’s store it
old_val1 = val1; // val is now old, let’s store it

if (state == 1) <
digitalWrite(6, HIGH); // turn LED ON
> else <
digitalWrite(6, LOW);
>

if (state1 == 1) <
digitalWrite(6, HIGH); // turn LED ON
> else <
digitalWrite(6, LOW);
>

//здесь все выполняеться корректно

switch (k) <
case 0:
digitalWrite(10, LOW);
break;
case 1:
digitalWrite(10, HIGH);
break;
delay(50);
digitalWrite(10, LOW);
break;
default:
k=0;
break;
>

switch (k1) <
case 0:
digitalWrite(9, LOW);
break;
case 1:
digitalWrite(9, HIGH);
break;
delay(50);
digitalWrite(9, LOW);
break;
default:
k1=0;
break;
>

// все бы хорошо.. но когда выполняеться 1 раз, все шикарно. Но когда по второму кругу идет то не смотря на то что в case 0 все пины выключены. горит аналогично case 1. case 2 выполняесться уже нормально.
// Serial.print(«Knopka1= » );
// Serial.print(k);
// Serial.println(«»);

// Serial.print(«Knopka2= » );
// Serial.print(k1);
// Serial.println(«»);

//digitalWrite(13, LOW);
delay(100);

Код еще не допилен, лишнее не убрано, но схема запустилась.

Источник

Arduino.ru

Включение питания одной кнопкой

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

Всем привет!
Пытаюсь сделать включение — отключения питания Ардуино одной кнопкой без фиксации (не выключателем). Сделал вот такую схему:

Скетч:

Цель была такая: нажимаешь на кнопку, открывается транзистор (мосфет), подается питание на Ардуино. Ардуино стартует, ждет несколько секунд, если питание не пропадает, то через Пин3 открывает тот же мосфет. Кнопку можно отпускать.
В основном цикле проверяется состояние пина D2. Если кнопка нажата, то D3 переходит в другое состояние, и при отпускании кнопки питание пропадает.
Попробовал это симулировать в Протеусе, но почему-то не работает. Ардуино не открывает мосфет. Что я делаю не так? Или может есть уже готовое решение? Только без реле!

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

А где здесь MOSFET?

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

Мосфета на схеме не нашёл, а что касается биполярного транзистора, то . проведите пальцем от + батареи через транзистор. Ток у Вас собирается течь против стрелки. Это не смущает?

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

с уровнем 1 на D2 могут быть проблемы

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

Один ТМ2 не хочешь вонзить вместо вотэтоговсего?

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

Посмотри схему транзисторного тестера. Там всё нарисовано как надо.

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

За Вами не успеешь, только хотел озвучить про тестер, отключение либо кнопкой либо по времени

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

Всем спасибоСобрал по данной схеме, работает как надо:

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

Можно и код приложить

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

Всем спасибоСобрал по данной схеме, работает как надо:

а чего R1 и R3 такие огромные? току почти 8мА в тепло. А порты МК имеют внутреннюю подтяжку? иначе порт на VD2 при малейшей помехе будет ловить нажатие кнопки.

ua6em, вам реально код нужен? может и алгоритма хватит?

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

Всем спасибоСобрал по данной схеме, работает как надо:

а чего R1 и R3 такие огромные? току почти 8мА в тепло. А порты МК имеют внутреннюю подтяжку? иначе порт на VD2 при малейшей помехе будет ловить нажатие кнопки.

ua6em, вам реально код нужен? может и алгоритма хватит?

лучше код, ведь порт тянут к нулю через VD2 по видимому для прерывания, хотелось бы посмотреть как это делают профессионалы и главное для каких целей

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

лучше код, ведь порт тянут к нулю через VD2 по видимому для прерывания, хотелось бы посмотреть как это делают профессионалы и главное для каких целей

на кой там прерывание? если на порт VD2 кнопкой подать L, переводим порт R3 в H . и послесле отпускания кнопки VT1, VT2 закрываются. А если МК «спал» после подачи питания, в сетапе на порт R3 подаем LOW, и небольшую задержку на определение повторного нажатия. И тратить прерывание на такое?! Весь код сводится к ловле состояния кнопки при работе и если необходимо, отключению по таймеру, который можно запустить в сетапе и обнулять по условиям в процессе юзанья девайса.

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

лучше код, ведь порт тянут к нулю через VD2 по видимому для прерывания, хотелось бы посмотреть как это делают профессионалы и главное для каких целей

на кой там прерывание? если на порт VD2 кнопкой подать L, переводим порт R3 в H . и послесле отпускания кнопки VT1, VT2 закрываются. А если МК «спал» после подачи питания, в сетапе на порт R3 подаем LOW, и небольшую задержку на определение повторного нажатия. И тратить прерывание на такое?! Весь код сводится к ловле состояния кнопки при работе и если необходимо, отключению по таймеру, который можно запустить в сетапе и обнулять по условиям в процессе юзанья девайса.

Заблуждаетесь, нажатие кнопки замыкает на массу две цепи, по первой открывается транзистор VT1 смещением на базе порядка 0,2 вольта (выбор ключевого элемента должен обуславливаться этим), подача на R3 HIGH сигнала открывает транзистор VT2 удерживая VT1 в открытом состоянии. а вот отключение. значит цепь VD2 подтянута вверх и далее к примеру можно использовать флаг нажатия кнопки, то-есть если имеем повторное нажатие снять сигнал на R3 переведя его в LOW (при отпущенной кнопке, сигнал на VD2 в HIGH)
Мне мыслится как то так )))

Источник

Работа с кнопками

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

  • С фиксацией – кнопка остаётся нажатой после отпускания, без фиксации – отключается обратно.
  • Нормально разомкнутая (Normal Open, NO) – при нажатии замыкает контакты. Нормально замкнутая (Normal Closed, NC) – при нажатии размыкает контакты.
  • Тактовые кнопки – замыкают или размыкают контакт. У обычных тактовых кнопок ноги соединены вдоль через корпус (см. картинку ниже). Переключатели – обычно имеют три контакта, общий COM, нормально открытый NO и нормально закрытый NC. При отпущенной кнопке замкнута цепь COM-NC, при нажатой замыкается COM-NO.

Подключение и подтяжка

Из урока про цифровые пины вы помните, что микроконтроллер может считывать напряжение со своей ноги. Соответственно кнопка может подать на пин тот уровень, к которому подключена её вторая нога. В том же уроке мы обсуждали, что не подключенный никуда цифровой пин принимает наводки из воздуха, и считанное с него значение будет практически случайным. То есть подключив к пину 5V (сигнал высокого уровня) через кнопку, мы ничего не добьёмся: при нажатой кнопке на пине будет считываться четкий сигнал высокого уровня, а при отпущенной – случайное значение. Для решения этой проблемы существует такое понятие, как подтяжка (pull) пина. Подтяжка выполняется к земле (pull down) или питанию (pull up) микроконтроллера при помощи резистора. Подтяжка выполняется противоположно принимаемому сигналу, т.е. если нужно ловить высокий сигнал, подтяжка выполняется к земле, если ловить нужно сигнал земли – подтяжка выполняется к питанию. Вот два варианта подключения кнопки, с подтяжкой к VCC и GND соответственно: Как выбирается сопротивление резистора? Тут всё очень просто: при нажатии на кнопку через резистор потечёт ток, так как в любом случае замыкается цепь питание-земля. Чем выше ток, больше потери энергии и нагрев резистора, а это никому не нужно, поэтому сопротивление резистора подтяжки обычно выбирается в диапазоне 5-50 кОм. Если ставить больше – подтяжка может не обеспечить стабильный уровень сигнала на пине, а если ставить меньше – будут больше потери энергии в нагрев резистора: при сопротивлении в 1 ком через него потечёт ток величиной 5 В/1000 Ом = 5 мА, для сравнения плата Ардуино с МК в активном режиме потребляет 20-22 мА. Чаще всего для подтяжки используется резистор на 10 кОм. Как вы помните из урока о цифровых пинах, у МК AVR есть встроенные резисторы для всех GPIO, эти резисторы подключены к питанию (к VCC), то есть буквально дублируют первую схему из этого урока и позволяют не использовать внешний резистор. У микроконтроллеров другой архитектуры бывает подтяжка к GND, или вообще может не быть внутренней подтяжки. При использовании подтяжки к питанию мы получим инвертированный сигнал – функция digitalRead() вернёт 1 при отпущенной кнопке, и 0 при нажатой (при использовании нормально-разомкнутой кнопки). Давайте подключим кнопку на пин D3 (и GND):

Алгоритмы

Отработка нажатия

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

Дребезг контактов

Кнопка не идеальна, и контакт замыкается не сразу, какое-то время он “дребезжит”. Прогоняя данный алгоритм, система опрашивает кнопку и условия приблизительно за 6 мкс, то есть кнопка опрашивается 166’666 раз в секунду! Этого достаточно, чтобы получить несколько тысяч ложных срабатываний. Избавиться от дребезга контактов можно как аппаратно, так и программно: аппаратно задача решается при помощи RC цепи, то есть резистора (

1-10k) и конденсатора (

100nF). Выглядит это следующим образом:

Программно можно ввести простейший таймер нажатия, основанный на millis() , время гашения дребезга примем 100 миллисекунд. Вот так будет выглядеть код:

Рекомендуется конечно же использовать аппаратный способ, так как он не нагружает ядро лишними расчетами. В 99.99% проектов будет достаточно программного антидребезга, так то смело используйте конструкцию с millis() .

“Импульсное” удержание

В устройствах с управлением кнопкой очень часто бывает нужна возможность изменения значения как однократно кликом по кнопке, так и “автоматически” с тем же шагом – при удержании. Такой вариант реализуется очень просто, добавлением ещё одного условия в наш предыдущий алгоритм, а именно: если кнопка была нажата, но ещё не отпущена, и прошло времени больше, чем задано – условие вернёт true . В примере ниже периодичность “нажатий” при удержании настроена на 500 миллисекунд (2 раза в секунду):

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

Простейший класс кнопки

Вот так предыдущий пример можно сделать классом (мы делали это вот в этом уроке), положить его в отдельный файл (button.h) и пользоваться:

Другие возможности кнопки

Кнопка только с виду кажется простым устройством, дающим 0 и 1, но, подключив фантазию и время, можно придумать гораздо больше применений обычной кнопке. В моей библиотеке GyverButton реализовано очень много всяких интересных возможностей по работе с кнопкой, вот список:

  • Работа с нормально замкнутыми и нормально разомкнутыми кнопками
  • Работа с подключением PULL_UP и PULL_DOWN Опрос кнопки с программным антидребезгом контактов (настраиваемое время)
  • Отработка нажатия, удерживания, отпускания, клика по кнопке (+ настройка таймаутов)
  • Отработка одиночного, двойного и тройного нажатия (вынесено отдельно)
  • Отработка любого количества нажатий кнопки (функция возвращает количество нажатий)
  • Функция изменения значения переменной с заданным шагом и заданным интервалом по времени
  • Возможность работы с “виртуальными” кнопками (все возможности библиотеки используются для матричных и резистивных клавиатур)

Подробное описание библиотеки можно почитать в заголовочном файле на странице библиотеки, также там есть много примеров.

Аналоговые клавиатуры

Аналоговые клавиатуры – достаточно глубокая тема, достойная отдельного урока (у меня его пока что нет). Максимально подробный урок-исследование можно посмотреть на сайте Codius.

Видео


Источник

Adblock
detector