Arduino кнопка с самовозратом + реле

saykl
Offline
Зарегистрирован: 30.07.2017

Есть кнопка с самовозратом.  Стоит вместо обычного выключателя. По сути это обычный выключатель. Только после нажатия возвращается в исходное состояние(выкл). Есть реле, которое управляет нагрузкой. Кнопка подключена к 7 пину. Есть код, при котором свет включен только пока держишь кнопку. А нужно, чтобы нажали кнопку свет включался. Ещё раз нажал выключилось. Примеров много. Но они то не работают. То свет включается и выключается(дискотека).

 


void setup() {
pinMode(bathroom, OUTPUT);
}

void loop()

{
if(digitalRead(14)==HIGH)//если кнопка нажата
{
digitalWrite(bathroom, LOW); //на пине 7 Ардуино будео логический нуль и реле замкнёт нормально разомкнутые контакты.
delay(300);
}
else//если кнопка не нажата
{
digitalWrite(bathroom, HIGH); //на пине 7 Ардуино будет логическая единица и реле разомкнёт нормально разомкнутые контакты.
delay(300);
}

Допустим этот код, при котором у меня свет включается и выключается через 2 секунды:

int LedPin = 7;             // Подключаем светодиод к порту 13
int ButPin = 14;             // Подключаем кнопку к выходу 10
int flag = 0;                // флаг состояния

void setup()
{
  pinMode(LedPin, OUTPUT);   // Инициализируем порт "ledPin" как выходной
}  

void loop()
{
  if(digitalRead(ButPin) == HIGH && flag == 0)      
    {                                              
      digitalWrite(LedPin, !digitalRead(LedPin));
      flag = 1;
    }
 
  if(digitalRead(ButPin) == LOW && flag == 1)
    {
      flag = 0;
    }  
}

Больше ничего не подключено. Пытаюсь разобраться и потом повесить ethernet шилд и кнопок побольше. Резистора нет. Выключатель schneider electric. Я думаю, что если первый код работает(когда держишь кнопку) и само не включается(когда отпущено) значит он не нужен и возможно в выключателе уже всё предусмотрено.

Помогите найти рабочий код. Пробовал пример из библиотеки IDE. Не получается.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Нет фильтрации дребезга, смотреть тему про титановый велосипед, тут на форуме - там есть класс для кнопки.

Novice User
Offline
Зарегистрирован: 25.09.2017

так можно?

int LedPin = 7;             // Подключаем светодиод к порту 13 и через резистор к минусу
int ButPin = 10;             // Подключаем кнопку к выходу 10 и к минусу
int flag = 0;                // флаг состояния

void setup()
{
  pinMode(LedPin, OUTPUT);   // Инициализируем порт "ledPin" как выходной
  pinMode(ButPin, INPUT);//вход
  digitalWrite(ButPin, HIGH);//вкл подтяжку
}  

void loop()
{
  if(digitalRead(ButPin) == LOW)  //если нажали кнопку     
    {if( flag == 0) {digitalWrite(LedPin, !digitalRead(LedPin)); flag = 1;};}//и флаг не установлен-переключаем реле и ставим флаг
    else
   {flag = 0;} //если кнопка отпущена сбрасываем флаг  
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ещё раз: нет фильтрации дребезга. Вы понимаете, что такое дребезг? Это когда в момент нажатия кнопки контакты любят друг друга возвратно-поступательными движениями до тех пор, пока не устаканится эфир и не придёт нирвана. А до этого момента вы можете сто раз прочитать HIGH, и сто раз - LOW, поэтому и происходит, как вы описали, " То свет включается и выключается(дискотека)".

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017
saykl
Offline
Зарегистрирован: 30.07.2017

Спасибо. Второе сообщение не я кстати писал. Вчера попробовал с классом, реле совсем не реагировало.  По запарке возможно  я пины не верно прописал(все выходные этим занимался + электрика). Сегодня попробую ещё. Я думаю все таки надо купить подстрочных резисторов в обычном магазине. У кнопки нет минуса. То есть я подключу перед размыкаемым контактом кнопки резистор и воткну его в землю ардуино. Верно?  Ещё вопрос: Гуглю эти резистора. Они с тремя ногами. В видео на YouTube обычно два контакта у резистора. В чем разница? 

kasper007
Offline
Зарегистрирован: 23.05.2016

saykl пишет:

Я думаю все таки надо купить подстрочных резисторов в обычном магазине. У кнопки нет минуса. То есть я подключу перед размыкаемым контактом кнопки резистор и воткну его в землю ардуино. Верно?  Ещё вопрос: Гуглю эти резистора. Они с тремя ногами. В видео на YouTube обычно два контакта у резистора. В чем разница? 

А можно поподробней описать как кнопка у вас сейчас подключена? Что имеется ввиду, когда вы говорите, что у кнопки нет минуса. Она одним концом подключена к Арудинке, а второй конец в воздухе висит?

Не нужен вам тут никакой резистор и тем более подстроечный. Подтяните к плюсу вход к которому цепляете кнопку.

На последний вопрос отвечать не буду, я просто плачу.

saykl
Offline
Зарегистрирован: 30.07.2017

Представьте стандартный выключатель света. К нему никогда не подводят минус. Потому что он только замыкает и размыкает цепь. Минус от лампочки подключён к общей сети. Один конец выключателя (кнопки) идёт на 14 пин ардуино. Второй контакт подключён к 5v arduino. Реле к 7 пин, к 5v arduino, и к земле. И дальше реле замыкает и размыкает 220

У меня похоже все симптомы дребезга. Похоже он сильный. Из за отсутствия резистора. Возможно из за этого с классом не работало ( проверю ещё раз).

я так понимаю один конец кнопки, который идёт к 14 пин нужно заземлить через резистор. Верно?

bizzon
Offline
Зарегистрирован: 29.03.2016

Через резистор на землю. Параллельно кнопке или резистору конденсатор 0, 1 мкф для подавления дребезга, если лень бороться программно. А вообще- учить матчасть срочно!

Novice User
Offline
Зарегистрирован: 25.09.2017

Скорее всего это не дребезг,это 50 гц от сети(я так понял вы хотите штатную цепь 220 в переделать?)

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

где у вас будет стоять ардуина-около выключателя или около лампы?

 

saykl
Offline
Зарегистрирован: 30.07.2017

У меня от включателя в щиток ( специально поставил) идут провода. Там роутер, arduino, raspberry. И рядом 220. Я проводку от выключателя до щитка переделываю из 220 в 5(питание от arduino). Дак ведь теперь от штатной сети все что 220 включено в реле. Эти 50 гц попадают в arduino через реле или как?

Novice User
Offline
Зарегистрирован: 25.09.2017

я вас неправильно понял,думал через выключатель идет 220 в

увы-помочь не могу,абсолютно не понятно как все подключено...

и не понятно какой вы конкретно скетч используете

saykl
Offline
Зарегистрирован: 30.07.2017

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

Поправьте, пожалуйста код:


/*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
titanium bicycle for button. (version 10.0)
file Button.h - shell for to class Click, buttons.
https://klapautsiy.github.io/titanium-bicycle-for-button/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/

#include <Button.h>

Button test;

void setup() {
test.button( 14); // arduino pins connected to button
// test.button();
test.duration_bounce          (5);
test.duration_click_Db      (250);
test.duration_inactivity_Up(5000);
test.duration_inactivity_Dn(1000);
// test.duration_timer_Up      (500);
test.duration_timer_Dn      (500);
pinMode(7,OUTPUT);

}

void loop() {

test.read();

if (test.button[0].event_click_Dn     () == 1) {digitalWrite(7, !digitalRead(7));} //Если кнопка нажата инвертируем значение.

}
Сделал фото как всё подключено
7 пин это int1 к реле(синий)

жёлтый - GND к арудино и к реле

Сделал фото как всё подключено и видео снял, чтобы было понятно https://www.youtube.com/watch?v=TFKl71JU8Wo

7 пин это int1 к реле(синий)

Чёрный к vcc и из него пока сделал скрутку с зелённым (vss на реле) и один провод от кнопки

Белый 14 (А0) ко второму пину кнопки.

Пока резисторы не купил, пытаюсь сделать программно.

 

 

 

 

 

bizzon
Offline
Зарегистрирован: 29.03.2016

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

Это у тебя не дребезг. Это антенна.

saykl
Offline
Зарегистрирован: 30.07.2017

На сколько ватт резистор нужен ?

bizzon
Offline
Зарегистрирован: 29.03.2016

Любой мощности 1-100 Ком сопротивлением. Говорят же- можно включить внутренний подтягивающий.

kasper007
Offline
Зарегистрирован: 23.05.2016

Итак, все таки, кнопка у нас не силовая, а логическая (т.е. самой кнопкой мы не коммутируем 220В, а лишь изменяем логическое состояние на входе Ардуинки, которая в свою очередь управляет РЕЛЕ). Где-то в начале я именно это хотел уточнть у автора, но он начал писать что-то за лампочку, включенную в сеть.

Пожалуйста изучите вот эту страничку

https://www.arduino.cc/en/Tutorial/InputPullupSerial

а потом оставьте свою кнопку подключенной одним концом к ардуине, а второй конец УБЕРИТЕ с +5В и повесьте на землю.

а в скетче притяните вход (к которому подключена кнопка) внутренним подтягивающим резистором к питанию, как это указано в той ссылке, что я скинул.

Если после этого у вас все равно будет "дребезг" поборите его способом указаным в посте #4

saykl
Offline
Зарегистрирован: 30.07.2017

Всем спасибо! Последнее сообщение от kasper007 помогло. Использовал сразу библиотеку титановый велосипед. Рабочий код в моём предыдущем посте. Мне надо было кнопку с +5В переключить на землю.

bizzon
Offline
Зарегистрирован: 29.03.2016

Аллилуйя!

saykl
Offline
Зарегистрирован: 30.07.2017

Ещё возник вопрос по мере эксплуатации. Вотнул я три кнопки. Каждый на отдельный пин, а землю этих трёх кнопок скрутил и вставил в ардуино(GND). У меня вторая земля занята реле. И получается, что сначала всё работает. Потом через какое-то время одна из кнопок отваливается. И не работает.  То есть две работает, а одна нет. После того, как повытыкаю провода/ перезагружу arduino uno опять работает какое-то время и отваливается(при чём любая - не одна и та же).

/*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
titanium bicycle for button. (version 10.0)
file Button.h - shell for to class Click, buttons.
<a href="https://klapautsiy.github.io/titanium-bicycle-for-button/" rel="nofollow">https://klapautsiy.github.io/titanium-bicycle-for-button/</a>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/

#include <Button.h>

Button Bbathroom;//ванна
Button Bhallway; //прихожая
Button Bpantry; //тёмная

void setup() {

//___________Ванна___________________  
Bbathroom.button( 14); // arduino pins connected to button
// test.button();
Bbathroom.duration_bounce          (5);
Bbathroom.duration_click_Db      (250);
Bbathroom.duration_inactivity_Up(5000);
Bbathroom.duration_inactivity_Dn(1000);
// test.duration_timer_Up      (500);
Bbathroom.duration_timer_Dn      (500);
pinMode(7,OUTPUT);
//__________Прихожая_________________
Bhallway.button(A1); // arduino pins connected to button
// test.button();
Bhallway.duration_bounce          (5);
Bhallway.duration_click_Db      (250);
Bhallway.duration_inactivity_Up(5000);
Bhallway.duration_inactivity_Dn(1000);
// test.duration_timer_Up      (500);
Bhallway.duration_timer_Dn      (500);
pinMode(6,OUTPUT);
//_________Тёмная__________________
Bpantry.button(A2); // arduino pins connected to button
// test.button();
Bpantry.duration_bounce          (5);
Bpantry.duration_click_Db      (250);
Bpantry.duration_inactivity_Up(5000);
Bpantry.duration_inactivity_Dn(1000);
// test.duration_timer_Up      (500);
Bpantry.duration_timer_Dn      (500);
pinMode(5,OUTPUT);
}

void loop() {

Bbathroom.read();
Bhallway.read();
Bpantry.read();

if (Bbathroom.button[0].event_click_Dn     () == 1) {digitalWrite(7, !digitalRead(7));} //Если кнопка нажата инвертируем значение (ванна)
if (Bhallway.button[0].event_click_Dn     () == 1) {digitalWrite(6, !digitalRead(6));} //Если кнопка нажата инвертируем значение (прихожая 
if (Bpantry.button[0].event_click_Dn     () == 1) {digitalWrite(5, !digitalRead(5));} //Если кнопка нажата инвертируем значение (тёмная)



}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

saykl пишет:

Ещё возник вопрос по мере эксплуатации. Вотнул я три кнопки. Каждый на отдельный пин, а землю этих трёх кнопок скрутил и вставил в ардуино(GND). У меня вторая земля занята реле. И получается, что сначала всё работает. Потом через какое-то время одна из кнопок отваливается. И не работает.  То есть две работает, а одна нет. После того, как повытыкаю провода/ перезагружу arduino uno опять работает какое-то время и отваливается(при чём любая - не одна и та же).

Соплей! Нужно больше соплей на макетке - тогда и не такие чудеса будут ;) Контакты херовые у вас - пропаяйте всё, и не парьте людям моск.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

 

13 Button Bpantry; // пытошная

О_О

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017
/*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
titanium bicycle for button. (version 10.0)
file Button.h - shell for to class Click, buttons.
https://klapautsiy.github.io/titanium-bicycle-for-button/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/

#include <Button.h>

Button apartment; // квартира

void setup() {
apartment.button(14,A1,A2); // button Ванна, Прихожая, Тёмная
// test.button();
apartment.duration_bounce          (5);
apartment.duration_click_Db      (250);
apartment.duration_inactivity_Up(5000);
apartment.duration_inactivity_Dn(1000);
// test.duration_timer_Up      (500);
apartment.duration_timer_Dn      (500);

pinMode(7,OUTPUT); // _________Ванна______________
pinMode(6,OUTPUT); // _________Прихожая___________
pinMode(5,OUTPUT); // _________Тёмная_____________

}

void loop() {

apartment.read();

if (apartment.button[0].event_click_Dn() == 1) {digitalWrite(7, !digitalRead(7));} //Если кнопка нажата инвертируем значение (ванна)
if (apartment.button[1].event_click_Dn() == 1) {digitalWrite(6, !digitalRead(6));} //Если кнопка нажата инвертируем значение (прихожая 
if (apartment.button[2].event_click_Dn() == 1) {digitalWrite(5, !digitalRead(5));} //Если кнопка нажата инвертируем значение (тёмная)

}