Python+mysql数据库+传感器(将传感器获得数据存入数据库)

版权声明:转载请标明链接, https://blog.csdn.net/qq_43433255/article/details/86767399

这次介绍一下,如何从传感器获得数据,并存入本地数据库中,
推介一个简易版:https://blog.csdn.net/qq_43433255/article/details/86985964

在这里首先,要感谢我的老师—蒋老师,因为,他提供了传感器的连接,让我顺利完成这次实验。也在蒋老师的指导下,知道一套完整的流程走向:

需要连接传感器,现在的笔记本一般没有端口,所以用的是虚拟端口;用传感器获得数据,将传感器获得数据存入本地数据库;通过另外的一个程序,将本地的数据库中数据传入一个服务器中(这个步骤没有完成,如果完成了,我会记得更新的)

安装mysql可以参考我这一个博客:
https://blog.csdn.net/qq_43433255/article/details/86076126

现在的笔记本电脑,一般没有串口,采用虚拟串口;
在这里插入图片描述
在这里插入图片描述
先来展示一下实验效果:
在这里插入图片描述
数据库中内容:

在这里插入图片描述

接下来是代码部分:

先来实验两个串口间的相互通信:
串口1代码:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
u'''
Created on 2018年12月27日
@author: wuluo
'''
__author__ = 'wuluo'
__version__ = '1.0.0'
__company__ = u'重庆交大'
__updated__ = '2018-12-27'

import serial

# 打开串口
serialPort = "COM1"  # 串口
baudRate = 9600  # 波特率
ser =serial.Serial(serialPort, baudRate, timeout=0.5)
print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))

 

# 收发数据
while 1:
    str = input("请输入要发送的数据(非中文)并同时接收数据: ")
    ser.write((str + '\n').encode())
    print(ser.readline())  # 可以接收中文
ser.close()


if __name__ == "__main__":
    pass

串口2的代码:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
u'''
Created on2018年12月27日
@author: wuluo
'''

__author__ = 'wuluo'
__version__ = '1.0.0'
__company__ = u'重庆交大'
__updated__ = '2018-12-27'
import serial

# 打开串口
serialPort = "COM2"  # 串口
baudRate = 9600  # 波特率
ser =serial.Serial(serialPort, baudRate, timeout=0.5)
print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))

 

# 收发数据
while 1:
    str = input("请输入要发送的数据(非中文)并同时接收数据: ")
    ser.write((str + '\n').encode())
    print(ser.readline())  # 可以接收中文
ser.close()

if __name__ == "__main__":
    pass

实验结果:
在这里插入图片描述

下面,介绍,如何通过一个串口,将传感器得到的数据传回到本地数据库,

准备一个数据库,我采用的是mysql,具体安装教程,以及相关的问题,上面有链接,
数据库的创建语言:



create table wensidu(
  id   varchar(50 ),
  wendu   varchar(50),
  sidu   varchar(50),
 primary   key(id)

)


然后就是两个串口部分的代码:

The one:



#!/usr/bin/env
python3

# -*-
coding:utf-8 -*-

u'''

Created on 2019年1月6日

 

@author:
wuluo

'''

__author__
= 'wuluo'

__version__
= '1.0.0'

__company__
= u'重庆交大'

__updated__
= '2019-01-11'

 

import threading

import time

import jpyc.jserial as jserial

import socket

import codecs

import pymysql

 

#
mysql数据库的连接

con =
pymysql.connect(

    host='127.0.0.1',

    port=3306,

    user='root',

    password='123456',

    db='python_wensidu',

    charset='utf8'

)

cur =
con.cursor()  # 定义一个游标,通过游标来操作数据库

 

 

class U2S():

    def __init__(self, us_address, s_para):

        self.isalive = True

        self.us_address
= us_address

        self.s_para = s_para

        self.serial = jserial.JSerial()

        self.serial.setsettings(s_para)

        self.serial.open()

        self.udp =
socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

        self.udp.setsockopt(socket.SOL_SOCKET,

                           
socket.SO_REUSEADDR,

                            1)

        self.udp.settimeout(5)

        self.th =
threading.Thread(target=self.recvfromserial, args=())

        self.th.setDaemon(True)

        self.th.start()

        self.th_udp =
threading.Thread(target=self.recvfromudp, args=())

        self.th_udp.setDaemon(True)

        self.th_udp.start()

 

    def __del__(self):

        self.serial.close()

        self.udp.close()

 

    def recvfromudp(self):

        while self.isalive:

            try:

                data, addr = self.udp.recvfrom(8192)

                data = codecs.encode(data, 'hex')

                r = bytes(data).decode('utf-8') 
# 解码

                shidu = int(r[6:10], 16) / 100

                wendu = int(r[10:14], 16) / 100

                localtimes = time.strftime(

                    "%Y-%m-%d %H:%M:%S", time.localtime())

                print(localtimes)

                print("温度:%s,湿度:%s\n" % (wendu, shidu))

                cur.executemany("INSERT wensidu
VALUE(%s,%s,%s)", [

                                (localtimes,
str(wendu), str(shidu))])  # int转str

                con.commit()

                print("---------显示数据库内容------------")

                #===读取数据库

                select = cur.execute('SELECT * FROM wensidu')

                all = cur.fetchall()

                print(all)

 

            except socket.timeout:

                pass

 

    def quit(self):

        self.isalive = False

 

    def recvfromserial(self):

        while self.isalive:

            data = self.serial.recv()

            if not data:

                continue

            print('从串口接收到:%s' % data)

            self.udp.sendto(data, self.us_address)

 

 

if __name__ == "__main__":

    u2s = U2S(('10.1.156.82', 8001), 'com1,9600,8,N,1')

    try:

        while u2s.th.is_alive():

            time.sleep(1)

    finally:

        if u2s.th.is_alive():

            u2s.quit()


The two:



#!/usr/bin/env
python3

# -*-
coding:utf-8 -*-

u'''

Created on 2019年1月6日

 

@author:
wuluo

'''

__author__
= 'wuluo'

__version__
= '1.0.0'

__company__
= u'重庆交大'

__updated__
= '2019-01-08'

 

import serial

import codecs

import time

import datetime

 

 

if __name__ == "__main__":

    while True:

        com = serial.Serial()

        com.port = 'com2'

        com.baudrate = 9600

        com.bytesize = 8

        com.stopbits = 1

        com.parity = 'N'

        com.timeout = 5

        com.open()

        cmd = b'030300000002c5e9'

        cmd = codecs.decode(cmd, encoding='hex')

        try:

            com.write(cmd)

            data = com.read(9)

            shijian = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

            print(shijian)

            print('接收到:%s' % codecs.encode(data, encoding='hex'))

        except:

            print('超时')

        finally:

            com.close()

到此,传感器的数据传入本地数据库中,已经完成了,
原理其实非常简单,也可以用十分简单的代码做完,其简易版,也会补充上;

还要完成的工作是,将本地数据库中数据,传入一个云端数据库,也就是一个远程数据库;
这时,就必须考虑数据库中值是否合理,在传送值时,考虑是波动范围之类的,
如果后面,我完成相应的代码,会补充近来,
当然,有想法的朋友,也可以与我联系,或者自己进行补充。

猜你喜欢

转载自blog.csdn.net/qq_43433255/article/details/86767399