Скрипт 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 Ом, что дает нам базовый ток около:
Я выбрал NPN-транзистор S8050, поэтому переключение нагрузки 400 мА с обоих вентиляторов не является проблемой.
Выполните все соединения, как показано на схеме выше. В итоге мы должны получить вот такой примерный вариант:
Шаг 4. Создаем логи температуры процессора с помощью ThingSpeak
ThingSpeak - это платформа для проектов, основанных на концепции "интернета вещей". Платформа позволяет создавать приложения на основе данных, собранных с датчиков.
Основные функции ThingSpeak включают сбор данных в реальном времени, обработку данных и визуализацию. ThingSpeak API не только позволяет отправлять, хранить и получать доступ к данным, но также предоставляет различные статистические методы для их обработки.
Зарегистрироваться на сайте можно по этой ссылке.
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 &
После перезагрузки скрипт автоматически запустится, а вентилятор включится, когда указанные условия будут выполнены.
9 мая 2020 в 00:49
Иван, здравствуйте.
Есть пару вопросов по получению температуры
Можно ли с Вами связаться в ВКонтакте ?