| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
| products:laboratory_iot:exp1 [2020/05/03 21:58] – [Как это работает?] 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, который находится в микроконтроллере. |
| |
| <WRAP center round alert 60%> | {{ :products:2020-05-04_12-33-42.png?nolink |}} |
| Добавить картинку кнопки отправки | |
| </WRAP> | |
| |
| Результатом должно стать мигание синего светодиода в верхнем лесом углу Лаборатории. | Результатом должно стать мигание синего светодиода в верхнем левом углу Лаборатории. |
| |
| {{ :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|Возможные проблемы и их устранение]] |
| |
| ==== Как это работает? ==== | ==== Как это работает? ==== |
| Теперь, когда первый эксперимент удался, самое время разобраться как и почему это работает. | Теперь, когда первый эксперимент удался, самое время разобраться как и почему это работает. |
| |
| В первых двух строках, с помощью мы подключаем необходимые системные библиотеки, а именно ''time'' и класс ''Pin'' из библиотеки ''machine'' | В первых двух строках, с помощью оператора ''import'' мы подключаем необходимые системные библиотеки, а именно ''time'' и класс ''Pin'' из библиотеки ''machine'' |
| | |
| ''time'' отвечает за измерение времени, функции даты и за задержки, а ''Pin'' реализует возможность обращаться к портам GPIO (//англ. general-purpose input/output// по-русски //Интерфейс ввода/вывода общего назначения//) | |
| |
| <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:'' (Прерывание от клавиатуры) |
| | |