Интеллектуальное управление вентилятором Raspberry Pi с помощью Python

Схема управления вентилятором Raspberry Pi

Скрипт на Python будет отслеживать температуру процессора Raspberry Pi и управлять вентилятором на основе температурного гистерезиса.

Википедия: Гистерезис (греч. — отставание, запаздывание) — свойство систем (физических, биологических и т. д.), мгновенный отклик которых на приложенные к ним воздействия зависит в том числе и от их текущего состояния, а поведение системы на интервале времени во многом определяется её предысторией. Подробнее

Шаг 1. Краткий обзор

По умолчанию вентилятор подключается напрямую к GPIO, что подразумевает его постоянную работу. Хотя вентилятор работает относительно тихо, его непрерывное вращение не является рациональным использованием активного охлаждения. Помимо этого, постоянный шум вентилятора может раздражать. Более того, даже при выключенной Raspberry Pi вентилятор продолжит работать, если подано питание.

В данном уроке мы покажем, как при помощи простых манипуляций превратить обычную систему охлаждения в интеллектуальную! Она будет активироваться лишь тогда, когда процессор действительно нуждается в охлаждении. Вентилятор запускается только при интенсивной нагрузке, что снижает и энергопотребление, и уровень шума. Вдобавок это увеличивает срок службы вентилятора за счёт его отключения в моменты простоя.

Шаг 2. Комплектующие

Для реализации проекта по мониторингу температуры процессора Raspberry Pi и управлению вентилятором понадобятся следующие детали:

  • Raspberry Pi 4 (4GB) x 1

  • Транзистор общего назначения NPN x 1

  • Резистор 330 Ом x 1

  • Алюминиевый металлический корпус с двумя вентиляторами для Raspberry Pi x 1

  • Макетная плата x 1

  • Провода-перемычки

Шаг 3. Схема проекта

Схема достаточно проста. Питание вентилятора коммутируется при помощи NPN-транзистора. В такой конфигурации транзистор выполняет роль ключа на стороне «земли». Резистор нужен исключительно для ограничения тока через вывод GPIO.

Максимальный выходной ток GPIO Raspberry Pi составляет 16 мА. Я использовал резистор 330 Ом, что обеспечивает базовый ток порядка:

(5-0,7) / 330 = 13 мА

В качестве NPN-транзистора был выбран S8050, поэтому коммутация нагрузки 400 мА от обоих вентиляторов не составляет проблемы.

Выполните все соединения согласно приведённой выше схеме. В результате должен получиться примерно такой вариант:

Собранная схема управления вентилятором Raspberry Pi

Шаг 4. Создаем логи температуры процессора с помощью ThingSpeak

ThingSpeak представляет собой платформу для проектов на базе концепции «Интернета вещей». Она позволяет разрабатывать приложения, использующие данные, полученные от датчиков.

Ключевые возможности ThingSpeak включают сбор данных в реальном времени, их обработку и визуализацию. API ThingSpeak позволяет не только отправлять, хранить и извлекать данные, но и применять различные статистические методы для их анализа.

Зарегистрироваться на сайте можно по этой ссылке.

ThingSpeak поддерживает интеграцию с популярными устройствами и сервисами, такими как:

  • Arduino

  • Raspberry Pi

  • ioBridge / RealTime.io

  • Мобильные и веб-приложения

  • Социальные сети

  • Анализ данных в MATLAB

Прежде чем начать, необходимо создать учётную запись в ThingSpeak:

  1. Перейдите по этой ссылке и зарегистрируйтесь в ThingSpeak.

  2. После активации учетной записи войдите в систему.

  3. Перейдите в: Каналы -> Мои каналы (англ. Channels -> My Channels)

ThingSpeak каналы

Нажмите на кнопку Новый канал (англ. - New Channel).

ThingSpeak новый канал

Укажите имя, описание и данные, которые планируете загружать.

ThingSpeak настройка канала

Нажмите кнопку Сохранить канал ( Save Channel) для сохранения всех настроек.

Нам потребуется ключ API, который мы впоследствии добавим в код Python для отправки температуры процессора в облако Thingspeak.

Перейдите на вкладку API Keys, чтобы получить Write API Key.

ThingSpeak API Keys

С полученным ключом API ( Write API Key) мы практически готовы к выгрузке данных.

Шаг 5. Получение температуры процессора от Raspberry Pi с использованием Python

Работа скрипта основана на считывании температуры процессора с интервалом в одну секунду. Получить значение температуры можно через терминал, выполнив команду vcgencmd с параметром measure_temp.

vcgencmd measure_temp

Для выполнения этой команды применяется библиотека subprocess.check_output(), а для извлечения числового значения из полученной строки используется регулярное выражение.

from subprocess import check_output
from re import findall
def get_temp():
    temp = check_output(["vcgencmd","measure_temp"]).decode()
    temp = float(findall('\d+\.\d+', temp)[0])
    return(temp)

print(get_temp())

Получив значение температуры, данные необходимо передать в облако ThingSpeak. Используйте ваш ключ Write API Key для замены переменной myApi в приведённом ниже коде на Python.

Шаг 6. Управление вентилятором в зависимости от температуры

Приведённый ниже скрипт на Python реализует логику включения вентилятора при превышении заданной температуры и выключения только при её падении ниже порогового значения. Благодаря этому вентилятор не будет мгновенно переключаться между состояниями.

Шаг 7. Финальный код

Итоговый код на Python приведён ниже. Обязательно укажите собственный ключ Write API Key.

import RPi.GPIO as GPIO # Import a GPIO library
import sys # Import libraries for exception handling
from urllib import request # Import a library for working with URLs
from re import findall # Import a regex library
from time import sleep #Import a library to work with time
from subprocess import check_output # Import the library for working with subprocesses
myAPI = '##################' # Enter Your API key here
baseURL = 'https://api.thingspeak.com/update?api_key=%s' % myAPI # URL where we will send the data

def get_temp():
    temp = check_output(["vcgencmd","measure_temp"]).decode()    # Using subprocess.check_output() assign the temperature of Raspberry CPU to temp variable
    temp = float(findall('\d+\.\d+', temp)[0])                   # Using regular expression, we get the temperature value
    return(temp)
try:
    GPIO.setwarnings(False)                 # Disable GPIO warnings
    tempOn = 50                             # Turn on fan, when CPU temperature reaches 40degC
    threshold = 10                          # Temperature threshold
    controlPin = 14                         # Control GPIO pin
    pinState = False                        # Actual status of fan
    GPIO.setmode(GPIO.BCM)                  # Set numbering system to BCM
    GPIO.setup(controlPin, GPIO.OUT, initial=0) # Set control GPIO to OUTPUT mode
    while True:
        temp = get_temp()
        if temp > tempOn and not pinState or temp < tempOn - threshold and pinState:
                pinState = not pinState         # Change the pin status
                GPIO.output(controlPin, pinState) # Set a new status for the control pin
        conn = request.urlopen(baseURL + '&field1=%s' % (temp))
        print(str(temp) + "  " + str(pinState))
        print(conn.read())
        conn.close()
        sleep(1)
except KeyboardInterrupt:
    print("Exit pressed Ctrl+C")            # Exit the program by pressing Ctrl + C
except:
    print("Other Exception")                # Other exceptions
    print("--- Start Exception Data:")
    traceback.print_exc(limit=2, file=sys.stdout)
    print("--- End Exception Data:")
finally:
    print("CleanUp")
    GPIO.cleanup()                          # Return the pins state to their original state
    print("End of program")

Войдите в Raspberry PI.

Выполните следующую команду в терминале:

python3 cpu.py

Спустя некоторое время откройте свой канал в ThingSpeak, и вы увидите, как температура передаётся в облако Thingspeak в режиме реального времени.

График температуры Raspberry Pi в ThingSpeak

Настройте автоматический запуск скрипта Python при загрузке системы. Для этого откройте файл /etc/rc.local:

sudo nano /etc/rc.local

Добавьте команду запуска скрипта перед строкой выхода 0:

sudo python /home/pi/cpu.py &

Внимание

Наличие символа & в конце команды является обязательным, поскольку это флаг для запуска процесса в фоновом режиме.

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