본문 바로가기
프로젝트

adafruit 클라우드를 이용한 식물재배기 프로젝트 2차

by 커피하는조이 2023. 3. 13.
728x90
반응형
SMALL

안녕하세요 땜블리의 공작소에 땜블리 입니다.

라즈베리파이 피코 베이직 트레이닝 보드를 이용한 IoT 식물 재배기 실습을 2차 진행 하겠습니다.

1차에서는 adafruit 사의  IO 클라우드 서비스 사용법 ,2차에서는 코드 소스와 연동하여 사용하겠습니다.

베이직 트레이닝 보드는 아래에서 확인이 가능합니다.

https://ttcw.tistory.com/4

 

라즈베리파이 피코 베이직 트레이닝보드 구성

라즈베리파이 피코 보드의 펌웨어실습을 위한 베이직 트레이닝보드를 소개 합니다. 현재 네이버 스마트스토어에서 판매가 진행되고 있습니다. 라즈베리파이 피코 베이직 트레이닝 보드 라즈베

ttcw.tistory.com

 

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에 업로드 합니다.

반응형

 

동작 결과

 

 

습도센서로 모터 구동을 제대로 테스트 하기가 어려워 가변 저항을 가지고 테스트를 진행 합니다.

 

 

728x90
반응형
LIST

댓글