파이썬(Python)/웹서버

serial 통신으로 받은 값 DB에 저장하기

끄적끄적아무거나 2020. 12. 18. 13:33
반응형

 

이번 프로젝트는 미리 만들어 놓은 아두이노에서 온도 습도 가스 등등의 값들을 측정해서 serial 통신으로 1초 간격으로 보내주는데 받은 값을 파이썬으로 mongodb에 저장하는 파이썬 프로그램을 만들 것이다.

 

저장값은 robo 프로그램으로 확인할 것이다.

 

아래 값은 아두이노에서 보내는 값들이다 이중에 온도와 습도를 의미하는 Tv와 Hv 값을 가져오겠다.

 

As0

Vs10  
      
Es0   
      
Cs400 
      
Ts4000

Hs0

Lv0

Cv1129

Tv6855

Hv1561

Vv0

Ev400

Dv3

 

 

파이썬 코드를 통해 이해해보자

 

코드 >>

 

from pymongo import MongoClient 
from time import sleep
import serial
import time

class SertoDB_OOP():
    def __init__(self):
        self.cur_time = ""

    def db_start(self):
        my_client = MongoClient("mongodb://localhost:27017/") 
        db = my_client['Measurement'] 
        self.db_col = db.data

    def serial_start(self):
        try:
            self.ser = serial.Serial('com18', 115200)    
            self.stop_flag = False
        except:
            print("연결오류 : 연결 상태를 확인 해주세요") 
            self.stop_flag = True
            time.sleep(1)

    def data_collect(self):        
        while not self.stop_flag:
            if self.ser.readable():
                res = self.ser.readline()
                res_decode = res.decode()
                print(res_decode)
                if (res_decode[0:2] == "As"):
                    self.alarm_set = res_decode[2:-1] 
                elif(res_decode[0:2] == "Vs"):
                    self.tvoc_set = res_decode[2:-1]                                  
                elif(res_decode[0:2] == "Es"):
                    self.co2eq_set = res_decode[2:-1]                
                elif(res_decode[0:2] == "Cs"):
                    self.co2_set = res_decode[2:-1]                   
                elif(res_decode[0:2] == "Ts"):
                    self.temp_set = res_decode[2:-1]                    
                elif(res_decode[0:2] == "Hs"):
                    self.humid_set = res_decode[2:-1]
                elif(res_decode[0:2] == "Lv"):
                    self.alarm_on = res_decode[2:-1] 
                elif(res_decode[0:2] == "Cv"):
                    self.co2_val = res_decode[2:-1]
                elif(res_decode[0:2] == "Tv"):
                    self.temp_val_raw = res_decode[2:-1]
                    self.temp_val = round((float(self.temp_val_raw)/100 - 40.0),2)
                elif(res_decode[0:2] == "Hv"):
                    self.humid_val_raw = res_decode[2:-1]
                    self.humid_val = round((float(self.humid_val_raw)/100),2)
                elif(res_decode[0:2] == "Vv"):
                    self.tvoc_val = res_decode[2:-1]                                                               
                elif(res_decode[0:2] == "Ev"):
                    self.co2eq_val = res_decode[2:-1]                
                elif(res_decode[0:2] == "Dv"):
                    self.device_id = res_decode[2:-1]
                    self.cur_time = time.strftime("%y%m%d_%H%M%S")   
                    post = {
                        "Time": self.cur_time,
                        "Temperature": self.temp_val,
                        "Humidity": self.humid_val,
                    }
                    self.db_col.insert_one(post)                    
 



oop = SertoDB_OOP()
oop.db_start()
oop.serial_start()
oop.data_collect()

 

class 내부에 self를 사용해서 함수간에 변수들을 사용했다.

 

우선 mongodb를 연결하고 다음으로 serial 통신을 연결하였다.

 

다음으로 serial에서 나오는 값들 중에 temperature, humidity 값만을 가져와서 db에 시간 값과 같이 저장하였다.

 

결과는 아래와 같이 나왔다. 매 초당 온도와 습도가 db에 저장된 것을 확인했다.

 

 

 

반응형