🎇 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()
'✒️ Embedded System & Computing Platform > Raspberry Pi' 카테고리의 다른 글
[Raspberry Pi] 라즈베리 파이(Raspberry Pi) 초기 세팅 방법 (0) | 2023.07.09 |
---|---|
[Raspberry Pi] 라즈베리 파이 초기 설정을 위한 VNC Viewer 설치 방법 (0) | 2023.07.08 |
[Raspberry Pi] 라즈베리 파이 초기 설정을 위한 PuTTY 설치 방법 (0) | 2023.07.08 |
[Raspberry Pi] 라즈베리 파이(Raspberry Pi) OS 설치 및 설정 방법 (0) | 2023.07.08 |
[Raspberry Pi] 라즈베리 파이(Raspberry Pi) 세팅을 위한 네트워크 연결 확인 (0) | 2023.07.07 |