사용 회로와 목표
사용 회로:
[그림6-9]와 같이 멀티원 실드를 옥토보드의 내부 핀 영역에 장착합니다.
대체 회로:
[그림7-11]과 같이 브레드보드에 C3 mini와 부품들로 회로를 구성합니다. 또는 옥토보드의 외부 핀 영역에 C3 mini와 멀티원 실드을 장착해도 됩니다.
목표:
버튼1을 누르면 두 LED 를 on하고, 버튼2를 누르면 두 LED를 off합니다.
LED를 on할 때는 퍼텐쇼미터의 값에 따라 밝기를 정합니다.
LED에 불이 켜져 있을 때는 퍼텐쇼미터의 노브를 돌려서 밝기를 조절합니다.
AI 프롬프트 7-4:
코드 영역으로 마우스를 옮기고 Copy 버튼을 누르면 클립보드에 코드가 복사됩니다.마이크로파이썬 프로그램을 다음 조건에 따라 만들고, 코드를 설명해줘 [조건] from machine import … import time time.sleep_ms()를 사용 두 개의 LED와 두개의 버튼을 사용 모듈 pinno에는 핀 번호 상수 값이 저장되어 있음 import pinno POTENTIOMETER_PIN = pinno.L2_IN BUTTON_1_PIN = pinno.L3_IN BUTTON_2_PIN = pinno.L4_IN LED_1_PIN = pinno.L5_IN LED_2_PIN = pinno.L6_IN POTENTIOMETER에 대하여: 매서드 atten(): 3.3V까지 읽도록 지정 매서드 width(): 해상도 12비트 potentiometer_percent = (POTENTIOMETER 읽은 값 / 4095 * 100)의 정수 첫번 째 버튼은 PULL_UP해야 하고 두 번째 버튼은 PULL_DOWN해야 함 BUTTON1_PRESSED_VALUE = 0 BUTTON2_PRESSED_VALUE = 1 첫 번째 LED는 전류 소싱 방식으로 연결되어 있고 두 번째 LED는 전류 싱킹 방식으로 연결되어 있음. led1_on_percent = potentiometer_percent % led1_off_percent = 0 % led2_on_percent = (100 - potentiometer_percent) % led2_off_percent = 100 % LED를 on할 때는 PWM을 ledx_on_percent에 따름 LED를 off할 때는 PWM을 ledx_off_percent에 따름 PWM에 대하여: 메서드 duty()를 사용함 매서드 freq(): 1000 led_on_off_state = False prev_potentiometer = 0 프로그램 시작하면: Print(“버튼1을 누르면 on(), 버튼2를 누르면 off()”) Print(“불이 켜지면 너브를 돌려서 밝기를 조절하셔요”) 두 LED를 off 다음은 연속 실행이야: current_potentiometer와 prev_potentiometer의 차이가 1% 이상이면: prev_potentiometer = current_potentiometer led_on_off_state = True이면: 두 LED를 켬(PWM: ledx_on_percent) print("밝기 조절: {led1_on_percent}%") current_버튼_상태 != prev_버튼_상태: 디바운스 20ms 버튼1이 PRESSED이면: 두 LED를 on print("on(): {led1_on_percent}%") 버튼2가 PRESSED이면:: 두 LED를 off print("off()") 모드 while loop에 대하여: prev_버튼_상태 = current_버튼_상태 1ms 중지
마이크로파이썬 코드:
다음은 설명된 조건에 맞는 마이크로파이썬 프로그램입니다.
코드 영역으로 마우스를 옮기고 Copy 버튼을 누르면 클립보드에 코드가 복사됩니다.from machine import Pin, ADC, PWM import time import pinno # 핀 설정 POTENTIOMETER_PIN = pinno.L2_IN BUTTON_1_PIN = pinno.L3_IN BUTTON_2_PIN = pinno.L4_IN LED_1_PIN = pinno.L5_IN LED_2_PIN = pinno.L6_IN # 상수 설정 BUTTON1_PRESSED_VALUE = 0 BUTTON2_PRESSED_VALUE = 1 PWM_FREQ = 1000 # 핀 객체 설정 potentiometer = ADC(Pin(POTENTIOMETER_PIN)) potentiometer.atten(ADC.ATTN_11DB) # 3.3V까지 읽을 수 있도록 설정 potentiometer.width(ADC.WIDTH_12BIT) # 12비트 해상도 설정 button1 = Pin(BUTTON_1_PIN, Pin.IN, Pin.PULL_UP) button2 = Pin(BUTTON_2_PIN, Pin.IN, Pin.PULL_DOWN) led1 = PWM(Pin(LED_1_PIN)) led2 = PWM(Pin(LED_2_PIN)) # 초기 설정 led1.freq(PWM_FREQ) led2.freq(PWM_FREQ) led_on_off_state = False prev_potentiometer = 0 prev_button1_state = button1.value() prev_button2_state = button2.value() # 초기 메시지 출력 print("버튼1을 누르면 on(), 버튼2를 누르면 off()") print("불이 켜지면 너브를 돌려서 밝기를 조절하셔요") # 두 LED를 끔 led1.duty(0) led2.duty(1023) while True: # 현재 포텐셔미터 값을 읽음 current_potentiometer = potentiometer.read() potentiometer_percent = int(current_potentiometer / 4095 * 100) # 포텐셔미터 값이 1% 이상 변했는지 확인 if abs(current_potentiometer - prev_potentiometer) > (4095 * 0.01): prev_potentiometer = current_potentiometer # LED가 켜져 있을 때 밝기 조절 if led_on_off_state: led1_on_percent = potentiometer_percent led2_on_percent = 100 - potentiometer_percent led1.duty(int(led1_on_percent / 100 * 1023)) led2.duty(int(led2_on_percent / 100 * 1023)) print(f"밝기 조절: {led1_on_percent}%") # 버튼 상태 확인 current_button1_state = button1.value() current_button2_state = button2.value() # 버튼 상태가 변경되었는지 확인 (디바운스 적용) if current_button1_state != prev_button1_state or current_button2_state != prev_button2_state: time.sleep_ms(20) # 디바운스 시간 # 버튼 1이 눌렸을 때 if button1.value() == BUTTON1_PRESSED_VALUE: led_on_off_state = True led1.duty(int(potentiometer_percent / 100 * 1023)) led2.duty(int((100 - potentiometer_percent) / 100 * 1023)) print(f"on(): {potentiometer_percent}%") # 버튼 2가 눌렸을 때 if button2.value() == BUTTON2_PRESSED_VALUE: led_on_off_state = False led1.duty(0) led2.duty(1023) print("off()") # 이전 버튼 상태 업데이트 prev_button1_state = current_button1_state prev_button2_state = current_button2_state # 1ms 중지 time.sleep_ms(1)
코드 설명:
- 핀이 정의되었습니다. 포텐셔미터는
ADC
를 사용하고, LED는PWM
으로 제어됩니다. - 포텐셔미터의 설정에서
atten()
은 3.3V까지 읽기 위해 설정되었고,width()
는 12비트 해상도로 값을 읽기 위해 설정되었습니다. - 버튼 1은
PULL_UP
, 버튼 2는PULL_DOWN
으로 설정되어 버튼을 누른 상태를 감지합니다. - 프로그램은 초기 메시지를 출력하고, 두 LED를 끈 상태에서 시작합니다.
- while 루프에서는:
- 포텐셔미터의 값이 1% 이상 변동할 때만 LED의 밝기가 조절됩니다.
- 버튼이 눌리면, LED가 켜지거나 꺼지며, 그 상태에 따라 밝기를 조절하거나 LED를 끕니다.
- 버튼 상태 변화 시 20ms의 디바운스를 적용합니다.
- PWM 제어는
duty()
를 통해 이루어지며,potentiometer_percent
에 따라 LED 밝기를 조절합니다.
이 프로그램은 두 버튼과 포텐셔미터를 활용해 LED의 상태와 밝기를 조절하는 시스템입니다.