SharedIT | 묻고 답하기(AMP)

라즈베리파이와 토양수분센서(yl-69)를 이용한 관측데이터 저장방법

안녕하세요 질문드릴게 있어서 글 남깁니다.

라즈베리파이와 토양수분센서(yl-69)를 활용해서 측정된 데이터를 라즈베리파이에 저장하고 싶은데 코드를 어떻게 해야할까요 ㅠㅠ

저장된 데이터에 측정값, 측정날짜와 시간이 표시 되었으면합니다. 

아래에 코드는 1분에 한번씩 수분측정 하도록 설정한 코드입니다. 해당 코드는 날짜와 시간이 표시가 안되고 측정 데이터는 저장되지 않습니다. 

고수님의 도움이 필요합니다.ㅠㅠㅠㅠ


import time

import RPi . GPIO as GPIO

import spidev

GPIO . setup(DIGIT , GPIO . IN)

spi=spidev . SpiDev()

spi . open(0,0)

spi . max_speed_hz=50000

def read_spi_adc(adcChannel):

      adcValue = 0

      buff=spi.xfer2([1,(8+adcChannel)<<4,0])

      adcValue = ((buff[1]&3)<<8)+buff[2]

      return adcValue

try:

      while True:

            adcValue=read_spi_adc(0)

            print("토양수분 : %d" %(adcValue))

            digit_val=GPIO.input(DIGIT)

            print("Digit Value : %d"%(digit_val))

            time.sleep(60)

finally:

     GPIO.cleanup()

     spi.close()

      

Tags : 태그가 없습니다.

2개의 답변이 있습니다.

powerhg7
  0 추천 | 2년 이하 전

알려주신대로 하니까 해결됐습니다. 감사합니다.! :)

wansoo
  0 추천 | 2년 이하 전

try:

      while True:

            adcValue=read_spi_adc(0)

            print("토양수분 : %d" %(adcValue))

            digit_val=GPIO.input(DIGIT)

            print("Digit Value : %d"%(digit_val))

            time.sleep(60)


에서 print() 명령을 사용하고 있기 때문에 저장되는 것이 아니라 화면에 출력되게 되겠고요.

파일에 저장하려면 file을 write ("wt") mode로 열어서, write(), writelines() 등의 명령으로 저장하면 되겠고요.


print() 명령을 write()나 writelines() 등으로 변경해서 저장하게 수정하려면 파일을 열고, 저장하고, 파일을 닫고 하는 명령을 추가해 주면 되는데...

복잡하게 느껴진다면 print() 명령을 그대로 사용하면서도 저장하도록 OS (Shell)에서 실행시킬 때, Redirection ( > 또는 >> )을 사용하면, 코드를 그대로 두고도 파일로 저장할 수 있겠고요.


날짜 시간을 추가해서 출력하고 싶다면 datetime library를 사용해서 현재 일시를 읽어서 출력해 주면 되겠고요.


예를 들어, 코드의 앞부분에서 import datetime 명령으로 datetime library를 먼저 로드 시켜 주고요.

앞부분에 import time을 import datetime으로 수정해서 사용하면 될 것 같고...

반복되는 while 문 안에 적절한 위치에 print( datetime.datetime.now() ) 명령을 넣어 주면 될 것 같네요.


예를 들면 아래와 같이 넣어 줘도 되지 않을까 싶어 보이고요.


 while True:

            print( datetime.datetime.now() ) 

            adcValue=read_spi_adc(0)

            print("토양수분 : %d" %(adcValue))

            digit_val=GPIO.input(DIGIT)

            print("Digit Value : %d"%(digit_val))

            time.sleep(60)


strftime() 명령을 이용해서 datetime format을 적절한 형식으로 변형해서 사용하도록 수정해서 사용할 필요도 있을 것 같아 보이고요.

예를 들어

datetime.datetime.now().strftime("%Y%m%d %H:%M:%S")

와 같은 형식으로 적절하게 수정해서 사용한다면 입맛에 맞게 적용해서 사용할 수 있지 않을까 싶어 보이네요.