Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
products:laboratory_iot:exp1 [2020/05/03 21:42] – labuser29 | products:laboratory_iot:exp1 [2020/05/18 13:19] (текущий) – [Приступим] andiki |
---|
</file> | </file> |
| |
Введи код первой программы в среду программирования EsPy. Это сделать тремя способами: | Введи код первой программы в среду программирования EsPy. Это можно сделать тремя способами: |
- Набрать код программы в EsPy вручную | - Набрать код программы в EsPy вручную |
- Скопировать код и вставить его в EsPy | - Скопировать код и вставить его в EsPy |
| |
Необходимо убедиться, что EsPy установлено соединение с Лабораторией IoT | Необходимо убедиться, что EsPy установлено соединение с Лабораторией IoT |
([[products:laboratory_iot:connect_and_setup|Подробнее о том, как это сделать]]) | ([[products:laboratory_iot:connect|Подробнее о том, как это сделать]]) |
и отправить листинг интерпретатору Python, который находится в микроконтроллере. | и отправить листинг интерпретатору Python, который находится в микроконтроллере. |
| |
Результатом должно стать мигание синего светодиода в верхнем лесом углу Лаборатории. | {{ :products:2020-05-04_12-33-42.png?nolink |}} |
| |
| Результатом должно стать мигание синего светодиода в верхнем левом углу Лаборатории. |
| |
{{ :products:ezgif-7-94859b24b844.gif?nolink |}} | {{ :products:ezgif-7-94859b24b844.gif?nolink |}} |
==== Не работает? ==== | ==== Не работает? ==== |
Если не получилось, то необходимо еще раз проверить подключение, убедиться, что соединение настроено | Если не получилось, то необходимо еще раз проверить подключение, убедиться, что соединение настроено |
верно. Для этого еще раз внимательно прочитать статью [[products:laboratory_iot:connect_and_setup|Подключение и настройка]]. Если все выполнено верно, но все равно не работает — [[products:laboratory_iot:not_working|Возможные проблемы и их устранение]] | верно. Для этого еще раз внимательно прочитать статью [[products:laboratory_iot:connect|Подключение и настройка]]. Если все выполнено верно, но все равно не работает — [[products:laboratory_iot:not_working|Возможные проблемы и их устранение]] |
| |
| ==== Как это работает? ==== |
| Теперь, когда первый эксперимент удался, самое время разобраться как и почему это работает. |
| |
| В первых двух строках, с помощью оператора ''import'' мы подключаем необходимые системные библиотеки, а именно ''time'' и класс ''Pin'' из библиотеки ''machine'' |
| |
<code python [enable_line_numbers="2", start_line_numbers_at="1"]> | <code python [enable_line_numbers="2", start_line_numbers_at="1"]> |
import time | import time |
</code> | </code> |
| |
| ''time'' отвечает за измерение времени, функции даты и за задержки, а ''Pin'' реализует возможность обращаться к портам GPIO (//англ. general-purpose input/output// по-русски //Интерфейс ввода/вывода общего назначения//), с его помощью можно настроить вывод микроконтроллера и подать на него напряжение. |
| |
| <WRAP center round info 60%> |
| [[https://pythonworld.ru/osnovy/rabota-s-modulyami-sozdanie-podklyuchenie-instrukciyami-import-i-from.html|Подробнее об import и from]] |
| </WRAP> |
| |
| Вызываем функцию ''_init()'' — это функция, которую мы написали и заботливо положили в память Лаборатории IoT при производстве. Она необходима для сброса состояния микроконтроллера в начальное состояние, чтобы результаты запуска другого эксперимента не влияли на текущий. |
| |
<code python [enable_line_numbers="2", start_line_numbers_at="3"]> | <code python [enable_line_numbers="2", start_line_numbers_at="3"]> |
</code> | </code> |
| |
| В строке 5 мы объявляем переменную ''LedPin'' и присваиваем ей значение ''2'' |
<code python [enable_line_numbers="2", start_line_numbers_at="5"]> | <code python [enable_line_numbers="2", start_line_numbers_at="5"]> |
LedPin = 2 | LedPin = 2 |
</code> | </code> |
| Как видно из её названия, она хранит номер вывода микроконтроллера, к которому подключен светодиод. |
| Все выводы микроконтроллера имеют свой номер, именно по этому номеру и происходит работа с ними из программы. |
| |
| |
| Далее нам нужно настроить вывод микроконтроллера: |
<code python [enable_line_numbers="2", start_line_numbers_at="7"]> | <code python [enable_line_numbers="2", start_line_numbers_at="7"]> |
led = Pin(LedPin, Pin.OUT) | led = Pin(LedPin, Pin.OUT) |
</code> | </code> |
| |
| Мы вызываем функцию Pin и передаем ей в качестве первого параметра номер вывода (который записан в переменной ''LedPin''), а вторым параметром мы сообщаем, что хотим настроить этот вывод как цифровой //Выход//. Результатом функции ''Pin'' является одноименный объект ''Pin'' вывода микроконтроллера, который мы записываем в переменную ''led''. |
| |
| |
| Теперь мы можем обращаться к этому объекту и влиять на состояние ножки микроконтроллера. |
| |
<code python [enable_line_numbers="2", start_line_numbers_at="9"]> | <code python [enable_line_numbers="2", start_line_numbers_at="9"]> |
time.sleep(1) | time.sleep(1) |
</code> | </code> |
| |
| Функция ''led.off()'' устанавливает низкий уровень на выводе ''led'', а функция ''led.on()'' — высокий. Таким образом мы подаем или снимаем напряжение со светодиода, который подключен к этому выводу. |
| |
| Зачем же нам ''time.sleep(1)''? Все дело в том, что микроконтроллер работает очень быстро, исполняя миллионы операций в секунду. Он может тысячи раз в секунду зажечь и потушить светодиод. Это слишком быстро, чтобы человек смог что либо заметить. Чтобы приостановить исполнение программы мы и вызываем функцию ''time.sleep''. В качестве параметра она принимает число секунд на которое нужно сделать паузу. В нашем случае мы делаем паузу на 1 секунду после зажигания светодиода и столько же после его выключения. |
| |
| Но что такое ''while True:''? Это цикл. Циклы— это важнейшие элементы программ. Они нужны, чтобы выполнять один и тот же участок кода несколько раз. В языке Python есть несколько видов циклов и ''while'' это один из них. Этот цикл выполняется до тех пор, пока выполняется условие, пока оно //истинно//. В нашем случае это константа ''True'', что переводится как //истина//. Получается, что наше условие всегда безусловно //истинно//, и наш цикл является бесконечным. Участок кода, который зажигает и гасит светодиод будет продолжаться бесконечно, пока на плату поступает питание и, пока, не будет прервано выполнение программы извне. |
| |
| Как Python понимает какой именно участок кода является //телом цикла//, какой именно участок кода необходимо повторять? Для этого в Python используются отступы. Как можно видеть код в строках с 10 по 13 начинается не с начала, а с некоторым отступом. Вот именно тот участок кода, который обладает данным отступом и есть //тело цикла//. |
| |
| <WRAP center round info 60%> |
| * [[https://pythonworld.ru/osnovy/cikly-for-i-while-operatory-break-i-continue-volshebnoe-slovo-else.html|Подробнее о циклах в Python]] |
| * [[https://pythonworld.ru/osnovy/sintaksis-yazyka-python.html|Подробнее о синтаксисе языка Python]] |
| </WRAP> |
| |
| ==== Остановка программы ==== |
| Как же прервать исполнение программы, когда она занята исполнением бесконечного цикла, ведь сама она никогда не закончится? |
| Нажмите на клавиатуре ''Ctrl+I'' или на кнопку |
| |
| {{ :products:2020-05-04_12-35-46.png?nolink |}} |
| |
| В окне терминала появится сообщение ''KeyboardInterrupt:'' (Прерывание от клавиатуры) |
| |