본문 바로가기
✒️ Embedded System & Computing Platform/Raspberry Pi

[Raspberry Pi] AWS S3 Bucket 에서 가져온 Contents 값으로 LED 제어하기

by A Lim Han 2023. 9. 18.

🎇 AWS S3 Bucket 에서 가져온 Contents 값으로의 LED 제어

1.  AWS S3 Bucket 으로의 접근을 위한 초기 설정

++  Boto3 SDK 설정

-->  https://alim11.tistory.com/398

 

[Data Processing] Boto3 SDK를 활용한 데이터 업로드 자동화 (Forward AWS S3 Bucket)

🌸 Boto3 SDK를 활용한 데이터 업로드 자동화 (Forward AWS S3 Bucket) 1. pip 명령어를 이용하여 boto3 설치 !pip install boto3 ++ boto3 란? boto3는 Amazon Web Services (AWS)와 상호작용하기 위한 오픈 소스 라이브러리

alim11.tistory.com


++  AWS 계정 및 리전 설정

-->  https://alim11.tistory.com/423

 

[AWS] AWS S3 Bucket 속 파일 Contents 읽어오기

🍳 AWS S3 Bucket 속 파일 Contents를 읽어오기 위한 Python Script 1. pip 명령어를 통해 Boto3 다운로드 !pip install boto3 ++ Boto3 가 무엇인지 궁금하다면? --> https://alim11.tistory.com/398 [Data Processing] Boto3 SDK를 활용

alim11.tistory.com

2.  AWS 접근 준비 완료 후 GPIO 설정 초기화를 위한 코드 작성

# GPIO 설정 초기화
GPIO.setmode(GPIO.BCM)
GPIO.setup(20, GPIO.OUT)  # 핀 20에 연결된 LED
GPIO.setup(21, GPIO.OUT)  # 핀 21에 연결된 LED

p20 = GPIO.PWM(20, 50)  # 핀 20용 PWM 객체 생성
p21 = GPIO.PWM(21, 50)  # 핀 21용 PWM 객체 생성

3.  상황별 LED 정밀 제어를 위한 코드 작성

# 선택한 LED를 켜기 전에 두 LED를 끕니다.
p20.stop()
p21.stop()

try:
ㅤㅤ# 파일 내용을 한 번 읽기
ㅤㅤresponse = s3.get_object(Bucket=bucket_name, Key=file_key)
ㅤㅤcontent = response['Body'].read().decode('utf-8')
ㅤㅤvalue = int(content.strip())
    
ㅤㅤ# 읽은 값에 따라 처리
ㅤㅤif value == 0:
ㅤㅤㅤㅤprint("파일 내용:", content)
ㅤㅤㅤㅤprint("양호")
ㅤㅤㅤㅤp20.start(0)
ㅤㅤㅤㅤfor _ in range(5):  # 루프를 5번 반복
ㅤㅤㅤㅤㅤㅤfor dc in range(0, 101, 5):
ㅤㅤㅤㅤㅤㅤㅤㅤㅤp20.ChangeDutyCycle(dc)
ㅤㅤㅤㅤㅤㅤㅤㅤㅤtime.sleep(0.05)
ㅤㅤㅤㅤㅤㅤfor dc in range(100, -1, -5):
ㅤㅤㅤㅤㅤㅤㅤㅤㅤp20.ChangeDutyCycle(dc)
ㅤㅤㅤㅤㅤㅤㅤㅤㅤtime.sleep(0.05)
ㅤㅤㅤㅤp20.stop()  # 5회 반복 후 LED를 끔
ㅤㅤelif value == 1:
ㅤㅤㅤㅤprint("파일 내용:", content)
ㅤㅤㅤㅤprint("경고")
ㅤㅤㅤㅤp21.start(0)
ㅤㅤㅤㅤfor _ in range(5):  # 루프를 5번 반복
ㅤㅤㅤㅤㅤㅤfor dc in range(0, 101, 5):
ㅤㅤㅤㅤㅤㅤㅤㅤㅤp21.ChangeDutyCycle(dc)
ㅤㅤㅤㅤㅤㅤㅤㅤㅤtime.sleep(0.05)
ㅤㅤㅤㅤㅤㅤfor dc in range(100, -1, -5):
ㅤㅤㅤㅤㅤㅤㅤㅤㅤp21.ChangeDutyCycle(dc)
ㅤㅤㅤㅤㅤㅤㅤㅤㅤtime.sleep(0.05)
ㅤㅤㅤㅤㅤㅤㅤㅤㅤp21.stop()  # 5회 반복 후 LED를 끔
ㅤㅤelse:
ㅤㅤㅤㅤprint("잘못된 값")
            
except Exception as e:
ㅤprint("파일 읽기 오류:", e)

except KeyboardInterrupt:
ㅤpass

 

++  코드 설명 상세

코드 설명
p20.stop()
p21.stop()
코드가 실행되기 전 stop() 메서드를 호출하여
GPIO 핀 p20와 p21에 연결된 LED를 끄는 코드
response = s3.get_object
(Bucket=bucket_name, Key=file_key)
AWS S3 버킷에서 지정된 키(file_key)에
있는 객체를 가져오는 코드
content = response['Body']
.read().decode('utf-8')
S3에서 읽은 파일의 내용을UTF-8 인코딩을
사용하여 문자열로 읽어오는 코드
value = int(content.strip()) 파일 내용이 문자열 형태일 것으로 가정하고,
.strip() 메서드를 사용하여 양 끝의
공백 문자를 제거한 후 정수로 변환하는 코드

  읽어온 파일 내용이 0일 경우

for _ in range(5):  # 루프를 5번 반복
ㅤㅤㅤㅤㅤㅤfor dc in range(0, 101, 5):
ㅤㅤㅤㅤㅤㅤㅤㅤㅤp20.ChangeDutyCycle(dc)
ㅤㅤㅤㅤㅤㅤㅤㅤㅤtime.sleep(0.05)
ㅤㅤㅤㅤㅤㅤfor dc in range(100, -1, -5):
ㅤㅤㅤㅤㅤㅤㅤㅤㅤp20.ChangeDutyCycle(dc)
ㅤㅤㅤㅤㅤㅤㅤㅤㅤtime.sleep(0.05)
ㅤㅤㅤㅤp20.stop()  # 5회 반복 후 LED를 끔

 

코드 설명
for _ in range(5): 하단의 루프를 총 5번 반복
for dc in range(0, 101, 5): LED 밝기(= dc)를 0부터 100까지 5씩 증가
p20.ChangeDutyCycle(dc) hangeDutyCycle() 메서드를 사용하여
PWM (Pulse Width Modulation)을 통해
GPIO p20 핀에 연결된 녹색 LED 밝기 변경
time.sleep(0.05) LED의 밝기가 변경된 후 0.05초 동안 대기
for dc in range(100, -1, -5): LED의 밝기를 100부터 0까지 5씩 감소시키며 반복
p20.stop() stop() 메서드를 호출하여 LED를 끔

  읽어온 파일 내용이 1일 경우

코드 설명
for _ in range(5): 하단의 루프를 총 5번 반복
for dc in range(0, 101, 5): LED 밝기(= dc)를 0부터 100까지 5씩 증가
p21.ChangeDutyCycle(dc) hangeDutyCycle() 메서드를 사용하여
PWM (Pulse Width Modulation)을 통해
GPIO p21 핀에 연결된 적색 LED 밝기 변경
time.sleep(0.05) LED의 밝기가 변경된 후 0.05초 동안 대기
for dc in range(100, -1, -5): LED의 밝기를 100부터 0까지 5씩 감소시키며 반복
p21.stop() stop() 메서드를 호출하여 LED를 끔

  예외가 발생한 경우

코드 설명
except Exception as e: 예외 객체를 e에 할당하여 파일 읽기
오류 발생 시 이에 관한 정보 출력
except KeyboardInterrupt: KeyboardInterrupt 예외가 발생할 경우
아무 작업을 하지 않고 그냥 지나가도록 설정

4.  LED를 모두 사용한 후 GPIO 정리를 위한 코드 작성

# GPIO 정리
GPIO.cleanup()

5.  코드 실행을 위해 Raspberry Pi 터미널로 접속  -->  아래 명령어를 통해 Python 파일 실행

~$ Python [실행할 파일명].py

 

++  아직 Raspberry Pi 초기 세팅이 완료되지 않았다면?

-->  https://alim11.tistory.com/375

 

[Raspberry Pi] 라즈베리 파이(Raspberry Pi) 초기 세팅 방법

🌴 라즈베리 파이(Raspberry Pi) 초기 세팅 방법 1. 라즈베리파이4 모델B(4GB)에 방열판 부착하기 우측이 방열판, 좌측이 라즈베리파이4 모델B ↓ 우측이 부착 완료된 사진! ※ 방열판이란? 방열판은

alim11.tistory.com

6.  Contents 값이 1인 경우 적색 LED가 정상적으로 점멸하는 것을 확인

좌측부터

코드 실행 전  -->  코드 실행 직후  -->  LED가 점멸하는 모습

 

 


🎇 상황별 실제 LED 동작 영상

A) 보이스피싱일 확률이 높을 경우(Contents == 1)

 


B) 보이스피싱일 확률이 낮을 경우(Contents == 0)

 

 


🎇 작성한 코드 전문

import boto3
import RPi.GPIO as GPIO
import time

# AWS S3 자격 증명 및 파일 정보
aws_access_key = 'AWS 액세스 키 ID'
aws_secret_key = 'AWS 시크릿 액세스 키'
bucket_name = '버킷명'
file_key = '파일명 및 파일 경로'

# AWS S3 클라이언트 초기화
s3 = boto3.client(
ㅤㅤ's3',
ㅤㅤaws_access_key_id=aws_access_key,
ㅤㅤaws_secret_access_key=aws_secret_key
)

# GPIO 설정 초기화
GPIO.setmode(GPIO.BCM)
GPIO.setup(20, GPIO.OUT)  # 핀 20에 연결된 LED
GPIO.setup(21, GPIO.OUT)  # 핀 21에 연결된 LED

p20 = GPIO.PWM(20, 50)  # 핀 20용 PWM 객체 생성
p21 = GPIO.PWM(21, 50)  # 핀 21용 PWM 객체 생성

# 선택한 LED를 켜기 전에 두 LED를 끕니다.
p20.stop()
p21.stop()

try:
ㅤㅤ# 파일 내용을 한 번 읽기
ㅤㅤresponse = s3.get_object(Bucket=bucket_name, Key=file_key)
ㅤㅤcontent = response['Body'].read().decode('utf-8')
ㅤㅤvalue = int(content.strip())
    
ㅤㅤ# 읽은 값에 따라 처리
ㅤㅤif value == 0:
ㅤㅤㅤㅤprint("파일 내용:", content)
ㅤㅤㅤㅤprint("양호")
ㅤㅤㅤㅤp20.start(0)
ㅤㅤㅤㅤfor _ in range(5):  # 루프를 5번 반복
ㅤㅤㅤㅤㅤㅤfor dc in range(0, 101, 5):
ㅤㅤㅤㅤㅤㅤㅤㅤㅤp20.ChangeDutyCycle(dc)
ㅤㅤㅤㅤㅤㅤㅤㅤㅤtime.sleep(0.05)
ㅤㅤㅤㅤㅤㅤfor dc in range(100, -1, -5):
ㅤㅤㅤㅤㅤㅤㅤㅤㅤp20.ChangeDutyCycle(dc)
ㅤㅤㅤㅤㅤㅤㅤㅤㅤtime.sleep(0.05)
ㅤㅤㅤㅤp20.stop()  # 5회 반복 후 LED를 끔
ㅤㅤelif value == 1:
ㅤㅤㅤㅤprint("파일 내용:", content)
ㅤㅤㅤㅤprint("경고")
ㅤㅤㅤㅤp21.start(0)
ㅤㅤㅤㅤfor _ in range(5):  # 루프를 5번 반복
ㅤㅤㅤㅤㅤㅤfor dc in range(0, 101, 5):
ㅤㅤㅤㅤㅤㅤㅤㅤㅤp21.ChangeDutyCycle(dc)
ㅤㅤㅤㅤㅤㅤㅤㅤㅤtime.sleep(0.05)
ㅤㅤㅤㅤㅤㅤfor dc in range(100, -1, -5):
ㅤㅤㅤㅤㅤㅤㅤㅤㅤp21.ChangeDutyCycle(dc)
ㅤㅤㅤㅤㅤㅤㅤㅤㅤtime.sleep(0.05)
ㅤㅤㅤㅤㅤㅤㅤㅤㅤp21.stop()  # 5회 반복 후 LED를 끔
ㅤㅤelse:
ㅤㅤㅤㅤprint("잘못된 값")
            
except Exception as e:
ㅤprint("파일 읽기 오류:", e)

except KeyboardInterrupt:
ㅤpass

# GPIO 정리
GPIO.cleanup()