«ан€тие є3 ѕереключатель (Swith). ѕроект Arduino в лицее є17 г. —еверодвинска


»сточник: parshev.wordpress.com



ѕопробуем сделать кнопку-переключатель

„то хотим

—хему оставл€ем с прошлого зан€ти€. Ќо при нажатии на кнопку диод загораетс€, при повторном нажатии Ч гаснет.

Ётапы работы

  • ѕробуем
  • –азочаровываемс€
  • –азбираемс€
  • —овершенствуем
  • ƒодумываем

ѕробуем

¬ операторе digitalWrite мы можем вместо слов LOW/HIGH написать переменную, присвоив ей нужное значение. Ќапример так:

int ledStatus = HIGH;

digitalWrite(13,ledStatus);

≈ще мы можем помен€ть значение переменной ledStatus на противоположное:

ledStatus = !ledStatus;

Ќаш первый проект Blink с применением полученных знаний можно написать так:

int ledStatus = LOW;
void setup () {
pinMode(13,OUTPUT);
}
void loop () {
digitalWrite(13,ledStatus);
ledStatus = !ledStatus;
delay(1000);
}

“еперь вспомним о кнопке Ч когда мы еЄ нажимаем, будем мен€ть значение переменной ledState на противоположное:

Pin2 = digitalRead(2);
if (Pin2==HIGH) {
ledStatus=!ledStatus;
}
digitalWrite (13,ledStatus);

ѕолна€ программа выгл€дит так:

int ledStatus = LOW;
int Pin2 = LOW;
void setup () {
pinMode(13,OUTPUT);
pinMode(2,INPUT);
}
void loop () {
Pin2 = digitalRead(2);
if (Pin2==HIGH) {
ledStatus=!ledStatus;
}
digitalWrite (13,ledStatus);
}

 стати, в Arduino IDE (это где ¬ы набираете программы) можно врем€ от времени нажимать Ctrl+T Ч это придаст программе Ђправильныйї вид, сместив вложенные операторы вправо. “ак делают опытные программисты, только они это делают сами, нажима€ клавишу TAB, если им необходимо сместить начало строки вправо.

—обираем, пробуемЕ

—транно работает.  ак-то нечетко. ќбратите внимание на потерю €ркости диода во врем€ нажати€ на кнопку. ¬ чем же дело?

ƒавайте разбиратьс€.

–азбираемс€

ѕопробуйте замедлить многократно свои действи€, не забыва€, что процессор Arduino или ChipKit работает с огромной скорость. „то же происходит с точки зрени€ контроллера?

¬от вы прикоснулись к кнопке, медленно-медленно нажали на неЄ Ч контакт замкнулс€, в Pin2 попала логическа€ 1 (HIGH) и программа с радостью отработала if и переключила состо€ние ledState на противоположное, зажгла диод,и ринулась на следующий виток цикла loop. ј палец-то ¬аш всЄ еще жмет на кнопку. ¬ Pin2 оп€ть попадает единица, ledState оп€ть помен€лс€ (уже на LOW), доиод потух и программа ринулась на следующий витокЕ » так много-много раз в течение даже короткого с ¬ашей точки зрени€ нажати€. ƒиод очень быстро мигает и кажетс€, что он просто светитс€ не на полную €ркость. ¬ дальнейшем мы это его свойство используем (правильнее говорить об особенности зрительного воспри€ти€ нашего мозга Ч диод практически не обладает инерционностью и действительно полностью гаснет и полностью зажигаетс€. Ќо очень быстро).
„то же будет в переменной ledState при отпускании кнопки?  ак повезЄт Ч может 1 (HIGH), а может 0 (LOW). 50 на 50, как говоритс€.

¬от так работает написанна€ нами программа.

¬ывод Ч состо€ние диода надо мен€ть ни при нажатии на кнопку (как мы вы€снили Ч это очень длительный процесс), а при изменении статуса кнопки Ч в тот момент, когда мгновение назад кнопка еще была не нажата, а вот уже сейчас Ч нажата.

—овершенствуем

ƒл€ реализации идеи создадим пару переменных Ч oldButton и currentButton (старое и текущее состо€ние кнопки).

Ѕудем считывать состо€ние кнопки в переменную currentButton, а значение переменной ledState мен€ть в том случае, если текущее состо€ние кнопки (currentBottom) Ч 1, а предыдущее состо€ние кнопки (oldButton) Ч 0. ѕомен€лось значение переменной ledState или нет, но информаци€ о состо€нии кнопки после ветвлени€ устаревает и в переменную oldButton пишем текущее состо€ние: oldBotton = currentBotton.

¬сЄ. ѕолучилось:

int ledStatus = LOW;
int oldButton = LOW, currentButton = LOW;
void setup () {
pinMode(13,OUTPUT);
pinMode(2,INPUT);
}
void loop () {
currentButton = digitalRead(2);
if (currentButton==HIGH && oldButton == LOW) {
ledStatus=!ledStatus;
}
oldButton=currentButton;
digitalWrite (13,ledStatus);
}

ƒодумываем

–аботает почти чисто. ѕочему почти? Ч понажимайте кнопку Ч изредка проход€т сбои.
ƒело в так называемом Ђдребезге контактовї Ч в момент нажати€ кнопка с большой частотой мен€ет своЄ состо€ние и программа успевает включенную кнопку выключить и обратно включить. Ћечитс€ это очень просто Ч пусть после нажати€ на кнопку программа немножко отдохнет, даст стабилизироватьс€ кнопке: добавим delay(50) после выполнени€ оператора digitalRead(2);

Ќова€ проблема Ч программа работает с delayТем внутри! “ормозим, однако. ѕусть задержка будет только при нажатой кнопке. ≈сли currenButtom равно HIGH.

int ledStatus = LOW;
int oldButton = LOW, currentButton = LOW;
void setup () {
pinMode(13,OUTPUT);
pinMode(2,INPUT);
}
void loop () {
currentButton = digitalRead(2);
if (currentButton==HIGH) {delay(50);}
if (currentButton==HIGH && oldButton == LOW) {
ledStatus=!ledStatus;
}
oldButton=currentButton;
digitalWrite (13,ledStatus);
}

“еперь всЄ.

 ќЌ≈÷ «јЌя“»я.

”спехов!


Ќа нашем сайте доступна подборка инструкций и учебных пособий по ардуино. ќзнакомитьс€ и скачать можно в этом разделе: —качать инструкции - книги по ардуино.

 лючевые слова:
диод
резистор
курс микроэлектроники
arduino
микросхема
скетч
плата јрдуино ”но
ћикроконтроллер
ѕлатформа Arduino
currentButton
oldButton
программа
pinMode
кнопка
digitalWrite
јрдуино
digitalRead
OUTPUT
работает
написать программу
INPUT
–оботы на платформе јрдуино
робот
робототехника


¬ернутьс€ в рубрику:

ѕроекты на платформе јрдуино

¬озможно ¬ас заинтересует:

ѕроект Arduino в лицее є17 г. —еверодвинска
ѕроект Arduino в лицее є17 г. —еверодвинска



≈сли вы хотите видеть на нашем сайте больше статей то кликните ѕоделитьс€ в социальных сет€х! —пасибо!
—мотрите также:

ќбратите внимание полезна€ информаци€.