Raspberry Pi: Управление выходами по времени суток (Python)
В этом руководстве вы узнаете, как легко управлять выходами GPIO Raspberry Pi в зависимости от времени суток. Мы будем программировать Raspberry Pi с помощью Python и библиотеки gpiozero. Мы создадим программу, которая автоматически включает и выключает выходы в соответствии с временем суток. В качестве примера мы будем управлять светодиодами, но вы можете управлять любыми другими цифровыми выходами.
Предварительные требования
Прежде чем продолжить работу с этим руководством, проверьте следующие предварительные требования.
Ознакомьтесь с платой Raspberry Pi — если вы не знакомы с Raspberry Pi, вы можете прочитать наше :doc:`Руководство по началу работы с Raspberry Pi </raspberry/rnt/getting-started-with-raspberry-pi/index>`_.
Вы должны уметь запускать и создавать файлы Python на вашем Raspberry Pi. Нам нравится программировать Raspberry Pi по SSH, используя расширение в VS Code. У нас есть подробное руководство на эту тему: :doc:`Программирование Raspberry Pi удалённо с помощью VS Code (Remote-SSH) </raspberry/rnt/raspberry-pi-remote-ssh-vs-code/index>`_.
Знайте, как использовать GPIO Raspberry Pi, чтобы правильно собрать схему. Прочитайте следующее руководство: :doc:`Распиновка Raspberry Pi: Как использовать GPIO Raspberry Pi? </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_
Также может быть полезно ознакомиться со следующим руководством, чтобы узнать, как управлять выходами Raspberry Pi:
Сборка схемы
Мы будем управлять двумя светодиодами в зависимости от времени суток. Вместо светодиодов вы можете управлять любыми другими цифровыми выходами.
Мы подключим один светодиод к GPIO 17, а другой к GPIO 27. Вы можете использовать любые другие подходящие выводы (посмотрите :doc:`распиновку Raspberry Pi здесь </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_).
Вот список необходимых компонентов:
Плата Raspberry Pi — читайте Лучшие стартовые наборы Raspberry Pi
2x резистора 220 Ом (или аналогичные)
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все детали для ваших проектов по лучшей цене!
Управление выходами Raspberry Pi по времени суток
Библиотека gpiozero предоставляет набор интерфейсов для повседневных компонентов, таких как светодиоды, кнопки, потенциометры, датчики и многое другое. Мы рекомендуем вам сначала :doc:`пройти этот урок </raspberry/rnt/raspberry-pi-digital-outputs-python/index>`_, если вы не знакомы с управлением GPIO Raspberry Pi с помощью библиотеки gpiozero.
Библиотека gpiozero должна быть уже установлена, если вы используете Raspberry Pi OS — если нет, вы можете выполнить следующую команду:
python3 -m pip gpiozero
Интерфейс TimeOfDay
Библиотека gpiozero предоставляет интерфейс под названием TimeOfDay, который позволяет создать устройство, активное, когда часы компьютера показывают, что текущее время находится в заданном диапазоне. Мы увидим, как это работает, на следующем примере.
Создайте новый файл Python на вашем Raspberry Pi с именем outputs_timeofday.py и скопируйте следующий код.
# Complete Project Details: https://RandomNerdTutorials.com/raspberry-pi-control-outputs-based-on-time/
from gpiozero import LED, TimeOfDay
from datetime import time
from signal import pause
led1 = LED(17)
led2 = LED(27)
tod1 = TimeOfDay(time(16,30), time(16,45), utc=False)
tod2 = TimeOfDay(time(16,45), time(16,50), utc=False)
tod1.when_activated = led1.on
tod1.when_deactivated = led1.off
tod2.when_activated = led2.on
tod2.when_deactivated = led2.off
pause()
Как работает код
Продолжайте чтение, чтобы узнать, как работает код.
Импорт библиотек
Сначала вы импортируете компонент LED из библиотеки gpiozero для управления GPIO, к которому подключен светодиод, и TimeOfDay для создания устройства с временным интервалом. Вам также понадобится функция time из модуля datetime для создания объектов времени. Наконец, вам также нужно импортировать функцию pause() из модуля signal, чтобы ваша программа продолжала работать и могла обнаруживать события.
from gpiozero import LED, TimeOfDay
from datetime import time
from signal import pause
Объявление светодиодов
Далее вы создаёте два объекта LED с именами led1 и led2, которые ссылаются на GPIO 17 и GPIO 27 соответственно.
led1 = LED(17)
led2 = LED(27)
Создание объектов TimeOfDay
Далее мы создаём два объекта типа TimeOfDay. Этот тип объекта работает так же, как кнопки, но всё происходит внутренне. Они активны в течение заданного периода времени. Например, tod1 активен между 16:30 и 16:45. Вы также должны передать параметр utc=False, чтобы использовалось ваше местное время.
tod1 = TimeOfDay(time(16,30), time(16,45), utc=False)
Вы можете передать и другие полезные аргументы классу TimeOfDay:
classgpiozero.TimeOfDay(start_time, end_time, *, utc=True, event_delay=10.0, pin_factory=None)
Вот что означают эти параметры:
start_time (time) — Время, начиная с которого устройство будет считаться активным.
end_time (time) — Время, после которого устройство будет считаться неактивным.
utc (bool) — Если True (по умолчанию), для сравнения будет использоваться наивное время UTC, а не чтение местного часового пояса. Я предпочитаю использовать местное время, поэтому устанавливаю этот параметр в False.
event_delay (float) — Количество секунд между чтениями файла (по умолчанию 10 секунд).
pin_factory: это расширенная функция, которую вам, вероятно, не понадобится использовать или о которой не нужно беспокоиться.
Мы создаём ещё один объект TimeOfDay, который будет активен между 16:45 и 16:50. Вы должны настроить эти значения, чтобы не ждать долго при тестировании проекта.
tod2 = TimeOfDay(time(16,45), time(16,50), utc=False)
События
Вы можете использовать обработчики when_activated и when_deactivated для обнаружения момента, когда наступает время начала и окончания, и связать функцию для выполнения при обнаружении каждого события.
when_activated
В следующей строке, когда tod1 активируется, led1 включается.
tod1.when_activated = led1.on
when_deactivated
Когда обнаруживается событие when_deactivated (наступает время окончания), led1 выключается.
tod1.when_deactivated = led1.off
Эти события срабатывают только при переходе от времени выключения к времени начала и от времени начала к времени выключения. Если вы запускаете программу, когда уже наступил активный период, светодиод не включится, потому что программа не обнаружила переход от времени выключения к времени включения. Чтобы предотвратить это, мы можем использовать метод is_active для проверки состояния объекта TimeOfDay (мы рассмотрим это позже).
Мы поступаем аналогично для другого светодиода.
tod2.when_activated = led2.on
tod2.when_deactivated = led2.off
Вместо включения и выключения светодиода вы можете связать любую другую функцию, которую необходимо выполнить при обнаружении этих событий кнопки.
Поддержание работы программы
В конце мы вызываем функцию pause(). Она поддерживает работу программы даже после выполнения всего кода, чтобы обнаруживать события — в данном случае она непрерывно проверяет время с помощью объектов TimeOfDay.
pause()
Демонстрация
Сохраните ваш файл Python. Затем запустите его на вашем Raspberry Pi. Выполните следующую команду в директории вашего файла проекта (используйте имя вашего файла):
python gpios_timeofday.py
Светодиод, подключённый к GPIO 17, должен загореться, когда время суток достигнет 16:30 (в моём примере), и он выключится, когда наступит 16:45. Другой светодиод, подключённый к GPIO 27, будет гореть с 16:45 до 16:50.
Эти события для включения и выключения светодиодов срабатывают только при переходе от времени выключения к времени начала и от времени начала к времени выключения. Если вы запускаете программу, когда уже наступил активный период, светодиод не включится, потому что программа не обнаружила переход от времени выключения к времени включения. Чтобы предотвратить это, мы можем использовать функцию is_active для проверки состояния объекта TimeOfDay — смотрите пример ниже.
Другие полезные методы
Интерфейс TimeOfDay предоставляет другие полезные методы, такие как метод is_active. Он возвращает True, если устройство в данный момент активно, и False в противном случае.
Вот похожий пример с использованием этого метода:
# Complete Project Details: https://RandomNerdTutorials.com/raspberry-pi-control-outputs-based-on-time/
from gpiozero import LED, TimeOfDay
from datetime import time
from signal import pause
led1 = LED(17)
led2 = LED(27)
tod1 = TimeOfDay(time(16,30), time(16,45), utc=False)
tod2 = TimeOfDay(time(16,45), time(16,50), utc=False)
while True:
if tod1.is_active:
led1.on()
else:
led1.off()
if tod2.is_active:
led2.on()
else:
led2.off()
Результат будет точно таким же, как в предыдущем примере. Но в данном случае светодиод включится, даже если время начала уже наступило.
Заключение
В этом руководстве вы узнали, как управлять выходами Raspberry Pi в зависимости от времени суток с помощью библиотеки gpiozero. Как видите, использование интерфейса TimeOfDay довольно простое. Он действует как кнопочный переключатель, который активируется в зависимости от времени суток.
Мы надеемся, что это руководство было для вас полезным. Если вы хотите узнать больше об управлении GPIO Raspberry Pi, ознакомьтесь со следующими руководствами:
Вы можете посмотреть все наши проекты для Raspberry Pi по следующей ссылке: