Рокерный переключатель

zzzzza
Offline
Зарегистрирован: 18.11.2016

Всем привет.

У меня есть такой рокерный переключатель:

Центральный контакт подключен к GND. Левый контакт(то есть "|") подключен к D11 и правый контакт(то есть "||") подключен к D12.

Написал такой код, чтобы протестировать:

if ((digitalRead(11)==HIGH) && (digitalRead(12)==LOW)) //Включено положение |
    {
     digitalWrite(13, HIGH);  
    }
     else
   if ((digitalRead(12)==HIGH) && (digitalRead(11)==LOW)) //Включено положение ||
    {
     digitalWrite(13, HIGH);  
    }
     else
   if ((digitalRead(12)==HIGH) && (digitalRead(11)==HIGH)) //Включено среднее положение.
    {
     digitalWrite(13, LOW);
    }

И сразу возникла проблема: в среднем положение почему-то не выключается светодиод.

Из-за чего это может происходить? 

Причем иногда в среднем положение светодиод все-таки гаснит. (тоже не понимаю почему так)

Если же использовать такой код:

if ((digitalRead(11)==HIGH) && (digitalRead(12)==LOW)) //Включена |
    {
     digitalWrite(13, LOW);  
    }
     else
   if ((digitalRead(12)==HIGH) && (digitalRead(11)==LOW)) //Включена ||
    {
     digitalWrite(13, LOW);  
    }
     else
   if ((digitalRead(12)==HIGH) && (digitalRead(11)==HIGH)) //Включено среднее положение.
    {
     digitalWrite(13, HIGH);
    }

то все работает хорошо.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Почему-то мне кажется, что в строке 11 Вам надо сравнивать не с HIGH, а с LOW. Хотя, может я и ошибаюсь, т.к. схему Вы не привели. Но попробуйте.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Вот низкий уровень (LOW) у Вас подаётся через кнопку, которая подключена к GND. А как подаётся высокий уровень (HIGH), когда кнопка выключена (в среднем положении) ?

То есть, чтобы сработало условие по digitalRead(хх)==HIGH, на пине действительно должен быть выский уровень (+5В).

zzzzza
Offline
Зарегистрирован: 18.11.2016

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

Почему-то мне кажется, что в строке 11 Вам надо сравнивать не с HIGH, а с LOW. Хотя, может я и ошибаюсь, т.к. схему Вы не привели. Но попробуйте.

Все так же - ничего не изменилось.

zzzzza
Offline
Зарегистрирован: 18.11.2016

Jeka_M пишет:

Вот низкий уровень (LOW) у Вас подаётся через кнопку, которая подключена к GND. А как подаётся высокий уровень (HIGH), когда кнопка выключена (в среднем положении) ?

Не очень понял, так как плохо разбираюсь по части физики.

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

zzzzza
Offline
Зарегистрирован: 18.11.2016

Jeka_M пишет:

Вот низкий уровень (LOW) у Вас подаётся через кнопку, которая подключена к GND. А как подаётся высокий уровень (HIGH), когда кнопка выключена (в среднем положении) ?

То есть, чтобы сработало условие по digitalRead(хх)==HIGH, на пине действительно должен быть выский уровень (+5В).

Так на пины же подается всегда +5v

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

zzzzza пишет:

Так на пины же подается всегда +5v

Откуда подаётся?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

zzzzza пишет:

Не очень понял, так как плохо разбираюсь по части физики.

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

ОК. Чтобы на пине считался низкий уровень (LOW), туда нужно подать GND (оно же "земля" или "минус" питания). Чтобы на пине считался высокий уровень (HIGH), туда нужно подать напряжение питания (+5В для пятивольтовой ардуины).

По-умолчанию пины сконфигурированы на вход. Там нет ни LOW (GND), ни HIGH (5В).  Они в высокоомном состоянии. LOW (GND) вы подаёте через кнопку. Но когда её выключаете - на пинах само по себе не появится HIGH (+5В).

zzzzza
Offline
Зарегистрирован: 18.11.2016

Jeka_M пишет:

zzzzza пишет:

Так на пины же подается всегда +5v

Откуда подаётся?

Сама arduin'а же подает на каждый пин по +5v. Или я ошибаюсь?

zzzzza
Offline
Зарегистрирован: 18.11.2016

Jeka_M пишет:

zzzzza пишет:

Не очень понял, так как плохо разбираюсь по части физики.

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

ОК. Чтобы на пине считался низкий уровень (LOW), туда нужно подать GND (оно же "земля" или "минус" питания). Чтобы на пине считался высокий уровень (HIGH), туда нужно подать напряжение питания (+5В для пятивольтовой ардуины).

По-умолчанию пины сконфигурированы на вход. Там нет ни LOW (GND), ни HIGH (5В).  Они в высокоомном состоянии. LOW (GND) вы подаёте через кнопку. Но когда её выключаете - на пинах само по себе не появится HIGH (+5В).

А как туда GND подать?

zzzzza
Offline
Зарегистрирован: 18.11.2016

Jeka_M пишет:

zzzzza пишет:

Не очень понял, так как плохо разбираюсь по части физики.

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

ОК. Чтобы на пине считался низкий уровень (LOW), туда нужно подать GND (оно же "земля" или "минус" питания). Чтобы на пине считался высокий уровень (HIGH), туда нужно подать напряжение питания (+5В для пятивольтовой ардуины).

По-умолчанию пины сконфигурированы на вход. Там нет ни LOW (GND), ни HIGH (5В).  Они в высокоомном состоянии. LOW (GND) вы подаёте через кнопку. Но когда её выключаете - на пинах само по себе не появится HIGH (+5В).

Аааа, вот сейчас, я кажется, понял. Сейчас попробую и отпишусь.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

zzzzza пишет:

Сама arduin'а же подает на каждый пин по +5v. Или я ошибаюсь?

Сама ардуина ничего не подаёт. По умолчанию пины находятся в режиме входа и имеют высокоомное состояние (Hi-Z).  Это значит, что там нет ни "плюса", ни "минуса". Этот пин "висит в воздухе" и ловит всяческие помехи, беспорядчно принимая различные значения. 

Не буду Вас больше мучать - на пин надо принудительно подать высокий уровень через "подтягивающий резистор". Либо внешний резистор (номиналом примерно 4,7кОм - 10кОм). Либо внутренний резистор, который встроен в сам микрконтроллер. Для этого нужно правильно сконфигурировать пин - pinMode(xx, INPUT_PULLUP);

То есть, напряжение питания на пине будет всегда. И подаётся оно через резистор, чтобы не было короткого замыкания, когда подадим туда GND.

zzzzza
Offline
Зарегистрирован: 18.11.2016

Jeka_M пишет:

zzzzza пишет:

Сама arduin'а же подает на каждый пин по +5v. Или я ошибаюсь?

Сама ардуина ничего не подаёт. По умолчанию пины находятся в режиме входа и имеют высокоомное состояние (Hi-Z).  Это значит, что там нет ни "плюса", ни "минуса". Этот пин "висит в воздухе" и ловит всяческие помехи, беспорядчно принимая различные значения. 

Не буду Вас больше мучать - на пин надо принудительно подать высокий уровень через "подтягивающий резистор". Либо внешний резистор (номиналом примерно 4,7кОм - 10кОм). Либо внутренний резистор, который встроен в сам микрконтроллер. Для этого нужно правильно сконфигурировать пин - pinMode(xx, INPUT_PULLUP);

То есть, напряжение питания на пине будет всегда. А резистор нужен, чтобы не было короткого замыкания, когда подадим тудя GND.

Огромное Вам спасибо! Все заработало.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Отлично :-)

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Думал спросить про подтяжку, но как то язык (пальцы) не повернулись. Раз уж эта тема всплыла вновь аопрос к Jeka_M чем pinMode(xx,INPUT_PULLUP) отличается от digitalWrite(xx, HIGH);pinMode(xx,INPUT). Прошу прощения что без кодовых вставок, с телефона пишу...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, ТС, ну Вы нарисуете схему подключения или так и будете мозг всем выносить?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Mr.Privet Ничем, просто меньше набирать на одну строчку.

На самом деле в AVR как-раз так и включается подтяжка: 1) режим входа, 2) подаем высокий уровень. А INPUT_PULLUP это уже разрабы Arduino IDE придумали, чтобы новичкам легче было.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Ясно, напоминает одну тему тут как кто то писал библеотеку для портов...

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

Mr.Privet пишет:
Ясно, напоминает одну тему тут как кто то писал библеотеку для портов...

специально для себя выписал, возможно, и тебе поможет постичь дзен

#define LOW  0x0
#define HIGH 0x1

#define INPUT 0x0
#define OUTPUT 0x1
#define INPUT_PULLUP 0x2 // ¯\_(ツ)_/¯

 

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

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

Блин, ТС, ну Вы нарисуете схему подключения или так и будете мозг всем выносить?

я запретил.