PCF8591 A/D 컨버터 모듈 소스
This commit is contained in:
westnife3 2025-08-27 17:21:18 +09:00
parent 35ed226edc
commit e28181dfd0
3 changed files with 69 additions and 1 deletions

24
requirements.txt Normal file
View File

@ -0,0 +1,24 @@
Adafruit-Blinka==8.62.0
adafruit-circuitpython-busdevice==5.2.13
adafruit-circuitpython-connectionmanager==3.1.5
adafruit-circuitpython-dht==4.0.9
adafruit-circuitpython-framebuf==1.6.9
adafruit-circuitpython-requests==4.1.13
adafruit-circuitpython-ssd1306==2.12.21
adafruit-circuitpython-typing==1.12.1
Adafruit-PlatformDetect==3.81.0
Adafruit-PureIO==1.1.11
binho-host-adapter==0.1.6
cbor2==5.6.5
luma.core==2.5.1
luma.oled==3.14.0
pillow==11.3.0
pyftdi==0.56.0
pyserial==3.5
pyusb==1.3.1
RPi.GPIO==0.7.1
rpi_ws281x==5.0.0
smbus==1.1.post2
smbus2==0.5.0
sysv_ipc==1.1.0
typing_extensions==4.14.1

View File

@ -35,4 +35,3 @@ while True:
raise error
time.sleep(2.0) # 2초마다 센서 값을 읽습니다.

View File

@ -0,0 +1,45 @@
import smbus
import time
# PCF8591의 I2C 주소 (i2cdetect -y 1 명령으로 확인 가능)
# 대부분의 PCF8591 모듈은 0x48을 기본 주소로 사용합니다.
PCF8591_ADDRESS = 0x48
# I2C 버스 번호 (라즈베리 파이 2, 3, 4는 1, 초기 모델은 0일 수 있음)
I2C_BUS = 1
# smbus 객체 생성
bus = smbus.SMBus(I2C_BUS)
# PCF8591 제어 바이트 (CONTROLL_BYTE) 설정
# 비트 7: 1 (DAC 활성화 - 여기서는 사용 안 함)
# 비트 6: 0 (AIN 활성화 - 여기서는 사용 안 함)
# 비트 5: 0 (AIN0 활성화 - 여기서는 사용 안 함)
# 비트 4: 0 (AIN1 활성화 - 여기서는 사용 안 함)
# 비트 3-2: AIN 입력 모드 (00: 4단일 입력, 01: 차동 입력, 10: 2차동 입력)
# 여기서는 4개의 단일 입력 모드 (AIN0-AIN3)를 사용합니다.
# 비트 1-0: 사용할 아날로그 입력 채널 선택 (00: AIN0, 01: AIN1, 10: AIN2, 11: AIN3)
# 따라서 AIN0을 읽으려면 0x40 (1000000) 또는 0x00 (00000000)과 같이 설정할 수 있습니다.
# 일반적으로 0x40은 4채널 단일 입력 모드에서 AIN0을 나타냅니다.
# 하지만 라이브러리에서 채널 번호를 직접 지정하기 때문에 간단하게 0x40으로 설정합니다.
# 0x40 = 0100 0000b (단일 입력 모드 설정)
CONTROL_BYTE = 0x40
print(f"PCF8591 A/D 컨버터 테스트 시작 (주소: 0x{PCF8591_ADDRESS:X})")
print("로터리 엔코더를 돌려 값을 확인하세요. Ctrl+C로 종료.")
try:
while True:
# PCF8591에서 AIN0 채널의 값을 읽습니다.
# read_byte_data(주소, 제어_바이트 + 채널_번호)
# 제어 바이트에 채널 번호를 더하여 특정 채널을 선택합니다.
# 예를 들어 AIN0은 채널 0이므로 CONTROL_BYTE + 0 입니다.
analog_value = bus.read_byte_data(PCF8591_ADDRESS, CONTROL_BYTE + 0)
# 읽은 아날로그 값 (0-255) 출력
print(f"아날로그 값 (AIN0): {analog_value}")
time.sleep(0.1) # 0.1초마다 값 읽기
except KeyboardInterrupt:
print("\n프로그램 종료.")