๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ’๏ธ 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()