Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
products:aruno:exp4 [2020/05/22 18:49] – [Программный код эксперимента] labuser29 | products:aruno:exp4 [2020/11/05 12:52] (текущий) – [Подключение кнопки] alexnik |
---|
| |
==== Подключение кнопки ==== | ==== Подключение кнопки ==== |
Из предыдущих экспериментов мы помним, что, микроконтроллер на пины может подавать //логический нуль// или //логическую единицу//,подробнее можно ознакомиться в базе наний по [[theory:logic_1_0|ссылке]], но как получить их с помощью кнопки? Логично подключить кнопку между выводом микроконтроллера и напряжением питания. Когда кнопка нажимается, напряжение питания подается на ножку, что является //логической единицей//. Такая схема изображена на рисунке 2. | Из предыдущих экспериментов мы помним, что, микроконтроллер на пины может подавать //логический нуль// или //логическую единицу//,подробнее можно ознакомиться в базе знаний по [[theory:logic_1_0|ссылке]], но как получить их с помощью кнопки? Логично подключить кнопку между выводом микроконтроллера и напряжением питания. Когда кнопка нажимается, напряжение питания подается на ножку, что является //логической единицей//. Такая схема изображена на рисунке 2. |
| |
{{ :products:esp-iot:exp3.2.png?nolink |}} | {{ :products:ardu:exp3.2.png?nolink |}} |
//Рисунок 2. Неправильная схема подключения кнопки// | //Рисунок 2. Неправильная схема подключения кнопки// |
| |
Но как подключить кнопку, чтобы в одном состоянии она соединяла ножку с питанием, а в другом— с землей, ведь у нее только один контакт, который либо замкнут, либо разомкнут? В таком случае используют резистор, с помощью которого ножку микроконтроллера //подтягивают// к противоположному уровню. | Но как подключить кнопку, чтобы в одном состоянии она соединяла ножку с питанием, а в другом— с землей, ведь у нее только один контакт, который либо замкнут, либо разомкнут? В таком случае используют резистор, с помощью которого ножку микроконтроллера //подтягивают// к противоположному уровню. |
| |
{{ :products:esp-iot:exp3.3.png?nolink |}} | {{ :products:ardu:exp3.3.png?nolink |}} |
//Рисунок 3. Правильные схемы подключения кнопки// | //Рисунок 3. Правильные схемы подключения кнопки// |
| |
==== Схема эксперимента ==== | ==== Схема эксперимента ==== |
| |
{{ :products:esp-iot:exp3.4.png?direct |}} | {{ :products:ardu:exp3.4.png?nolink |}} |
//Рисунок 4. Электрическая принципиальная схема эксперимента// | //Рисунок 4. Электрическая принципиальная схема эксперимента// |
| |
Соберем схему: | Соберем схему: |
{{ :products:ardu:exp03.png |}} | {{ :products:ardu:exp03.png?direct&600 |}} |
//Рисунок 5. Монтажная схема эксперимента// | //Рисунок 5. Монтажная схема эксперимента// |
| |
Теперь напишем программу результатом выполнения которой будет светится светодиод при нажатии на кнопку. | Теперь напишем программу результатом выполнения которой будет светится светодиод при нажатии на кнопку. |
| |
<file python Exp4[enable_line_numbers="2", start_line_numbers_at="1"]> | <file cpp Exp4[enable_line_numbers="2", start_line_numbers_at="1"]> |
int keyPin = 12; //номер пина контроллера кнопки | int keyPin = 12; //номер пина контроллера кнопки |
int ledPin = 2; //номер пина контроллера светодиода | int ledPin = 2; //номер пина контроллера светодиода |
| |
void setup() | void setup() { |
{ | pinMode(keyPin,INPUT);//установки режима пина кнопки на "вход" |
pinMode(keyPin,INPUT);//установки режима пина кнопки на "вход" | pinMode(ledPin,OUTPUT);//установки режима пина светодиода на "выход" |
pinMode(ledPin,OUTPUT);//установки режима пина светодиода на "выход" | } |
} | |
| |
void loop() | void loop() { |
{ | if(digitalRead(keyPin) == HIGH) { |
if(digitalRead(keyPin) ==HIGH ) | digitalWrite(ledPin,HIGH); |
{ | } |
digitalWrite(ledPin,HIGH); | else { |
} | digitalWrite(ledPin,LOW); |
else | } |
{ | } |
digitalWrite(ledPin,LOW); | |
} | |
} | |
</file> | </file> |
| |
</code> | </code> |
| |
разберем на составляющие строку с объявлением переменной ''keyPin'' | разберем на составляющие строку с объявлением переменной ''keyPin''\\ |
''int'' - тип переменной для хранения чисел,\\ | ''int'' - тип переменной для хранения чисел,\\ |
''keyPin'' - имя переменной,\\ | ''keyPin'' - имя переменной,\\ |
''12'' - значение которое присваивается переменной,\\ | ''12'' - значение которое присваивается переменной,\\ |
'';'' - (точка с запятой) обязательный символ в конце выражения,\\ | '';'' - (точка с запятой) обязательный символ в конце выражения,\\ |
'' \ \номер пина контроллера кнопки'' - комментарий кода, удобно использовать для подписи блоков кода \\ | '' %%//%%номер пина контроллера кнопки'' - комментарий кода, удобно использовать для подписи блоков кода \\ |
| |
результатам выполнения данного выражение будет присвоение переменной keyPin значения 12\\ | результатам выполнения данного выражение будет присвоение переменной keyPin значения 12\\ |
в строке 2 - переменной ledPin присваивается значение 2\\ | в строке 2 - переменной ledPin присваивается значение 2\\ |
| |
<code python[enable_line_numbers="2", start_line_numbers_at="10"]> | после инициализации переменных начинается выполнение функции ''setup()'', в которой настраиваются режимы работы пинов контроллера, пин 12 на "вход" сигнала, а пин 2 на "выход"\\ |
while True: | |
</code> | |
| |
Начинаем бесконечный цикл | |
| |
<code python[enable_line_numbers="2", start_line_numbers_at="11"]> | в функции ''loop()'' программа проверяет в каком положении находится кнопка\\ |
button_value = Button.value() | <code cpp[enable_line_numbers="15", start_line_numbers_at="9"]> |
if button_value == 1: | void loop() { |
Led.on() | if(digitalRead(keyPin) == HIGH) { |
else: | digitalWrite(ledPin,HIGH); |
Led.off() | } |
| else { |
| digitalWrite(ledPin,LOW); |
| } |
| } |
</code> | </code> |
Тело цикла. Этот код повторяется бесконечное количество раз, пока программа не будет прервана пользователем с помощью кнопки {{ :products:2020-05-04_12-35-46.png?nolink |}} | Здесь мы впервые сталкиваемся с условным оператором. Оператор ''if'' проверяет выполнение условия и исполняет код в зависимости от того выполнено условие или нет. Если условие выполняется, то выполняется код в блоке прямо под ним. Если условие ложно, то исполняется код в блоке ''else''. |
| В нашем случае условием является ''(digitalRead(keyPin) == HIGH)''. Символ двойного равенства ''=='' это оператор сравнения. Он сравнивает значение выражения слева от себя со значением выражения справа от себя. Если эти значения равны, то равенство выполняется, иначе— нет. |
<code python[enable_line_numbers="2", start_line_numbers_at="12"]> | |
button_value = Button.value() | |
</code> | |
Сначала мы считываем состояние вывода, к которому подключена кнопка, с помощью вызова функции ''Button.value()'' и записываем это состояние в переменную ''button_value''. Если кнопка нажата, то (в соответствии со схемой на рисунке 4) на выводе микроконтроллера состояние логической единицы, значит в переменную ''button_value'' запишется ''1''. А если кнопка не нажата, на ножке логический ноль, в переменную запишется 0. | |
| |
<code python[enable_line_numbers="2", start_line_numbers_at="12"]> | |
if button_value == 1: | |
</code> | |
| |
Здесь мы впервые сталкиваемся с //условным оператором//. Оператор if проверяет выполнение условия и исполняет код в зависимости от того выполнено условие или нет. Если условие выполняется, то выполняется код в блоке прямо под ним. Если условие ложно, то исполняется код в блоке ''else''. | |
| |
В нашем случае условием является ''button_value == 1''. Символ двойного равенства ''=='' это оператор сравнения. Он сравнивает значение выражения слева от себя со значением выражения справа от себя. Если эти значения равны, то равенство выполняется, иначе— нет. | |
| |
<WRAP center round info 60%> | <WRAP center round info 60%> |
[[https://pythonworld.ru/osnovy/instrukciya-if-elif-else-proverka-istinnosti-trexmestnoe-vyrazhenie-ifelse.html|Подробнее об операторе if]] | [[http://arduino.ru/Reference/If|Подробнее об операторе if]] |
</WRAP> | </WRAP> |
| |
| функция ''digitalRead(keyPin)'' проверяет, соответствует ли текущий сигнал на заданном пине сигналу ''"HIGH"'',(в аргументе функции записана переменная ''keyPin'', в которую ранее мы записали номер пина к которому подключена кнопка.)\\ |
| если условие верно (кнопка нажата), то функция ''digitalWrite(ledPin,HIGH);'' устанавливает сигнал "HIGH" на пине к которому подключен светодиод и он начинает светиться, а если условие не выполняется (кнопка не нажата), функция digitalWrite(ledPin,LOW); на пин светодиода подает сигнал "LOW" и он гаснет.\\ |
| |
<WRAP center round important 60%> | <WRAP center round important 60%> |
Ранее мы уже сталкивались с оператором присвоения = . Этот оператор предназначен для присвоения значения переменной. Например | Обратите внимание, что оператор присвоения ''='' предназначен для присвоения значения. |
<code python> | Например |
a = 2 | <code cpp> |
| int keyPin = 12; |
</code> | </code> |
присваивает значение 2 переменной ''a''. Теперь же мы использовали оператор сравнения == . Он сравнивает два значения. По виду они похожи, но это совершенно разные операторы и путать их нельзя. | А оператор сравнения ''=='', сравнивает два значения.\\ |
| По виду они похожи, но это совершенно разные операторы и путать их нельзя. |
</WRAP> | </WRAP> |
| |
Итак, в строке 12 с помощью оператора ''if'' мы проверяем выполнение условия равенства переменной button_value цифре 1. По сути это проверка нажата ли кнопка. Если да, если условие выполняется, то выполняется код | |
<code python[enable_line_numbers="2", start_line_numbers_at="13"]> | |
Led.on() | |
</code> | |
который зажигает светодиод. А если условие не верно, а значит кнопка не нажата, то выполняется код в блоке ''else'' | |
<code python[enable_line_numbers="2", start_line_numbers_at="15"]> | |
Led.off() | |
</code> | |
который гасит светодиод. | |
| |
Теперь, когда мы разобрали каждую строку программы, взглянем опять на алгоритм целиком: программа постоянно, бесконечное количество раз, проверяет нажата ли кнопка. Если кнопка нажата, то на светодиод зажигается, если же кнопка не нажата то светодиод выключается. | Теперь, когда мы разобрали каждую строку программы, взглянем опять на алгоритм целиком: программа постоянно, бесконечное количество раз, проверяет нажата ли кнопка. Если кнопка нажата, то на светодиод зажигается, если же кнопка не нажата то светодиод выключается. |