안녕하세요 땜블리의 공작소에 땜블리 입니다.
라즈베리파이 피코 베이직 트레이닝 보드를 이용한 IoT 식물 재배기 실습을 2차 진행 하겠습니다.
1차에서는 adafruit 사의 IO 클라우드 서비스 사용법 ,2차에서는 코드 소스와 연동하여 사용하겠습니다.
베이직 트레이닝 보드는 아래에서 확인이 가능합니다.
1차 진행은 아래에서 확인 가능합니다.
=> adafruit 클라우드를 이용한 식물재배기 프로젝트 1차
2차에서는 Feed 에 데이터를 올려 Dashboard에서 확인하는 방법까지 해보겠습니다.
코드 소스
secrets.py
secrets = {
'ssid' : 'AP_name',
'password' : 'AP_password',
'aio_username' : 'Adafruit_username',
'aio_key' : 'Adafruit_key'
}
secrets.py 코드에서는 공유기 이름과 공유기 비밀번호, Adafruit 이름과 ,Adafruit key를 적어 놓는 곳입니다.
main.py와 같이 있어야 합니다.
main.py
import time
import ssl
import wifi
import socketpool
import board
import digitalio
import analogio
import adafruit_requests
import adafruit_dht
from adafruit_io.adafruit_io import IO_HTTP, AdafruitIO_RequestError
from secrets import secrets
import neopixel
import pwmio
import adafruit_ssd1306
import busio
# i2c설정
i2c = busio.I2C(board.GP15, board.GP14)
oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3c)
uart = busio.UART(board.GP16, board.GP17, baudrate=115200)
# 초기화
oled.fill(1)
oled.show()
time.sleep(1)
oled.fill(0)
oled.show()
# 핀 할당
relay_pin = board.GP12
cds_pin = board.GP27
dht_pin = board.GP7
fan_pin = board.GP20
pump_pin = board.GP21
vr_pin= board.GP26
# PWM 제어용 디지털 핀 초기화
pump_pwm = pwmio.PWMOut(pump_pin, frequency=500, duty_cycle=0)
fan_pwm = pwmio.PWMOut(fan_pin, frequency=500, duty_cycle=0) # Initialize a PWM object on the fan pin
# 릴레이 제어용 디지털 핀 초기화
relay = digitalio.DigitalInOut(relay_pin)
relay.direction = digitalio.Direction.OUTPUT
dhtOut = adafruit_dht.DHT11(dht_pin)
# CDS 광센서 제어용 아날로그 핀 초기화
cds = analogio.AnalogIn(cds_pin)
vr = analogio.AnalogIn(vr_pin)
# 제어할 장치들의 초기 상태 설정
relay.value = False
fan_pwm.duty_cycle = 0 # Initialize the duty cycle to 0
pump_pwm.duty_cycle = 0 # Initialize the duty cycle to 0
# define LED colors
RED = (255, 99, 71)
YELLOW = (255, 215, 0)
ORANGE = (255, 165, 0)
WARM_COLORS = [RED, YELLOW, ORANGE]
# Turn on LED
led = neopixel.NeoPixel(board.GP13, 4)
wifi.radio.connect(secrets["ssid"],secrets["password"])
aio_username = secrets['aio_username']
aio_key = secrets['aio_key']
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
# Initialize an Adafruit IO HTTP API object
io = IO_HTTP(aio_username, aio_key, requests)
print("connected to io")
def get_feed_value(feed_key):
try:
feed = io.get_feed(feed_key)
except RequestError:
raise Exception('Feed not found')
data = io.receive_data(feed_key)
return data['value']
try:
# get feed
picowTemp_feed = io.get_feed("qtemp")
picowHumid_feed = io.get_feed("qhumid")
picowCds_feed = io.get_feed("qcds")
except AdafruitIO_RequestError:
# if no feed exists, create one
picowTemp_feed = io.create_new_feed("qtemp")
picowHumid_feed = io.create_new_feed("qhumid")
picowCds_feed = io.create_new_feed("qcds")
# pack feed names into an array for the loop
feed_names = [picowTemp_feed, picowHumid_feed, picowCds_feed]
print("feeds created")
clock = 10
while True:
try:
switch_feed_key = "sw"
switch_value = get_feed_value(switch_feed_key)
# 스위치 값에 따라 작업 수행
if switch_value == 'ON':
print("Switch is on!")
relay.value = True
else:
print("Switch is off.")
relay.value = False
temp_data = dhtOut.temperature
humi_data = dhtOut.humidity
cds_data = cds.value
vr_data = vr.value
CdSDataV = (3.3/65535) * cds_data
CdSDataV = round(CdSDataV, 2)
print('CDS value: {0}, Temperature: {1} C, Humidity: {2} %'.
format(CdSDataV, temp_data, humi_data))
oled.fill(0)
oled.text("Temp(C) : ", 0, 0, 1)
oled.text(str(temp_data), 80, 0,1)
oled.text("Humi(%) : ", 0, 12,1)
oled.text(str(humi_data), 80, 12,1)
oled.text("CdS(V) : ", 0, 24,1)
oled.text(str(CdSDataV), 80, 24,1)
oled.text("Switch : ", 0, 34,1)
oled.text(str(switch_value), 80, 34,1)
oled.show()
# CDS 광센서 값에 따라 led 제어
if cds_data < 20000:
led.fill((0, 0, 0))
else:
led.fill((ORANGE))
# 온도에 따라 팬 제어
if temp_data > 28:
fan_pwm.duty_cycle = int(1 * 65535)
elif humi_data > 26:
fan_pwm.duty_cycle = int(0.5 * 65535)
else:
fan_pwm.duty_cycle = int(0.0 * 65535)
# 습도에 따라 모터 제어
if humi_data < 10:
pump_pwm.duty_cycle = int(1*65535) # 모터를 최대 속도로 회전
elif humi_data < 30:
pump_pwm.duty_cycle = int(0.8*65535) # 모터를 멈춤
elif humi_data < 50:
pump_pwm.duty_cycle = int(0*65535) # 모터를 멈춤
else:
pump_pwm.duty_cycle = int(0*65535) # 모터를 중간 속도로 회전
print('pump_pwm: {0}, fan_pwm: {1} , relay: {2}'.
format(pump_pwm.duty_cycle, fan_pwm.duty_cycle, relay.value))
if clock >= 10:
# read sensor
data = [temp_data, humi_data, cds_data]
# send sensor data to respective feeds
for z in range(3):
io.send_data(feed_names[z]["key"], data[z])
time.sleep(1)
print()
# reset clock
clock = 0
else:
clock += 1
# pylint: disable=broad-except
# any errors, reset Pico W
except Exception as e:
print("Error:\n", str(e))
print("Resetting microcontroller in 10 seconds")
#time.sleep(10)
microcontroller.reset()
# delay
time.sleep(1)
print(clock)
main.py 코드 입니다.
동작 설명
각 필요한 라이브러리를 가져 옵니다.
사용된 라이브러리는 adafruit 에서 제공한 라이브러리 입니다.
라이브러리들을 pico 보드에 파일 넣어주듯이 lib 폴더에 넣어 주면 됩니다.
그리고 각 모듈별 초기화 및 핀 설정을 하고 작성된 wifi에 연결 합니다.
연결 되면 adafruit io 에 접속하여 Feed를 가져와 사용할 Feed가 있는지 없으면 생성합니다.
그리고 sw 상태를 읽어와 릴레이 제어를 합니다.
조도에 따라 밝으면 LED가 켜지고 조도가 낮으면 꺼지고 습도가 낮으면 펌프가 구동되고 습도가 일정한 레벨에 오면 멈추고를 반복합니다.
그리고 10초 마다 온도 습도 조도를 1차때 만든 Feed에 업로드 합니다.
동작 결과
습도센서로 모터 구동을 제대로 테스트 하기가 어려워 가변 저항을 가지고 테스트를 진행 합니다.
'프로젝트' 카테고리의 다른 글
라즈베리파이 피코와 베이스보드를 이용한 카운터기 (0) | 2023.04.19 |
---|---|
IoT 모니터링 adafruit IO 클라우드 서비스 이용 (0) | 2023.04.18 |
IoT 조명 프로젝트 (0) | 2023.03.23 |
IoT 콘센트 & 스위치 (0) | 2023.03.22 |
adafruit 클라우드를 이용한 식물재배기 프로젝트 1차 (0) | 2023.03.13 |
댓글