01 |
Содержание:
|
|
02 | На заметку: |
У данной статьи есть видеоверсия!
Подписывайтесь на канал
, чтобы быть в курсе обновлений! |
|
05 |
Но поскольку, по умолчанию, вентилятор напрямую подключается к гребенке GPIO — это подразумевает постоянную его работу. Несмотря на относительную бесшумность работы вентилятора, его постоянная работа не является эффективным использованием активной системы охлаждения. В то же время, постоянное шуршание вентилятора может просто раздражать. |
Проверено — автор рекомендует: Купить Корпус для Raspberry Pi 3 Model B с активным охлаждением (4 цвета) |
06 |
Дискомфорта доставляет и тот факт, что даже если Raspberry Pi 3 выключен, при подключенном питании вентилятор все равно будет работать. Да и в конце концов, почему бы просто не сэкономить немного электроэнергии? |
|
07 |
В данной статье будет показано, как при помощи нехитрых и не сложных манипуляций превратить существующую систему охлаждения в умную, которая будет включаться только тогда, когда процессору это действительно необходимо. |
|
08 |
Вся модификация состоит из 2 частей — аппаратной и программной. |
|
09 |
Аппаратная часть Заключается во внедрении в схему подключения вентилятора обычного транзистора, при помощи которого управляющий пин GPIO будет управлять включением вентилятора. Подойдет любой транзистор с подходящими характеристиками:
|
|
10 |
В данном примере используется NPN-транзистор 2N5551. Схема подключения следующая: |
Проверено — автор рекомендует: Купить Транзистор 2N5551 (NPN, TO-92)Видео-инструкция о покупке со скидками на Aliexpress |
12 |
Наглядная схема: |
|
14 | На заметку: |
Токоограничивающий резистор нужен для устранения нагрузки с пина GPIO, максимальный ток которого не должен превышать 16 мА.
|
|
15 |
Программная часть Работа скрипта основана на ежесекундном запросе температуры процессора. Из терминала подобную информацию можно получить выполнив команду vcgencmd с параметром measure_temp: |
|
16 |
1 vcgencmd measure_temp |
|
18 |
Логика скрипта такова — при достижении заданной температуры (более 60°С) вентилятор включается, и отключается только когда температура снизится более чем на 10°С от максимального порога (менее 50°С). |
|
19 | Python |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 #!/usr/bin/python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO # Импортируем библиотеку по работе с GPIO
import sys, traceback # Импортируем библиотеки для обработки исключений
from time import sleep # Импортируем библиотеку для работы со временем
from re import findall # Импортируем библиотеку по работе с регулярными выражениями
from subprocess import check_output # Импортируем библиотеку по работе с внешними процессами
def get_temp():
temp = check_output(["vcgencmd","measure_temp"]).decode() # Выполняем запрос температуры
temp = float(findall('\d+\.\d+', temp)[0]) # Извлекаем при помощи регулярного выражения значение температуры из строки "temp=47.8'C"
return(temp) # Возвращаем результат
try:
tempOn = 60 # Температура включения кулера
controlPin = 14 # Пин отвечающий за управление
pinState = False # Актуальное состояние кулера
# === Инициализация пинов ===
GPIO.setmode(GPIO.BCM) # Режим нумерации в BCM
GPIO.setup(controlPin, GPIO.OUT, initial=0) # Управляющий пин в режим OUTPUT
while True: # Бесконечный цикл запроса температуры
temp = get_temp() # Получаем значение температуры
if temp > tempOn and not pinState or temp < tempOn - 10 and pinState:
pinState = not pinState # Меняем статус состояния
GPIO.output(controlPin, pinState) # Задаем новый статус пину управления
print(str(temp) + " " + str(pinState)) # Выводим температуру в консоль
sleep(1) # Пауза - 1 секунда
except KeyboardInterrupt:
# ...
print("Exit pressed Ctrl+C") # Выход из программы по нажатию Ctrl+C
except:
# ...
print("Other Exception") # Прочие исключения
print("--- Start Exception Data:")
traceback.print_exc(limit=2, file=sys.stdout) # Подробности исключения через traceback
print("--- End Exception Data:")
finally:
print("CleanUp") # Информируем о сбросе пинов
GPIO.cleanup() # Возвращаем пины в исходное состояние
print("End of program") # Информируем о завершении работы программы |
|
20 |
Как поместить Python-скрипт в автозагрузку Остается сделать так, чтобы скрипт, контролирующий работу вентилятора охлаждения, автоматически запускался каждый раз при загрузке системы. |
|
21 |
Для этого, в конец файла /etc/rc.local: |
|
22 |
1 sudo nano /etc/rc.local |
|
23 |
Нужно поместить команду запуска скрипта перед строкой exit 0: |
|
24 |
1 sudo python /home/pi/temp_control.py & |
|
25 | На заметку: |
Наличие символа & в конце команды обязательно, так как он является флагом запуска процесса в фоновом режиме. Если по каким-то причинам забыть его указать, то после перезагрузки загрузка системы завершится черным экраном. В этом случае, необходимо переключиться в консоль Ctrl+Alt+F1, остановить исполнение скрипта Ctrl+C. И далее отредактировать команду автозапуска так, как указано выше.
|
|
26 |
После перезагрузки скрипт будет автоматически запущен и вентилятор будет включаться при наступлении заданных условий. |
|
27 |
Чтобы проверить факт запуска, после перезагрузки, нужно переключиться в консоль Ctrl+Alt+F1, и убедиться, что данные об актуальной температуре поступают, после этого вернуться в оконный интерфейс можно комбинацией клавиш Ctrl+Alt+F7. |
|
28 |
Как проверить? Для проверки работоспособности скрипта нужно «разогреть» процессор до нужной температуры и посмотреть, как на это будет реагировать система охлаждения. |
|
29 |
«Нагревать» процессор будет утилита sysbench, которую предварительно нужно установить: |
|
30 |
1 sudo apt-get install sysbench |
|
31 |
Запуск утилиты с задействованием 4 ядер: |
|
32 |
1 sysbench --num-threads=4 --test=cpu --cpu-max-prime=20000 --validate run |
|
33 |
Температура процессора сразу начнет повышаться. |
|
34 |
Контроль температуры будет осуществляться упрощенным вариантом скрипта управления на Python: |
|
35 | Python |
1 2 3 4 5 6 7 8 9 10 11 12 13 import os # Импортируем библиотеку по работе с ОС
from time import sleep # Импортируем библиотеку для работы со временем
from re import findall # Импортируем библиотеку по работе с регулярными выражениями
def get_temp():
temp = os.popen("vcgencmd measure_temp").readline() # Выполняем запрос температуры
temp = float(findall('\d+\.\d+', temp)[0]) # Извлекаем при помощи RE значение температуры из строки "temp=47.8'C"
return(temp) # Возвращаем результат
while True: # Бесконечный цикл запроса температуры
temp = get_temp() # Получаем значение температуры
print(temp) # Выводим температуру в консоль
sleep(1) # Ждем 1 секунду |
|
37 |
Принудительно завершить, как выполнение теста утилитой sysbench, так и Python-скрипта можно сочетанием клавиш Ctrl+C. |
|
38 |
Удаление скрипта из автозагрузки Для удаления скрипта из автозагрузки нужно просто удалить строку с запуском скрипта из файла /etc/rc.local. |
|
39 |
Похожие запросы:
|
|