Иван Иванов   12 ноября в 14:54

Интеллектуальное управление вентилятором 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 включают сбор данных в реальном времени, обработку данных и визуализацию. ThingSpeak API не только позволяет отправлять, хранить и получать доступ к данным, но также предоставляет различные статистические методы для их обработки.

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

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

  • Arduino
  • Raspberry Pi
  • ioBridge / RealTime.io
  • Мобильные и веб-приложения
  • Социальные сети
  • Анализ данных в MATLAB

Но, прежде чем мы начнем, нам нужна учетная запись на ThingSpeak:

  1. Перейдите по этой ссылке и зарегистрируйтесь в ThingSpeak.
  2. После активации учетной записи войдите в систему.
  3. Перейдите в: Каналы -> Мои каналы (англ. 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 &
Внимание! Наличие символа & в конце команды является обязательным, поскольку это флаг для запуска процесса в фоновом режиме.

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