날짜 : 2021.01.29 금요일 / 제목 : 기능 추가와 초기화.. / 날씨 : 🌞🌀
안녕하세요 ! 전자과_공대생입니다 ~ (⌐■_■)
오늘 하늘도 이쁘고 구름 한 점 없는데 바람이 많이 부네요 ㅠㅠ
어제처럼 올라오는데 날아갈 뻔했습니다 ㅎㅎ
그럼 미니 프로젝트에 새로운 기능을 추가해보겠습니다 !
{※ 주의 ※}
현재 라즈베리파이에 에러가 발생하여 내일 리셋시킬 예정입니다.
참고하시고 글을 읽어주시길 바랍니다 !!
현재 제가 하려는 것을 스위치를 이용해서 라즈베리파이를 껐다켰다할 수 있도록 하려고 합니다.
제가 인터넷을 찾아본 결과 스위치로 충분히 전원 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
미니 프로젝트는 일단 여기까지 하겠습니다 ㅠㅠ
내일 초기화를 시키고 다시 시도하겠습니다 !
그럼 내일 다시 미니 프로젝트 글로 찾아뵙겠습니다 !
이상 전자과_공대생이었습니다 ~ ! (⌐■_■)
감사합니다 !
라즈베리파이 미니 프로젝트 Real_Final ! [세미나 !] (0) | 2021.02.01 |
---|---|
라즈베리파이 미니 프로젝트 Final ! [포맷과 재설정 및 마무리 !] (0) | 2021.01.31 |
라즈베리파이 미니 프로젝트 11탄 ! [LCD 추가 성공 !] (0) | 2021.01.29 |
라즈베리파이 미니 프로젝트 10탄 ! [미니 프로젝트 중간점검 !] (0) | 2021.01.27 |
라즈베리파이 미니 프로젝트 9탄 ! [구글에도 없는 오류 해결법..] (0) | 2021.01.23 |