← Вернуться к оглавлению

Урок 14. Использование датчика для запуска уведомления

Firmata - это хороший способ начать работу с Arduino и Python, но необходимость в ПК или другом устройстве для запуска приложения может быть не оправдано, и в некоторых случаях такой подход может оказаться нецелесообразным.

Однако, когда необходимо собрать данные и отправить их на ПК с помощью внешних датчиков, Arduino и Firmata создают хорошую комбинацию.

В этом уроке мы будем использовать кнопку, подключенную к вашему Arduino, чтобы имитировать цифровой датчик и запускать уведомления на вашем компьютере. Для более практического применения вы можете думать о кнопке как, например, о датчике двери, который вызовет "тревожное" уведомление.

Для отображения уведомления на ПК мы будем использовать Tkinter, стандартный набор инструментов Python GUI. Этот инструмент нам поможет показать окно сообщения при нажатии кнопки.

Справка. Для подробного ознакомления с Tkinter ознакомьтесь с документацией библиотеки.

Вам нужно собрать ту же схему, что и в уроке с цифровым входом:

После сборки схемы используйте следующую программу для запуска уведомлений:

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 мы поговорим в отдельном материале или курсе совсем скоро.

Примечание. Если вы используете учетную запись Gmail для отправки электронных писем, вам необходимо включить параметр "Разрешить менее безопасные приложения" (Allow less secure apps).
Ардуино+