Firmata - это хороший способ начать работу с Arduino и Python, но необходимость в ПК или другом устройстве для запуска приложения может быть не оправдано, и в некоторых случаях такой подход может оказаться нецелесообразным.
Однако, когда необходимо собрать данные и отправить их на ПК с помощью внешних датчиков, Arduino и Firmata создают хорошую комбинацию.
В этом уроке мы будем использовать кнопку, подключенную к вашему Arduino, чтобы имитировать цифровой датчик и запускать уведомления на вашем компьютере. Для более практического применения вы можете думать о кнопке как, например, о датчике двери, который вызовет "тревожное" уведомление.
Для отображения уведомления на ПК мы будем использовать Tkinter, стандартный набор инструментов Python GUI. Этот инструмент нам поможет показать окно сообщения при нажатии кнопки.
Вам нужно собрать ту же схему, что и в уроке с цифровым входом:
После сборки схемы используйте следующую программу для запуска уведомлений:
import pyfirmata import time import tkinter from tkinter import messagebox root = tkinter.Tk() root.withdraw() board = pyfirmata.Arduino('/dev/ttyACM0') it = pyfirmata.util.Iterator(board) it.start() digital_input = board.get_pin('d:10:i') led = board.get_pin('d:13:o') while True: sw = digital_input.read() if sw is True: led.write(1) messagebox.showinfo("Notification", "Button was pressed") root.update() led.write(0) time.sleep(0.1)
Эта программа похожа на ту, которая используется в уроке с цифровым входом, с некоторыми изменениями:
- Строки 3 и 4 импортируют библиотеки, необходимые для настройки Tkinter.
- Строка 6 создает главное окно Tkinter.
- Строка 7 говорит Tkinter не показывать главное окно на экране. Для этого примера вам нужно только увидеть окно сообщения.
- Строка 17 запускает цикл while:
1. Когда вы нажимаете кнопку, включается светодиод, и messagebox.showinfo() отображает окно сообщения.
2. Цикл приостанавливается до тех пор, пока пользователь не нажмет OK. Таким образом, светодиод остается включенным, пока сообщение находится на экране.
3. После того, как пользователь нажмет OK, root.update() очищает окно сообщения с экрана, и индикатор выключается.
Чтобы расширить пример уведомления, вы можете даже использовать кнопку для отправки электронного письма при нажатии:
import pyfirmata import time import smtplib import ssl def send_email(): port = 465 # For SSL smtp_server = "smtp.gmail.com" sender_email = "<your email address>" receiver_email = "<destination email address>" password = "<password>" message = """Subject: Arduino Notification\n The switch was turned on.""" context = ssl.create_default_context() with smtplib.SMTP_SSL(smtp_server, port, context=context) as server: print("Sending email") server.login(sender_email, password) server.sendmail(sender_email, receiver_email, message) board = pyfirmata.Arduino('/dev/ttyACM0') it = pyfirmata.util.Iterator(board) it.start() digital_input = board.get_pin('d:10:i') while True: sw = digital_input.read() if sw is True: send_email() time.sleep(0.1)
Здесь вы настраиваете функцию с учетными данными почтового сервера, которые будут использоваться для отправки электронной почты. Про работу send_email() и отправку писем с помощью Python мы поговорим в отдельном материале или курсе совсем скоро.