Микрокомпьютеры
November 15

Использование FastAPI на Raspberry Pi: использование GPIO и другие функции

В этой статье мы рассмотрим, как развернуть FastAPI на Raspberry Pi и настроить его для управления GPIO, а также обсудим несколько других полезных функций, которые можно реализовать.

Шаг 1: Установка FastAPI и подготовка окружения

Для начала установим необходимые зависимости и подготовим Raspberry Pi к запуску FastAPI.

Убедитесь, что Python 3 и pip установлены на вашем Raspberry Pi. Если нет, установите их с помощью:

sudo apt update
sudo apt install python3 python3-pip

Установите FastAPI и Uvicorn — сервер для запуска FastAPI-приложений:

pip3 install fastapi uvicorn

Для управления GPIO на Raspberry Pi нам также понадобится библиотека RPi.GPIO. Установите её:

sudo apt install python3-rpi.gpio

Шаг 2: Создание базового FastAPI-приложения

Создайте файл main.py, который будет нашим основным файлом приложения. В этом файле мы создадим простое API с использованием FastAPI, чтобы проверить, что всё установлено правильно.

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello from Raspberry Pi!"}

Перейдите в браузере по адресу http://<raspberry_pi_ip>:8000, и вы должны увидеть ответ {"message": "Hello from Raspberry Pi!"}, что означает, что приложение успешно запущено.

Шаг 3: Управление GPIO через FastAPI

Теперь мы добавим к нашему приложению возможность управлять GPIO Raspberry Pi. Это позволит контролировать такие компоненты, как светодиоды, реле и другие устройства, подключённые к выводам GPIO.

Пример: Управление светодиодом

Подключите светодиод к Raspberry Pi через резистор к одному из GPIO-пинов (например, GPIO 18). Затем обновим main.py, чтобы добавить маршруты для включения и выключения светодиода.

import RPi.GPIO as GPIO
from fastapi import FastAPI

# Настройка FastAPI и GPIO
app = FastAPI()
GPIO.setmode(GPIO.BCM)  # Использование схемы нумерации GPIO BCM
GPIO.setup(18, GPIO.OUT)  # Установка GPIO 18 как выход

@app.get("/led/on")
def led_on():
    GPIO.output(18, GPIO.HIGH)  # Включение светодиода
    return {"status": "LED is ON"}

@app.get("/led/off")
def led_off():
    GPIO.output(18, GPIO.LOW)  # Выключение светодиода
    return {"status": "LED is OFF"}

# Очистка GPIO при завершении работы приложения
@app.on_event("shutdown")
def cleanup_gpio():
    GPIO.cleanup()

Объяснение кода

  • GPIO.setup(18, GPIO.OUT): Устанавливаем 18-й GPIO в режим выхода.
  • GPIO.output(18, GPIO.HIGH): Устанавливаем высокое напряжение на 18-м GPIO, чтобы включить светодиод.
  • GPIO.output(18, GPIO.LOW): Устанавливаем низкое напряжение на 18-м GPIO, чтобы выключить светодиод.
  • cleanup_gpio: Функция очищает состояние GPIO при завершении работы FastAPI.

Теперь можно управлять светодиодом с помощью запросов:

  • GET /led/on — включение светодиода.
  • GET /led/off — выключение светодиода.

Дополнительные функции GPIO

Помимо включения и выключения устройств, вы можете использовать FastAPI для более сложных задач, таких как чтение данных с датчиков или управление ШИМ.

Пример: Чтение данных с датчика температуры

Допустим, у нас есть термометр, подключённый к Raspberry Pi. Мы можем прочитать данные и передать их через API:

from fastapi import FastAPI
import Adafruit_DHT

app = FastAPI()
sensor = Adafruit_DHT.DHT11
pin = 4  # GPIO, к которому подключён датчик

@app.get("/temperature")
def read_temperature():
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    if humidity is not None and temperature is not None:
        return {"temperature": temperature, "humidity": humidity}
    else:
        return {"error": "Failed to read sensor data"}

Для этого примера нам потребуется датчик температуры от Adafruit и библиотека Adafruit-DHT, которую можно установить так:

pip install Adafruit-DHT

Шаг 4: Автоматизация задач на Raspberry Pi

FastAPI можно использовать для автоматизации различных задач, таких как запуск скриптов, управление настройками или мониторинг состояния устройства.

Пример: Мониторинг состояния CPU и памяти

Добавим эндпоинт для мониторинга ресурсов Raspberry Pi, таких как загрузка процессора и использование памяти:

import psutil
from fastapi import FastAPI

app = FastAPI()

@app.get("/system/status")
def system_status():
    cpu_usage = psutil.cpu_percent(interval=1)
    memory = psutil.virtual_memory()
    return {
        "cpu_usage": cpu_usage,
        "memory_usage": memory.percent,
        "available_memory": memory.available // (1024 * 1024)
    }

Здесь psutil.cpu_percent возвращает загрузку CPU, а psutil.virtual_memory возвращает состояние памяти. Теперь, вызвав GET /system/status, вы получите актуальные данные о системе.

Шаг 5: Настройка автозапуска FastAPI-приложения на Raspberry Pi

Чтобы FastAPI-приложение автоматически запускалось при загрузке Raspberry Pi, можно настроить его как сервис systemd.

Настройка systemd

Создайте файл сервиса, например, /etc/systemd/system/fastapi.service:

[Unit]
Description=FastAPI on Raspberry Pi
After=network.target

[Service]
ExecStart=/usr/bin/python3 /path/to/your/main.py
WorkingDirectory=/path/to/your/
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

Замените /path/to/your/ на путь к вашему приложению.

Затем активируйте и запустите сервис:

sudo systemctl enable fastapi
sudo systemctl start fastapi

Теперь FastAPI будет автоматически запускаться при загрузке Raspberry Pi.

Заключение

Использовать FastAPI на Raspberry Pi — это как дать вашему мини-компьютеру суперсилу! 💪 Теперь вы можете управлять светодиодами, датчиками, отслеживать состояние системы и даже автоматизировать задачи с помощью удобного API. Всё это делается легко и быстро, как мурчание довольного котика. 🐱💡

FastAPI поможет вам превратить Raspberry Pi в мощный инструмент для управления IoT-устройствами, домашней автоматизацией или собственными проектами. Просто добавьте немного кода, и ваш Pi готов выполнять команды из любой точки мира! ✨

Начинайте творить, пробуйте новые функции и делитесь своими проектами с друзьями. Мир умных устройств ждёт ваших идей! 🌟