锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2022-12-09 02:00:00 con021传感器

本文介绍了如何从传感器中获取数据并存储在本地数据库中,

简单版推荐:https://blog..net/qq_43433255/article/details/86985964

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

需要连接传感器,现在笔记本电脑一般没有端口,所以使用虚拟端口;使用传感器获取数据,将传感器获取数据存储在本地数据库中;通过另一个程序将本地数据库中的数据传输到服务器中(此步骤尚未完成,如果完成,我将记得更新)

安装mysql参考我的博客:

https://blog..net/qq_43433255/article/details/86076126

目前笔记本电脑一般没有串口,采用虚拟串口;

b4f2c91de0068d137ed1d31e1daea40b.png

先展示一下实验效果:

数据库中内容:

接下来是代码部分:

先实验两个串口之间的相互通信:

串口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()

到此,传感器的数据传入本地数据库中,已经完成了,

原理其实非常简单,也可以用十分简单的代码做完,其简易版,也会补充上;

还要完成的工作是,将本地数据库中数据,传入一个云端数据库,也就是一个远程数据库;

这时,就必须考虑数据库中值是否合理,在传送值时,考虑是波动范围之类的,

如果后面,我完成相应的代码,会补充近来,

当然,有想法的朋友,也可以与我联系,或者自己进行补充。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章