상세 컨텐츠

본문 제목

라즈베리파이 미니 프로젝트 12탄 ! [기능 추가와 초기화..]

라즈베리파이 실습 및 미니 프로젝트 !

by 전자과_공대생 2021. 1. 29. 20:00

본문

728x90
반응형

날짜 : 2021.01.29 금요일 / 제목 : 기능 추가와 초기화.. / 날씨 : 🌞🌀

 

안녕하세요 !  전자과_공대생입니다 ~ (⌐■_■)

오늘 하늘도 이쁘고 구름 한 점 없는데 바람이 많이 부네요 ㅠㅠ

어제처럼 올라오는데 날아갈 뻔했습니다 ㅎㅎ

 

그럼 미니 프로젝트에 새로운 기능을 추가해보겠습니다 !

 

{※ 주의 }

현재 라즈베리파이에 에러가 발생하여 내일 리셋시킬 예정입니다.

참고하시고 글을 읽어주시길 바랍니다 !!

reset... / 출처 - https://associationsnow.com/2020/08/loosen-up-4-strategies-to-encourage-a-successful-remote-work-reset/

 

현재 제가 하려는 것을 스위치를 이용해서 라즈베리파이를 껐다켰다할 수 있도록 하려고 합니다.

제가 인터넷을 찾아본 결과 스위치로 충분히 전원 ON/OFF가 가능하였습니다 !

하지만 문제점이 하나 있습니다.

전원을 사용하기 위해 라즈베리파이에서 제공하는 소스 파일을 사용하게 됩니다.

거기서 핀 번호 3(BCM 기준 / 5-BOARD)을 무조건 사용해야 합니다.

하지만 저희는 LCD를 사용해서 이미 GPIO 3번 핀을 사용하고 있다는 점..

심지어 LCD한테서 GPIO 3번 핀은 SCL역할을 하기 때문에 무조건 사용해야 합니다...

만약 둘 다 사용하고 싶으면 전원 OFF만 사용할 수 있습니다 !

전원 OFF는 다른 핀 번호를 사용해서 연결하고 실행시키면 LCD도 동작하고 전원도 OFF만 가능하게 됩니다.

단, ON을 누르는 동작을 하기 위해서는 반드시 GPIO 3번 핀에 꽂아야 하며 그러기 위해서는 LCD를 포기해야 합니다..

또 만약 LCD를 포기하고 ON전원을 켰을 때 화면이 들어오고 스마트 화분이 자동 실행되게 하기 위해서는 설정이 필요합니다.

여기서 제가 잘 못 건드려서 초기화를 해야 한다는....ㅠ

일단 그래도 제가 지금까지 해왔던 코딩 파일을 정리해서 보여드리겠습니다.

여기에는 LCD도 스위치 전원 버튼도 포함되어있는 코딩입니다 !

단, 스위치 ON은 불가능하며 OFF 역할만 가능합니다.

만약 LCD를 포기하고 ON 역할도 하게 만들고 싶다? 하시면 LCD 관련 코딩은 다 주석 처리(#) 하시고 스위치 INPUT선은 GPIO 3번에 연결하시면 작동이 됩니다 !

그럼 코딩 보여드리겠습니다 !

import RPi.GPIO as GPIO
import I2C_LCD_driver
import time
import spidev
from subprocess import call
from datetime import datetime

IN1 = 5
IN2 = 6
R = 16
G = 20
B = 21
btnPin = 22
shutdown_sec = 2

#set %
HUM_THRESHOLD=20
#water sensor output first value
HUM_MAX=0

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN2, GPIO.OUT)
GPIO.setup(R, GPIO.OUT)
GPIO.setup(G, GPIO.OUT)
GPIO.setup(B, GPIO.OUT)
GPIO.setup(btnPin, GPIO.IN)

#motor driver first setting
spi=spidev.SpiDev()
#open(bus, device) / my raspberrypi server opens (0,0), (0,1)
spi.open(0,0)
#motor speed
spi.max_speed_hz=500000

#get adc value function
def read_spi_adc(adcChannel):
	adcValue = 0
	#xfer2([value])
	buff = spi.xfer2([1,(8+adcChannel)<<4,0])
	adcValue = ((buff[1]&3)<<8)+buff[2]
	return adcValue

#map function = convert the percentage (%)
def map(value, min_adc, max_adc, min_hum, max_hum):
	adc_range = max_adc-min_adc
	hum_range = max_hum-min_hum
	scale_factor = float(adc_range)/float(hum_range)
	return min_hum+((value-min_adc)/scale_factor)
    
def getPressTime():
    elapsed = 0
    if pressTime is not None:
        elapsed = (datetime.now() - pressTime).total_seconds()
    return elapsed

try:
	strPer="%"
	mylcd = I2C_LCD_driver.lcd()
	adcChannel=0
	strCur=""
    
	while True:
    	input = GPIO.input(btnPin)
        if input == 0:
       		if prevInput == -1 or prevInput == 1:
        		pressTime = datetime.now()
        	elif prevInput == 0:
        		if getPressTime() >= shutdown_sec:
        			call(['shutdown', '-h', 'now'], shell=False)
        			break
                    
		prevInput = input
    
		adcValue = read_spi_adc(adcChannel)

		#convert imported data to %
		#high humidity = low value
		#so 100-value then, high humidity = high value
		hum = 100-int(map(adcValue,HUM_MAX,1023,0,100))
		if hum < HUM_THRESHOLD:
			GPIO.output(IN1, GPIO.HIGH)
			GPIO.output(IN2, GPIO.LOW)
			GPIO.output(R, GPIO.HIGH)
			GPIO.output(G, GPIO.LOW)
			GPIO.output(B, GPIO.LOW)
			print 'yes'
			strCur="Warning"
		else:
			GPIO.output(IN1, GPIO.LOW)
			GPIO.output(IN2, GPIO.LOW)
			GPIO.output(R, GPIO.LOW)
			GPIO.output(G, GPIO.HIGH)
			GPIO.output(B, GPIO.LOW)
			print 'no'
			strCur="Normal"

		mylcd.lcd_clear()
		mylcd.lcd_display_string("HUM:%d%s"%(hum, strPer), 1)
		mylcd.lcd_display_string("STATUS:%s"%strCur, 2)
		time.sleep(0.5)

finally:
	GPIO.cleanup()
	spi.close()

※오류※

while True문 시작하는 첫 문장을 1번 문장이라고 가정하겠습니다.

1~8번 문장이 띄어쓰기(Tab으로 띄우기)가 잘 못 되었습니다 !

1~8번 문장 모두 한번씩 Tab 띄어쓰기를 해야합니다.

 

저는 전원이 자동으로 꺼지는 시간은 2초로 지정했습니다 !

줄이거나 늘리고 싶으시면 shutdown_sec을 조절하시면 되겠습니다 !

스위치 회로 연결은 옛날에 한번 설명드린 적이 있으므로 넘기겠습니다 !

대신 스위치 vcc선은 GPIO 22번에 연결했다는 것만 말씀드리겠습니다.

또한, 풀업 저항을 사용하였습니다.

제가 참고하면서 공부하고 실습했던 사이트 3개를 알려드리겠습니다.

3개에 기본 코딩부터 백그라운드로 실행시키는 법 등 다양하게 나와있습니다 !

※ 참고 사이트 1 : cafe.naver.com/raspigamer/7890

※ 참고 사이트 2 : kimstar.kr/7826/

※ 참고 사이트 3 : 4475.tistory.com/491

 

 

미니 프로젝트는 일단 여기까지 하겠습니다 ㅠㅠ

내일 초기화를 시키고 다시 시도하겠습니다 !

그럼 내일 다시 미니 프로젝트 글로 찾아뵙겠습니다 !

이상 전자과_공대생이었습니다 ~ ! (⌐■_■)

감사합니다 !

728x90
반응형

관련글 더보기