Использование АЦП MCP3008 для чтения аналоговых датчиков с Raspberry Pi
Подключение аналоговых датчиков к Raspberry Pi может быть сложным, потому что GPIO-выводы Pi только цифровые. Недорогое решение — MCP3008, 8-канальный 10-битный аналого-цифровой преобразователь, который втыкается прямо в SPI-шину Pi и не требует дополнительных компонентов.
В этом руководстве мы пройдем через подключение MCP3008 к Raspberry Pi, подключение фоторезистора (LDR) и датчика температуры TMP36, и чтение данных простым Python-скриптом.
Что понадобится
- Raspberry Pi (любая модель с GPIO-хедером)
- MCP3008 8-канальный АЦП
- Фоторезистор (LDR) — например, NORPS-12
- Датчик температуры TMP36
- Резистор 10 кОм (для схемы LDR)
Включение SPI на Pi
SPI-интерфейс отключен по умолчанию. Следуйте шагам в Включение SPI-интерфейса на Raspberry Pi для активации SPI и установки Python-библиотеки spidev.
Соединения схемы
MCP3008 требует четыре GPIO-вывода на 40-пиновом заголовке Pi. Подключите следующие пины (номера относятся к нумерации заголовка P1):
VDD 3.3V VREF 3.3V AGND GROUND CLK GPIO11 (P1-23) DOUT GPIO9 (P1-21) DIN GPIO10 (P1-19) CS GPIO8 (P1-24) DGND GROUND
Каждый из выводов CH0–CH7 на MCP3008 становится аналоговым входом. В примере ниже используем CH0 для LDR и CH1 для TMP36; оставшиеся шесть каналов свободны для будущих датчиков.
Фоторезистор (LDR)
Сопротивление LDR падает до ~10 кОм при ярком свете и поднимается до нескольких мегаом в темноте. Образуя делитель напряжения с резистором 10 кОм, MCP3008 считывает напряжение, падающее к 0 В при освещении и поднимающееся к 3,3 В в темноте.
Датчик температуры TMP36
TMP36 — 3-пиновый аналоговый датчик температуры. Питание 3,3 В, чтение с вывода VOUT. Датчик выдает 0,750 В при 25 °C, с линейным наклоном 10 мВ/°C. Таким образом, 0 °C дает 0,500 В, 100 °C — 1,500 В.
Чтение данных с Python
MCP3008 выдает 10-битные значения 0–1023, линейно отображенные на 0–3,3 В. Для TMP36 это соответствует диапазону примерно –50 °C до +280 °C.
Ниже минимальный пример с библиотекой spidev для чтения каналов 0 и 1:
import spidev
import time
spi = spidev.SpiDev()
spi.open(0, 0) # bus 0, device 0
spi.max_speed_hz = 1350000
def read_channel(channel):
# Протокол MCP3008: стартовый бит, single/diff, канал (3 бита), 5 dummy битов
adc = spi.xfer2([1, (8 + channel) & 0x0F << 4, 0])
data = ((adc[1] & 3) << 8) + adc[2]
return data
while True:
ldr_val = read_channel(0)
temp_val = read_channel(1)
temp_c = (temp_val * 3.3 / 1023) * 100 - 50 # Конвертация в °C
print(f'LDR: {ldr_val}, Temp: {temp_c:.2f}°C')
time.sleep(1)
Замените номера каналов под вашу схему датчиков. Скрипт непрерывно печатает сырое значение АЦП для LDR и расчетную температуру в градусах Цельсия.
С этой установкой можно добавить дополнительные аналоговые датчики — фотодиоды, датчики давления, влажности — подключив их к оставшимся CH2–CH7 и расширив Python-код соответственно.
Удачного хакинга!
Производственный процесс
- Сборка логгера температуры на Raspberry Pi с $5 I2C датчиком
- Точный температурный профиль Raspberry Pi с Python, SQLite и LabVIEW
- Подключение нескольких DS18B20 1-Wire датчиков к Raspberry Pi для точного мониторинга температуры
- Как считывать температуру с DS18B20 на Raspberry Pi 2
- Профессиональный мониторинг температуры на Raspberry Pi с датчиком DS18B20
- Измерение температуры на Raspberry Pi с датчиками Maxim 1-Wire и мостом DS2482 I2C
- ИК-датчик температуры TMP006 с Raspberry Pi: библиотека Python и руководство по настройке
- Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
- Точный мониторинг температуры в серверной на Raspberry Pi
- Удалённый мониторинг погоды на Raspberry Pi 3 с PubNub