Задача 1. Определение момента клика тактовой кнопки




Урок 5-6.

Эту фразу можно расширить «если ты будешь вести себя хорошо, то вечером мы пойдем в зоопарк, иначе весь вечер будешь сидеть дома» Попробуйте прочитать фразу, написанную на языке Arduino If(хорошееПоведение) { походВЗоопарк; } else { сидениеДома; }
Тема: Ветвление программы. Циклы. Клики кнопок.

Для любознательных https://wiki.amperka.ru/

Программирование

Условная конструкция:

           
 
В жизни мы часто используем условную конструкцию «если… то…» Попробуйте прочитать фразу, написанную на языке Arduino If(хорошееПоведение) { походВЗоопарк; }  
   
 
   
 

 


В общем виде If конструкция выглядит так:

А если необходимо выбрать один

вариант из трех, четырех предложенных?

В таком случае используется

конструкция switch

Пояснения.

После слова ставится переменная, значение которой мы оцениваем. Далее после слова сase мы перебираем значения, которые она может принимать, и для каждого значения описываем команды, которые должны исполняться в случае, если значение переменной равно указанному значению. Каждый сase должен заканчиваться командой вreak. Если забыть это сделать, то в этом случае продолжится исполнение кода, следующего после очередного сase, что в большинстве случаев не предполагается и приводит к неожиданным результатам.

Метка default обозначает все случаи, которые не учтены ни в одном сase. Метку default можно и не использовать.

Решение задач

1. Вычислить значение функции

2. Написать программу, когда клиент покупает билеты в количестве N штук 100 руб. Если клиент купит, больше чем на 2000 руб, то скидка 3%, больше 5000 – 5%.

Задача 1. Кнопочный переключатель

Список деталей для эксперимента Принципиальная схема

§ 1 плата Arduino Uno 1 беспаечная макетная плата

§ 1 тактовая кнопка

§ 1 резистор номиналом 220 Ом

§ 1 светодиод

§ 5 проводов «папа-папа»

Для дополнительного задания

§ еще 1 кнопка

§ еще 2 провода

Обратите внимание

§ Мы могли бы один из контактов кнопки соединить проводом напрямую с одним из входов GND, но мы сначала «раздали» «землю» на длинную рельсу макетки. Если мы работаем с макетной платой, так поступать удобнее, т.к. в схеме могут появляться новые участки, которые тоже нужно будет соединить с «землей» § Также полезно руководствоваться соображениями аккуратности изделия, поэтому катод светодиода мы соединяем с другим входом GND отдельным проводом, который не мешает нам работать в середине макетки.  
Скетч

#define BUTTON_PIN 3

#define LED_PIN 13

 

boolean buttonWasUp = true; // была ли кнопка отпущена?

boolean ledEnabled = false; // включен ли свет?

 

void setup()

{

pinMode(LED_PIN, OUTPUT);

pinMode(BUTTON_PIN, INPUT_PULLUP);

}

void loop()

{

// определить момент «клика» несколько сложнее, чем факт того, что кнопка сейчас просто нажата. Для

// определения клика мы сначала понимаем, отпущена ли кнопка прямо сейчас...

boolean buttonIsUp = digitalRead(BUTTON_PIN);

//...если «кнопка была отпущена и (&&) не отпущена сейчас»...

if (buttonWasUp &&!buttonIsUp) {

//...может это «клик», а может и ложный сигнал (дребезг), возникающий в момент замыкания/размыкания // пластин кнопки, поэтому даём кнопке полностью «успокоиться»...

Задания для самостоятельного решения · Измените код так, чтобы светодиод переключался только после отпускания кнопки. · Добавьте в схему еще одну кнопку и доработайте код, чтобы светодиод зажигался только при нажатии обеих кнопок.    
delay(10);

//...и считываем сигнал снова

buttonIsUp = digitalRead(BUTTON_PIN);

if (!buttonIsUp) { // если она всё ещё нажата...

//...это клик! Переворачиваем сигнал светодиода

ledEnabled =!ledEnabled;

digitalWrite(LED_PIN, ledEnabled);

}

}

// запоминаем последнее состояние кнопки для новой итерации

buttonWasUp = buttonIsUp;

}

Пояснения к коду

§ Поскольку мы сконфигурировали вход кнопки как INPUT_PULLUP, при нажатии на кнопку на данном входе мы будем получать 0. Поэтому мы получим значение true («истина») в булевой переменнойbuttonIsUp («кнопка отпущена»), когда кнопка отпущена.

§ Логический оператор && («и») возвращает значение «истина» только в случае истинности обоих его операндов. Взглянем на так называемую таблицу истинности для выражения buttonWasUp &&!buttonIsUp («кнопка была отпущена и кнопка не отпущена»):

buttonWasUp buttonIsUp !buttonIsUp buttonWasUp &&!buttonIsUp
       
       
       
       

Здесь рассмотрены все возможные сочетания предыдущего и текущего состояний кнопки и мы видим, что наш условный оператор if сработает только в случае, когда кнопка нажата только что: предыдущее состояние 1 («была отпущена»), а текущее 0 («не отпущена»).

§ Через 10 миллисекунд мы проверяем еще раз, нажата ли кнопка: этот интервал больше, чем длительность «дребезга», но меньше, чем время, за которое человек успел бы дважды нажать на кнопку. Если кнопка всё еще нажата, значит, это был не дребезг.

§ Мы передаем в digitalWrite не конкретное значение HIGH или LOW, а просто булеву переменнуюledEnabled. В зависимости от того, какое значение было для нее вычислено, светодиод будет зажигаться или гаситься.

§ Последняя инструкция в buttonWasUp = buttonIsUp сохраняет текущее состояние кнопки в переменную предыдущего состояния, ведь на следующей итерации loop текущее состояние уже станет историей.


 

Задача 1. Определение момента клика тактовой кнопки

Одной из типичных задач при создании устройств на микроконтроллерах является определение момента клика тактовой кнопки, чтобы на это можно было как-то отреагировать. Проблема в том, что кнопка, как сенсор, может лишь сообщить зажата ли она сейчас или отпущена. Она не может сообщить, что была «нажата только что».

Но эта проблема легко решается с помощью небольшого приёма в программной части проекта. Давайте сделаем примитивное устройство с диодом и кнопкой, которое бы включало и выключало диод, поочерёдно, при нажатии кнопки: клик — включили, клик — выключили:

 


Типы переменных:

 
 
Имя переменной может содержать от одного до 32 символов. Разрешается использовать строчные и прописные буквы, цифры и символ подчёркивания, который в Си считается буквой. Первым символом обязательно должна быть буква. Имя переменной не может совпадать с зарезервированными словами. В языке Си все переменные должны быть объявлены. Это означает, что, во-первых, в начале каждой программы или функции Вы должны привести список всех используемых переменных, а во-вторых, указать тип каждой из них.


Тип Диапазон Размер
unsigned char 0... 255 8 bit
signed char или просто char -128... 127 8 bit
unsigned short int или просто unsigned int или unsigned short 0... 65535 16 bit
signed short int или signed int или просто short или int -32768... 32767 16 bit
unsigned long int или просто unsigned long 0... 4294967295 32 bit
signed long или просто long -2147483648... 2147483647 32 bit
unsigned long long 0... 18446744073709551615 64 bit
signed long long или просто long long -9223372036854775808... 9223372036854775807 64 bit

 

Для учителя

 
 
В скетче мы можем видеть 2 булевы переменные: § ledState содержит true, если лампа должна быть сейчас включена и false в противном случае § wasButtonDown хранит состояние кнопки на момент последнего прогона loop: если кнопка была зажата, значением будет true Теперь взглянем на сам loop. Первым делом мы считываем состояние кнопки в логическую переменную isButtonDown. Если кнопка зажата isButtonDown будет содержать true. Далее следует условное выражение if с проверкой условия, суть которого в том, чтобы понять была ли нажата кнопка только что, или она зажата уже давно. Для этого и используется значение wasButtonDown. Таким образом, условие стоит воспринимать как «кнопка зажата сейчас и не была зажата ранее». Это и есть условие сиемоментного «клика» кнопкой. Если условие клика выполнено — действуем. Переворачиваем значение ledState с ног на голову: ledState =! ledState; Далее, в ветке if следует delay(10). Вызов delay здесь сделан исключительно из-за несовершенства механических кнопок. При нажатии, за микросекунды, когда соприкасаются пластины, кнопка может зафиксировать замыкание и размыкание десятки раз. Добавив delay(10)мы просто пережидаем шторм. Десять миллисекунд — более чем достаточно для успокоения кнопки, но достаточно мало, чтобы человек заметил это. Далее мы присваиваем переменной wasButtonDownнедавно считанное значение isButtonDown, говорящее о том нажата ли кнопка сейчас. Если кнопка была зажата только что, произойдёт переключение состояния лампы ledState, а переменная wasButtonDown в итоге примет значениеtrue и будет оставаться с ним пока кнопку не отпустят. Таким образом, при следующем вызовеloop состояние не будет изменено снова. Если бы мы не прибегали к этому трюку, а использовали только текущее состояние кнопки без оглядки на предысторию, состояния бы менялись пока кнопка зажата, десятки тысяч раз в секунду. С точки зрения человека это выглядело бы как явная, назойливая проблема с устройством.  


 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-26 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: