Python+mysql数据库+传感器(将传感器获得数据存入数据库)
时间:2022-12-09 02:00:00
本文介绍了如何从传感器中获取数据并存储在本地数据库中,
简单版推荐:https://blog..net/qq_43433255/article/details/86985964
首先,我要感谢我的老师蒋先生,因为他提供了传感器连接,让我顺利完成实验。在蒋先生的指导下,我也知道了一套完整的流程方向:
需要连接传感器,现在笔记本电脑一般没有端口,所以使用虚拟端口;使用传感器获取数据,将传感器获取数据存储在本地数据库中;通过另一个程序将本地数据库中的数据传输到服务器中(此步骤尚未完成,如果完成,我将记得更新)
安装mysql参考我的博客:
https://blog..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
localimes = 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()
到此,传感器的数据传入本地数据库中,已经完成了,
原理其实非常简单,也可以用十分简单的代码做完,其简易版,也会补充上;
还要完成的工作是,将本地数据库中数据,传入一个云端数据库,也就是一个远程数据库;
这时,就必须考虑数据库中值是否合理,在传送值时,考虑是波动范围之类的,
如果后面,我完成相应的代码,会补充近来,
当然,有想法的朋友,也可以与我联系,或者自己进行补充。