Интеллектуальное управление вентилятором Raspberry Pi с помощью Python
Скрипт на 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 мА от обоих вентиляторов не составляет проблемы.
Выполните все соединения согласно приведённой выше схеме. В результате должен получиться примерно такой вариант:
Шаг 4. Создаем логи температуры процессора с помощью ThingSpeak
ThingSpeak представляет собой платформу для проектов на базе концепции «Интернета вещей». Она позволяет разрабатывать приложения, использующие данные, полученные от датчиков.
Ключевые возможности ThingSpeak включают сбор данных в реальном времени, их обработку и визуализацию. API ThingSpeak позволяет не только отправлять, хранить и извлекать данные, но и применять различные статистические методы для их анализа.
Зарегистрироваться на сайте можно по этой ссылке.
ThingSpeak поддерживает интеграцию с популярными устройствами и сервисами, такими как:
Arduino
Raspberry Pi
ioBridge / RealTime.io
Мобильные и веб-приложения
Социальные сети
Анализ данных в MATLAB
Прежде чем начать, необходимо создать учётную запись в ThingSpeak:
Перейдите по этой ссылке и зарегистрируйтесь в ThingSpeak.
После активации учетной записи войдите в систему.
Перейдите в: Каналы -> Мои каналы (англ. Channels -> My Channels)
Нажмите на кнопку Новый канал (англ. - New Channel).
Укажите имя, описание и данные, которые планируете загружать.
Нажмите кнопку Сохранить канал ( Save Channel) для сохранения всех настроек.
Нам потребуется ключ API, который мы впоследствии добавим в код Python для отправки температуры процессора в облако Thingspeak.
Перейдите на вкладку API Keys, чтобы получить Write API Key.
С полученным ключом 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 в режиме реального времени.
Настройте автоматический запуск скрипта Python при загрузке системы. Для этого откройте файл /etc/rc.local:
sudo nano /etc/rc.local
Добавьте команду запуска скрипта перед строкой выхода 0:
sudo python /home/pi/cpu.py &
Внимание
Наличие символа & в конце команды является обязательным, поскольку это флаг для запуска процесса в фоновом режиме.
После перезагрузки скрипт запустится автоматически, и вентилятор будет включаться при выполнении заданных условий.