CS/라즈베리파이

라즈베리 파이 - 12. 블루투스 LE(Low Energy) 스마트 조명제어

erase-jeong 2023. 12. 10. 13:52

목표 : 블루투스를 이용하여 LED를 제어해 스마트 조명을 만들어본다.

 

1. 필요 부품

 

2. 회로도

 

 

3. 블루투스 설정하기

 

 

4. 전체 코드

 

 
import serial
import RPi.GPIO as GPIO

bleSerial=serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1.0)

greenLed=16  #녹색 LED 연결 핀 번호
blueLed=20   #파란색 LED 연결 핀 번호
redLed=21    #빨간색 LED 연결 핀 번호

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(greenLed, GPIO.OUT) #녹색 LED 핀을 출력 핀으로 설정
GPIO.setup(blueLed,GPIO.OUT)   #파란색 LED 핀을 출력 핀으로 설정
GPIO.setup(redLed,GPIO.OUT)    #빨간색 LED 핀을 출력 핀으로 설정

try:
    while True: #코드를 계속 반복 실행
        data=bleSerial.readline() #BLE 모듈에서 데이터 수신
        data=data.decode() #수신된 데이터 디코딩

        #if문으로 수신된 데이터에 따라 LED 제어

        #녹색 LED 켜기
        if data.fine("green_on")>=0:  
            print(" ok green on ")
            GPIO.output(greenLed, 1)

        #녹색 LED 끄기
        elif data.find(" green_off")>=0:
            print(" ok green off ")
            GPIO.output(greenLed,0)

        #파란색 LED 켜기
        elif data.find("blue_on")>=0:
            print(" ok blue on ")
            GPIO.output(blueLed,1)

        #파란색 LED 끄기
        elif data.find("blue_off")>=0:
            print(" ok blue off")
            GPIO.output(blueLed,0)
       
        #빨간색 LED 켜기
        elif data.find("red_on")>=0:
            print(" ok red on ")
            GPIO.output(redLed,1)

        #빨간색 LED 끄기
        elif data.find("red_off")>=0:
            print(" ok red off ")
            GPIO.output(redLed, 0)

except KeyboardInterrupt: #키보드 인터럽트
    #키보드 인터럽트 발생 시 코드 중단
    pass

bleSerial.close()
import serial
import RPi.GPIO as GPIO

bleSerial=serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1.0)

greenLed=16
blueLed=20
redLed=21

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(greenLed, GPIO.OUT)
GPIO.setup(blueLed,GPIO.OUT)
GPIO.setup(redLed,GPIO.OUT)

try:
    while True:
        data=bleSerial.readline()
        data=data.decode()

        if data.fine("green_on")>=0:
            print(" ok green on ")
            GPIO.output(greenLed, 1)

        elif data.find(" green_off")>=0:
            print(" ok green off ")
            GPIO.output(greenLed,0)

        elif data.find("blue_on")>=0:
            print(" ok blue on ")
            GPIO.output(blueLed,1)

        elif data.find("blue_off")>=0:
            print(" ok blue off")
            GPIO.output(blueLed,0)
        
        elif data.find("red_on")>=0:
            print(" ok red on ")
            GPIO.output(redLed,1)

        elif data.find("red_off")>=0:
            print(" ok red off ")
            GPIO.output(redLed, 0)

except KeyboardInterrupt:
    pass

bleSerial.close()

 

 

5. 코드해석

 

1) 라이브러리 import:

import serial  
import RPi.GPIO as GPIO
import serial  //시리얼 통신을 위한 라이브러리
import RPi.GPIO as GPIO //라즈베리파이 GPIO 핀을 제어하기 위한 라이브러리

 

 

2) BLE 시리얼 연결

bleSerial=serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1.0

- BLE 모듈과 시리얼 통신 연결 설정

  • /dev/ttyS0: 시리얼 포트 이름
  • baudrate=9600: 통신 속도
  • timeout=1.0: 읽기 타임아웃 시간

 

3) LED 핀 설정

 
 
greenLed=16  #녹색 LED 연결 핀 번호
blueLed=20   #파란색 LED 연결 핀 번호
redLed=21    #빨간색 LED 연결 핀 번호
 

 

 
GPIO.setwarnings(False)
 

- 경고 메시지 숨기기

 

 
GPIO.setmode(GPIO.BCM)
 

- BCM 모드 사용

 

 
GPIO.setup(greenLed, GPIO.OUT) #녹색 LED 핀을 출력 핀으로 설정
GPIO.setup(blueLed,GPIO.OUT)   #파란색 LED 핀을 출력 핀으로 설정
GPIO.setup(redLed,GPIO.OUT)    #빨간색 LED 핀을 출력 핀으로 설정
 

 

 

4) try - catch 문

 

 
try:
    while True: #코드를 계속 반복 실행
        data=bleSerial.readline() #BLE 모듈에서 데이터 수신
        data=data.decode() #수신된 데이터 디코딩

        #if문으로 수신된 데이터에 따라 LED 제어

        #녹색 LED 켜기
        if data.fine("green_on")>=0:  
            print(" ok green on ")
            GPIO.output(greenLed, 1)

        #녹색 LED 끄기
        elif data.find(" green_off")>=0:
            print(" ok green off ")
            GPIO.output(greenLed,0)

        #파란색 LED 켜기
        elif data.find("blue_on")>=0:
            print(" ok blue on ")
            GPIO.output(blueLed,1)

        #파란색 LED 끄기
        elif data.find("blue_off")>=0:
            print(" ok blue off")
            GPIO.output(blueLed,0)
       
        #빨간색 LED 켜기
        elif data.find("red_on")>=0:
            print(" ok red on ")
            GPIO.output(redLed,1)

        #빨간색 LED 끄기
        elif data.find("red_off")>=0:
            print(" ok red off ")
            GPIO.output(redLed, 0)

except KeyboardInterrupt: #키보드 인터럽트
    #키보드 인터럽트 발생 시 코드 중단
    pass
 

 

5) 정리


bleSerial.close()
bleSerial.close(): 시리얼 통신 종료

- 시리얼 통신 종료

 

 

6. 코드 기능

  • BLE 모듈로부터 데이터를 수신하여 LED를 켜거나 끕니다.
  • BLE 모듈은 앱이나 다른 장치를 통해 제어할 수 있습니다.

 

7. 참고

  • 이 코드는 BCM 모드를 사용하여 Raspberry Pi 핀을 지정합니다.
  • BLE 모듈의 연결 정보 (예: 포트 이름, 통신 속도)는 사용하는 모듈에 따라 다를 수 있습니다.
  • BLE 모듈로 전송할 데이터는 BLE 모듈의 특성에 따라 달라질 수 있습니다.