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프로그램 종료.")