본문 바로가기
라즈베리파이(Raspberry Pi)

(6) 라즈베리파이 토양수분센서/릴레이 모듈

by kingyejin 2023. 12. 4.

토양 수분 센서

저항측정 방식의 토양습도센서

 : 전류를 흘려보내 다른 전극과의 저항값을 계산하는 방법 , 물은 전기가 잘 통하는 전도체이므로

토양 수분 함량이 높으면 저항치가 낮을 것이고, 수분함량이 낮으면 저항값이 높게 측정될 것

 

토양의 수분과 저항/전압의 관계
=> 토양수분함량(%) 증가 시 , 전압과 저항값 감소

 


정전용량 방식의 토양습도센서

: 토양 내 수분변화에 따른 정전용량의 변화를 측정하는 방식의 센서로 토양을 하나의 유전체(절연체)로 보고

수분 함량에 따른 유전율의 변화를 측정한다. (토양 수분이 증가 -> 토양 유전율 증가 -> 정전용량 증가)

정전용량 방식의 토양 습도 센서

 


[실습] 토양습도센서의 출력 전압(Vout)을 MCP3008을 통해 ADC 통신하여 전압값 읽기

 

*자세한 ADC 통신에 대한 내용은 해당글 참고. 2023.12.04 - [라즈베리파이(Raspberry Pi)] - 라즈베리 파이 가변저항/ADC

import time
import spidev

spi = spidev.SpiDev()
spi.open(0,0) # 0번채널 open
spi.max_speed_hz = 1000000

def ReadVol(vol):
	adc = spi.xfer2([1,(8+vol)<<4,0])
	data = ((adc[1]&3)<<8)+adc[2]
	return data
	
mcp3008 = 0 
SLOPE = 2.18
INTERCEPT = -0.79

while True:
	a_1 = ReadVol(mcp3008) #토양습도센서 출력 전압의 디지털값
    Vol = 3.3*a_1/1024 #토양습도센서 출력 전압의 아날로그 값
    water = (1.0/Vol)*SLOPE)+INTERCEPT #토양습도의 아날로그 값
	print('voltage:',a_1.'V',Vol, 'Water contents:',water)
	time.sleep(0.5)

릴레이 모듈

: 입력이 어떤 값에 도달하였을 때 작동하여 다른 회로를 개폐하는 장치 (쉽게 말해 on/off가 있는 스위치)

ex) 접점이 있는 릴레이, thermal 릴레이, 입력 릴레이, 광 릴레이


Relay 종류

[유접점] : 접점의 기계적 개폐를 통해 기능 수행

 


유접점 Relay 동작 원리

: Relay는 내부에 전자석(코일)을 포함하고 있으며, 이는 전류가 통하면 자석이 되는 성질을 가짐.

즉, 전원을 공급하면 릴레이 내부 코일이 자석이 되어 옆에 있는 철판을 끌어당겨 스위치가 On 된다.


[무접점,  SSR (Solid state relay) ]

: 제어용 입력은 내부 led와 연결되어 있으며 부하와 연결된 회로에는 광을 인식하는 센서를 통해 회로를 열고 닫을 수 있음.

*반응속도가 상대적으로 느리며, 접점과 코일이 없어서 기계식 회로에 비해 소음이 적고 기계적 고장이 없음.  EX) 반도체 릴레이

무접점 relay 모듈 예시


릴레이 모듈에 신호 주기

 

Normal Open [NO] (off->on)
: 평상시 열려있다는 뜻으로, 릴레이로 신호를 주면 close되므로 전원을 off 상태로 유지하다가 신호를 주어 on 할 때 사용

Normal Close [NC] (on->off)
: 평상시 닫혀있다는 뜻으로, 릴레이에 신호를 주면 open되므로 전원을 on 상태로 유지하다가 신호를 주어 off 할 때 사용

 

{B타입 릴레이 모듈의 경우]
1. PUMP의 (+)극을 NO와 연결한 경우 (PUMP OFF->ON)

-정상 상태에서는 NO와 COM이 연결되어 있지 않아 PUMP는 OFF 상태입니다. 
-외부에서 신호가 들어오면 NO와 COM이 맞닿게 되어 PUMP가 ON 상태가 됩니다.

2.PUMP의 (+)극을 NC와 연결한 경우 (PUMP ON->OFF)
-정상 상태에서는 NC와 COM이 연결되어 있어 PUMP는 ON 상태입니다.
-외부에서 신호가 들어오면 NC와 COM이 맞닿지 않아 PUMP가 OFF 상태가 됩니다.

*1의 경우든 2의 경우든 일단 평상시에는 COM이 NC와 맞닿아 있다가 전류가 흐르면 NO와 맞닿는다고 생각하면 쉬움.
(COM이 NO와 접해야 NO에 전압 공급(ON) 가능 / NC와 접해야 NC에 전압 공급(ON) 가능하다)


릴레이 모듈의 2가지 타입

*출처 :&nbsp;https://smartstore.naver.com/mechasolution_com/products/3507737969

 

쉽게 말해 HIGH 신호(GPIO.output(7,True))를 주면 A타입은  NO가 open(OFF)되고, B타입은 NO가 close(ON)됩니다.

반대로, LOW 신호 (GPIO.output(7,False)) 를 주면 A타입은 NO가 close(ON)되고, B타입은 NO가 open(OFF) 됩니다.


[실습] 릴레이(무접점 B타입) 모듈을 사용하여 GPIO 컨트롤로 수중펌프 작동시키기

: 라즈베리 파이에서 RPi.GPIO 라이브러리를 사용하여 GPIO 핀을 제어하여 릴레이를 On/Off하는 간단한 예제

 

4ch Relay module (light coupling)5V / 워터 펌프
회로도

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM) #GPIO 핀을 BCM 모드로 설정
GPIO.setup(17, GPIO.OUT) #GPIO 핀 17을 출력 모드로 설정

while (True):
	#GPIO 핀 17을 LOW로 설정하여 릴레이를 활성화(ON)
    GPIO.output(17,True) #B타입 릴레이 모듈이면 True
    print("pump on")
    time.sleep(2)
    
    #GPIO 핀 17을 HIGH로 설정하여 릴레이를 비활성화(OFF)
    GPIO.output(17,False) #A타입 릴레이 모듈이면 True 
    print("pump off")
    time.sleep(2)

[실습] 릴레이(무접점 B타입) 를 사용하여 GPIO 컨트롤로 토양습도가 낮을 때, 수중펌프 작동시키기

 

: Voltage 600 (전압 높을수록 토양습도 낮음)을 기준으로 수중 펌프가 on/off

(전압이 600보다 높으면 수중 펌프 ON , 낮으면 OFF)

import RPi.GPIO as GPIO
import time
import spidev

#GPIO 초기 설정
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT) 

#ADC 초기 설정
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz = 1000000

def ReadVol(vol):
    adc = spi.xfer2([1,(8+vol)<<4,0])
    data = ((adc[1]&3)<<8)+adc[2]
    return data

mcp3008 = 0
SLOPE = 2.18
INTERCEPT = -0.79

#동작
try:
    while True:
        a_1 = ReadVol(mcp3008)
        Vol = 3.3*a_1/1024
        water = (1.0/Vol)*SLOPE)+INTERCEPT
        print('voltage:',a_1,'V',Vol,'Water contents',water) #토양습도 정보 출력
        time.sleep(2)

        #조건문
        if a_1 >= 600:
                GPIO.output(17, True)
                print("Pump on")
        else:
                GPIO.output(17, False)

except KeyboardInterrupt:
    print("Terminated by Keyboard")

finally:
    GPIO.cleanup()
    print("End of program")