开发环境:thonny、pycharm

开发语言:python、microPython

开发设备:mpu6050、esp32、PC端

开发步骤:数据采集、数据处理、数据传输、数据绘图

目录

一、数据采集

1.mpu6050库文件

2.采集数据主程序

采集结果(原始数据)

二、数据处理

1.加速度、角速度的计算

数据处理结果

2.欧拉角的计算

数据处理结果

三、数据传输

1.客户端创建WiFi

创建WiFi结果

2.服务端连接WiFi

连接WiFi接收数据结果

四、数据绘图

代码实现

接收数据结果

实时绘图结果

补充


一、数据采集

使用microPython开发语言在thonny开发环境中编写mpu6050库文件和采集数据的主程序,然后烧录到esp32微处理器中。在thonny中运行主程序,驱动esp32控制mpu6050采集数据。

代码实现

1.mpu6050库文件

import machineclass accel():def __init__(self, i2c, addr=0x68):self.iic = i2cself.addr = addrself.iic.start()self.iic.writeto(self.addr, bytearray([107, 0]))self.iic.stop()def get_raw_values(self):self.iic.start()a = self.iic.readfrom_mem(self.addr, 0x3B, 14)self.iic.stop()return adef get_ints(self):b = self.get_raw_values()c = []for i in b:c.append(i)return cdef bytes_toint(self, firstbyte, secondbyte):if not firstbyte & 0x80:return firstbyte << 8 | secondbytereturn - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1)def get_values(self):raw_ints = self.get_raw_values()vals = {}vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1])vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3])vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5])vals["Tmp"] = self.bytes_toint(raw_ints[6], raw_ints[7]) / 340.00 + 36.53vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9])vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11])vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13])return vals  # returned in range of Int16# -32768 to 32767def val_test(self):  # ONLY FOR TESTING! Also, fast reading sometimes crashes IICfrom time import sleepwhile 1:print(self.get_values())sleep(0.05)

2.采集数据主程序

import mpu6050
from machine import Pin,SoftI2C
import timei2c = SoftI2C(scl=Pin(22), sda=Pin(21))
Mpu = mpu6050.accel(i2c)while True:#获取原始数据(字典类型)s = Mpu.get_values()print(s)time.sleep_ms(500)

采集结果(原始数据)

二、数据处理

使用microPython开发语言在thonny开发环境中编写数据处理的程序,然后烧录到esp32微处理器中,对采集到的原始数据进行处理,从而得到实用且有效的实验数据。

1.加速度、角速度的计算

代码实现

import mpu6050
from machine import Pin,SoftI2C
import timei2c = SoftI2C(scl=Pin(22), sda=Pin(21))
Mpu = mpu6050.accel(i2c)while True:#1#获取原始数据(字典类型)s = Mpu.get_values()#处理加速度数据#2#从字典中提取加速度原始数据ax=s.get('AcX')ay=s.get('AcY')az=s.get('AcZ')#3#选择2g倍率,计算数据分辨率32768/2=16384,计算加速度=原始数据/数据分辨率acx=ax/16384.0acy=ay/16384.0acz=az/16384.0#4#将加速度数据类型转换成字符串,并创建新对象,目的是适应后期绘图接收数据的格式要求r = 'acx:'+str(acx)o = 'acy:'+str(acy)t = 'acz:'+str(acz)m = r+',  '+o+',  '+t#处理角速度数据(选择250度/秒倍率,32768/250=131(数据分辨率),倍率越低精度越好)gx=s.get('GyX')#原始数据gyx = gx/131.0#处理后的数据gy=s.get('GyY')gyy = gy/131.0gz=s.get('GyZ')gyz = gz/131.0#将角速度数据类型转换成字符串,并创建新对象u = 'gyx:'+str(gyx)v = 'gyy:'+str(gyy)w = 'gyz:'+str(gyz)n = u+',  '+v+',  '+w#gyx = 1000*gx/32768print(m)print(n)time.sleep_ms(500)

数据处理结果

2.欧拉角的计算

代码实现

import mpu6050
from machine import Pin,SoftI2C
import timei2c = SoftI2C(scl=Pin(22), sda=Pin(21))
Mpu = mpu6050.accel(i2c)#1
#构建欧拉角函数
def IMUupdate(ax,ay,az,gx,gy,gz):global q0global q1global q2global q3global exIntglobal eyIntglobal ezInt# print(q0)#测量正常化norm = math.sqrt(ax*ax+ay*ay+az*az)#单元化ax = ax/normay = ay/normaz = az/norm#估计方向的重力vx = 2*(q1*q3 - q0*q2)vy = 2*(q0*q1 + q2*q3)vz = q0*q0 - q1*q1 - q2*q2 + q3*q3#错误的领域和方向传感器测量参考方向之间的交叉乘积的总和ex = (ay*vz - az*vy)ey = (az*vx - ax*vz)ez = (ax*vy - ay*vx)#积分误差比例积分增益exInt += ex*KieyInt += ey*KiezInt += ez*Ki#调整后的陀螺仪测量gx += Kp*ex + exIntgy += Kp*ey + eyIntgz += Kp*ez + ezInt#整合四元数q0 += (-q1*gx - q2*gy - q3*gz)*halfTq1 += (q0*gx + q2*gz - q3*gy)*halfTq2 += (q0*gy - q1*gz + q3*gx)*halfTq3 += (q0*gz + q1*gy - q2*gx)*halfT#正常化四元数norm = math.sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3)q0 /= normq1 /= normq2 /= normq3 /= norm#获取欧拉角 pitch、roll、yawpitch = math.asin(-2*q1*q3+2*q0*q2)*57.3roll = math.atan2(2*q2*q3+2*q0*q1,-2*q1*q1-2*q2*q2+1)*57.3yaw = math.atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3)*57.3return pitch,roll,yawwhile True:#2#获取加速度原始数据s = Mpu.get_values()ax=s.get('AcX')#加速度原始数据ay=s.get('AcY')az=s.get('AcZ')gx=s.get('GyX')#角速度原始数据gy=s.get('GyY')gz=s.get('GyZ')#3#初始化求解欧拉角的相关对象Kp = 100 #比例增益控制加速度计/磁强计的收敛速度Ki = 0.002 #积分增益控制陀螺偏差的收敛速度halfT = 0.001 #采样周期的一半#传感器框架相对于辅助框架的四元数(初始化四元数的值)q0 = 1q1 = 0q2 = 0q3 = 0#由Ki缩放的积分误差项(初始化)exInt = 0eyInt = 0ezInt = 0#4#创建欧拉角对象m = IMUupdate(ax,ay,az,gx,gy,gz)  #从m元组中提取每个单独的数据pitch = m[0]roll = m[1]yaw = m[2]#将欧拉角数据类型转换成字符串,并创建新对象x = 'pitch:'+str(pitch)y = 'roll:'+str(roll)z = 'yaw:'+str(yaw)print(x,y,z)time.sleep_ms(500)

数据处理结果

三、数据传输

使用microPython开发语言在thonny开发环境中编写数据传输的程序,然后分别烧录到两个esp32中,其中esp32微处理器作为客户端创建WiFi,另一个esp32作为服务端连接WiFi,进行无线通信传输数据。

1.客户端创建WiFi

代码实现

import math
import network
import socket
import time
import mpu6050
from machine import Pin,SoftI2Ci2c = SoftI2C(scl=Pin(22), sda=Pin(21))   #初始化i2c对象
Mpu = mpu6050.accel(i2c)    #初始化MPU6050对象port = 10000  #端口号
wlan = None  #wlan
listenSocket = None  #套接字#创建WiFi
def createWifi():   global apap = network.WLAN(network.AP_IF)     #创建接入点界面ap.active(True)                      #激活界面ap.config(essid='ESP32',authmode=4,password='12345678')  #设置接入点的ESSID,和WiFi 通道while(ap.ifconfig()[0] == '0.0.0.0'):   #等待连接time.sleep(1)return True#求欧拉角
def IMUupdate(ax,ay,az,gx,gy,gz):global q0global q1global q2global q3global exIntglobal eyIntglobal ezInt# print(q0)#测量正常化norm = math.sqrt(ax*ax+ay*ay+az*az)#单元化ax = ax/normay = ay/normaz = az/norm#估计方向的重力vx = 2*(q1*q3 - q0*q2)vy = 2*(q0*q1 + q2*q3)vz = q0*q0 - q1*q1 - q2*q2 + q3*q3#错误的领域和方向传感器测量参考方向之间的交叉乘积的总和ex = (ay*vz - az*vy)ey = (az*vx - ax*vz)ez = (ax*vy - ay*vx)#积分误差比例积分增益exInt += ex*KieyInt += ey*KiezInt += ez*Ki#调整后的陀螺仪测量gx += Kp*ex + exIntgy += Kp*ey + eyIntgz += Kp*ez + ezInt#整合四元数q0 += (-q1*gx - q2*gy - q3*gz)*halfTq1 += (q0*gx + q2*gz - q3*gy)*halfTq2 += (q0*gy - q1*gz + q3*gx)*halfTq3 += (q0*gz + q1*gy - q2*gx)*halfT#正常化四元数norm = math.sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3)q0 /= normq1 /= normq2 /= normq3 /= norm#获取欧拉角 pitch、roll、yawpitch = math.asin(-2*q1*q3+2*q0*q2)*57.3roll = math.atan2(2*q2*q3+2*q0*q1,-2*q1*q1-2*q2*q2+1)*57.3yaw = math.atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3)*57.3return pitch,roll,yawtry:createWifi()ip = ap.ifconfig()[0]   #获取IP地址print(ip)listenSocket = socket.socket()   #创建套接字listenSocket.bind((ip, port))   #绑定地址和端口号listenSocket.listen(1)   #监听套接字listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   #设置套接字print ('tcp waiting...')while True:print("accepting.....")conn, addr = listenSocket.accept()   #接收连接请求,返回收发数据的套接字对象和客户端地址#print(addr, "connec getd")#print('aa')while True:s = Mpu.get_values()#调用mpu6050方法,采集数据。ax=s.get('AcX')acx=ax/16384.0ay=s.get('AcY')acy=ay/16384.0az=s.get('AcZ')acz=az/16384.0gx=s.get('GyX')gyx = gx/131.0gy=s.get('GyY')gyy = gy/131.0gz=s.get('GyZ')gyz = gz/131.0Kp = 100 #比例增益控制加速度计/磁强计的收敛速度Ki = 0.002 #积分增益控制陀螺偏差的收敛速度halfT = 0.001 #采样周期的一半#传感器框架相对于辅助框架的四元数(初始化四元数的值)q0 = 1q1 = 0q2 = 0q3 = 0#由Ki缩放的积分误差项(初始化)exInt = 0eyInt = 0ezInt = 0#创建对象m,求欧拉角m = IMUupdate(ax,ay,az,gx,gy,gz)#从m元组中提取每个单独的数据pitch = m[0]roll = m[1]yaw = m[2]r = 'acx:'+str(acx)s = 'acy:'+str(acy)t = 'acz:'+str(acz)u = 'gyx:'+str(gyx)v = 'gyy:'+str(gyy)w = 'gyz:'+str(gyz)x = 'pitch:'+str(pitch)y = 'roll:'+str(roll)z = 'yaw:'+str(yaw)n = r+'\n'+s+'\n'+t+'\n'+u+'\n'+v+'\n'+w+'\n'+x+'\n'+y+'\n'+z#print(n)conn.send(str(n,'utf-8'))#发送,发送数据似乎只能支持str格式,还需要进一步查看手册time.sleep_ms(500)#延时一定时间,避免发送过快except:if(listenSocket):   #判断套接字是否为空listenSocket.close()   #关闭套接字

创建WiFi结果

2.服务端连接WiFi

代码实现

import network
import socket
import timeSSID = "ESP32"  #修改为你的WiFi名称
PASSWORD = "12345678"  #修改为你WiFi密码port = 10000  #端口号
wlan = None  #wlan
sendSocket = None  #套接字#连接WiFi
def connectWifi(ssid,passwd):   global wlanwlan = network.WLAN(network.STA_IF) #客户端,连接到上游WiFi接入点wlan.active(True)   #激活网络wlan.disconnect()   #断开WiFi连接wlan.connect(ssid, passwd)   #连接WiFiwhile(wlan.ifconfig()[0] == '0.0.0.0'):   #等待连接time.sleep(1)return Truetry:connectWifi(SSID,PASSWORD)#创建连接套接字sendSocket = socket.socket()addr=('192.168.4.1',10000)#设置目的IP与端口号sendSocket.connect(addr)#套接字连接print ('tcp connected')#连接成功#print('接收数据')except:if(sendSocket):   #判断套接字是否为空sendSocket.close()   #关闭套接字wlan.disconnect()   #断开WiFiwlan.active(False)   #冻结网络while True:data = sendSocket.recv(2048)#利用套接字进行数据接收,阻塞功能if(len(data)==0):#判定套接字是否为空print("close socket")sendSocket.close()   #关闭套接字else:d=data.decode('utf-8')   #去掉终端的b''print(d)#打印数据到终端

连接WiFi接收数据结果

四、数据绘图

使用python开发语言在pycharm开发环境中编写数据绘图程序。创建窗口、图表、线程,通过串口通信接收服务器传输的数据,并将接收到的数据填充到图表中,实时绘图。

代码实现

import sys  #是一个从程序外部获取参数的桥梁
import time
import pyqtgraph as pg  #是一个纯python的图形和GUI库
import threading    #多线程模块
import serial   #串口通信模块
from PyQt5.QtCore import *  #包含了核心的非GUI功能。处理时间、文件和目录、各种数据类型、流、线程等
from PyQt5.QtGui import *   #包含了多种基本图形功能的类。窗口集、事件处理、2d图形、基本图像和界面以及字体文本。
from PyQt5.QtWidgets import *   #包含了一整套UI元素组件,用于建立符合系统风格的classic界面
import datetime #表示日期时间,年月日时分秒
from pyqtgraph import DateAxisItem  #版本1.0
__version__ = '1.0'#创建一个主窗口的类
class MainWindow(QMainWindow):newdata = pyqtSignal(object)  # 创建信号#初始化、实例化对象def __init__(self, filename=None, parent=None):super(MainWindow, self).__init__(parent)self.setWindowTitle('健身动作监测')   #设置窗口标题self.setWindowIcon(QIcon(r"C:\Users\Administrator\Desktop\毕业设计及论文\毕业设计\数据绘图\fitness"))   #设置窗体图标self.t = []self.acx = []self.acy = []self.acz =[]self.gyx = []self.gyy = []self.gyz = []self.pitch = []self.roll = []self.yaw = []self.history = 3600  # 历史保存数据的数量self.connected = Falseself.port = 'COM3'self.baud = 115200# 启动线程# QTimer.singleShot(0, self.startThread)self.btn = QPushButton('点击运行!')font = QFont()font.setPointSize(16)self.label = QLabel("实时获取健身动作数据")self.label.setFont(font)self.label.setAlignment(Qt.AlignCenter)self.data_label = QLabel("Data")# self.data_label.setAlignment(Qt.AlignCenter)self.pw = pg.PlotWidget()self.pw_angular = pg.PlotWidget()self.pw_angle = pg.PlotWidget()self.init_pg_accel()self.init_pg_angular()self.init_pg_angle()# 设置布局vb = QVBoxLayout()hb = QHBoxLayout()vb.addWidget(self.label)vb.addWidget(self.btn)#控制图表显示个数hb.addWidget(self.pw)hb.addWidget(self.pw_angular)hb.addWidget(self.pw_angle)vb.addLayout(hb)vb.addWidget(self.data_label)self.cwidget = QWidget()self.cwidget.setLayout(vb)self.setCentralWidget(self.cwidget)self.btn.clicked.connect(self.startThread)self.newdata.connect(self.updatePlot)#设置图表:加速度变化趋势def init_pg_accel(self):# 设置图表标题self.pw.setTitle("加速度变化趋势",color='008080',size='12pt')# 设置上下左右的labelself.pw.setLabel("left", "米/秒^2")self.pw.setLabel("bottom", "时间")# 设置Y轴 刻度 范围# self.pw.setYRange(min=10,max=50)  # 最大值# 显示表格线self.pw.showGrid(x=True, y=True)# 背景色改为白色self.pw.setBackground('w')# 居中显示 PlotWidget# self.setCentralWidget(self.pw)axis = DateAxisItem()  # 设置时间轴,主要此时x的数据为时间戳time.time()self.pw.setAxisItems({'bottom': axis})self.curve_acx = self.pw.getPlotItem().plot(pen=pg.mkPen('r', width=2))self.curve_acy = self.pw.getPlotItem().plot(pen=pg.mkPen('b', width=2))self.curve_acz = self.pw.getPlotItem().plot(pen=pg.mkPen('y', width=2))def init_pg_angular(self):# 设置图表标题self.pw_angular.setTitle("角速度变化趋势",color='008080',size='12pt')# 设置上下左右的labelself.pw_angular.setLabel("left", "弧度/秒")self.pw_angular.setLabel("bottom", "时间")# 设置Y轴 刻度 范围# self.pw.setYRange(min=10,max=50)  # 最大值# 显示表格线self.pw_angular.showGrid(x=True, y=True)# 背景色改为白色self.pw_angular.setBackground('w')# 居中显示 PlotWidget# self.setCentralWidget(self.pw)axis = DateAxisItem()  # 设置时间轴,主要此时x的数据为时间戳time.time()self.pw_angular.setAxisItems({'bottom': axis})self.curve_gyx = self.pw_angular.getPlotItem().plot(pen=pg.mkPen('r', width=2))self.curve_gyy = self.pw_angular.getPlotItem().plot(pen=pg.mkPen('b', width=2))self.curve_gyz = self.pw_angular.getPlotItem().plot(pen=pg.mkPen('y', width=2))def init_pg_angle(self):# 设置图表标题self.pw_angle.setTitle("角度变化趋势",color='008080',size='12pt')# 设置上下左右的labelself.pw_angle.setLabel("left", "度")self.pw_angle.setLabel("bottom", "时间")# 设置Y轴 刻度 范围# self.pw.setYRange(min=10,max=50)  # 最大值# 显示表格线self.pw_angle.showGrid(x=True, y=True)# 背景色改为白色self.pw_angle.setBackground('w')# 居中显示 PlotWidget# self.setCentralWidget(self.pw)axis = DateAxisItem()  # 设置时间轴,主要此时x的数据为时间戳time.time()self.pw_angle.setAxisItems({'bottom': axis})self.curve_pitch = self.pw_angle.getPlotItem().plot(pen=pg.mkPen('r', width=2))self.curve_roll = self.pw_angle.getPlotItem().plot(pen=pg.mkPen('b', width=2))self.curve_yaw = self.pw_angle.getPlotItem().plot(pen=pg.mkPen('y', width=2))def startThread(self):'''这里使用python的threading.Thread构造线程,并将线程设置为守护线程,这样主线程退出后守护线程也会跟着销毁'''self.btn.setEnabled(False)print('Start lisnening to the COM-port')# timeout参数很重要!可以结合波特率和传输的数据量计算出数据发送所需的时间serial_port = serial.Serial(self.port, self.baud, timeout=0.1)thread = threading.Thread(target=self.read_from_port, args=(serial_port,))#thread.setDaemon(True)  # 守护线程thread.start()  # 启动线程#更新绘图def updatePlot(self, signal):#self.curve_pitch.getViewBox().enableAutoRange()#self.curve_pitch.getViewBox().setAutoVisible()self.curve_acx.setData(signal[0], signal[1][0])self.curve_acy.setData(signal[0], signal[1][1])self.curve_acz.setData(signal[0], signal[1][2])self.curve_gyx.setData(signal[0], signal[1][3])self.curve_gyy.setData(signal[0], signal[1][4])self.curve_gyz.setData(signal[0], signal[1][5])self.curve_pitch.setData(signal[0], signal[1][6])self.curve_roll.setData(signal[0], signal[1][7])self.curve_yaw.setData(signal[0], signal[1][8])#处理数据def process_data(self, data: str):''''处理数据,注意原来通过串口发送的数据格式'''if len(self.t) >= self.history:  # 保证存储数量为设定的历史长度数量self.t.pop(0)self.acx.pop(0)self.acy.pop(0)self.acz.pop(0)self.gyx.pop(0)self.gyy.pop(0)self.gyz.pop(0)self.pitch.pop(0)self.roll.pop(0)self.yaw.pop(0)if data.startswith('acx'):try:# ['Temperature:28.00\r', 'Humidity:28.00']#strip()清除data = data.strip().replace(' ', '').replace('\r', '').replace('\r', '').replace('\r', '').replace('\r', '').replace('\r', '').replace('\r', '').replace('\r', '').replace('\r', '').split('\n')print(data)self.data_label.setText('Time:' + str(datetime.datetime.now()) + ', ' +data[0] + ', ' + data[1] +', '+data[2]+', '+data[3]+', '+data[4]+', '+data[5]+', '+data[6]+', '+data[7]+', '+data[8])self.t.append(time.time())self.acx.append(float(data[0].split(':')[1].strip()))self.acy.append(float(data[1].split(':')[1].strip()))self.acz.append(float(data[2].split(':')[1].strip()))self.gyx.append(float(data[3].split(':')[1].strip()))self.gyy.append(float(data[4].split(':')[1].strip()))self.gyz.append(float(data[5].split(':')[1].strip()))self.pitch.append(float(data[6].split(':')[1].strip()))self.roll.append(float(data[7].split(':')[1].strip()))self.yaw.append(float(data[8].split(':')[1].strip()))except:print('No valid data')signal = (self.t, (self.acx, self.acy,self.acz,self.gyx, self.gyy,self.gyz,self.pitch, self.roll,self.yaw))self.newdata.emit(signal)else:print('数据格式错误,接收到的数据为:', data)def read_all(self, port, chunk_size=200):"""Read all characters on the serial port and return them.参考:https://stackoverflow.com/questions/19161768/pyserial-inwaiting-returns-incorrect-number-of-bytes"""if not port.timeout:raise TypeError('Port needs to have a timeout set!')read_buffer = b''while True:# Read in chunks. Each chunk will wait as long as specified by# timeout. Increase chunk_size to fail quickerbyte_chunk = port.read(size=chunk_size)read_buffer += byte_chunkif not len(byte_chunk) == chunk_size:breakreturn read_buffer#从串口读取数据def read_from_port(self, ser):while True:bytedata = self.read_all(ser)if bytedata:self.process_data(bytedata.decode())  # 处理数据#停止线程def stopThread(self):print('Stop the thread...')def closeEvent(self, event):if self.okToContinue():event.accept()self.stopThread()else:event.ignore()def okToContinue(self):return Trueif __name__ == '__main__':app = QApplication(sys.argv)win = MainWindow()win.show()app.exec_()

接收数据结果

实时绘图结果

补充

整个系统由三部分硬件组成:数据采集节点、服务器和PC端。

数据采集节点,即健身手环的设计,由微处理器、传感器和电源组成。

做不同的动作,绘制的图像曲线各不相同。

基于物联网的健身的动作监测系统(动作识别)相关推荐

  1. 基于物联网的智能厨房安全监测系统-下位机程序

    CSDN话题挑战赛第2期 参赛话题:学习笔记 最近遇到一个基于TCP/IP网络的远程智能物联网系统,采用Arduino Uno控制器作为下位机,采用LabVIEW作为远程监控软件,两者通过网络实现通信 ...

  2. 基于物联网的智能厨房安全监测系统-硬件部分

    CSDN话题挑战赛第2期 参赛话题:学习笔记 博客写作背景----项目中解决的问题 最近遇到一个基于TCP/IP网络的远程智能物联网系统,采用Arduino Uno控制器作为下位机,采用LabVIEW ...

  3. 基于物联网的智能厨房安全监测系统-总论

    CSDN话题挑战赛第2期 参赛话题:学习笔记 学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程.这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路.学习之乐,独乐乐,不如众乐 ...

  4. 基于物联网的多参数水质监测系统设计

    摘要: 为解决传统水质监测耗时费力.采样精度低.数据统计困难等问题,设计了基于物联网的多参数水质监测系统.该系统以STM32微处理器为控制核心,通过控制内部ADC采集通道对水体温度.浑浊度.pH值和T ...

  5. 基于STM32F103和物联网平台的滚动轴承在线监测系统

    摘要: 设计了一种基于云平台的滚动轴承在线监测系统,信号采集模块将振动传感器输出的振动信号进行变换,再通过 有源滤波模块处理后交给控制器,控制器内部进行 A / D 采样,随后处理器对 A / D 采 ...

  6. 物联网毕业设计 - 基于单片机的静脉输液流速流量监测系统

    ⭐️基于单片机的静脉输液流速流量监测系统⭐️ 树莓派 Raspberry Pi 3 或 stm32 FS2012液体流量传感器 LCD显示器 MQTT协议发送至百度云天工IoT平台 PC端,通过登陆网 ...

  7. 基于物联网的畜禽智能养殖监控系统

    一.需求说明 畜牧业是关系国计民生的重要产业,肉蛋奶是百姓"菜篮子"的重要品种.近年来,我国畜牧业综合生产能力不断增强,在保障国家食物安全.繁荣农村经济.促进农牧民增收等方面发挥了 ...

  8. 基于边缘计算的森林火警监测系统

    基于边缘计算的森林火警监测系统 张科1,叶影1,张红2 1 浙江省林业技术推广总站(浙江省林业信息宣传中心),浙江 杭州 310020 2 北京航天泰坦科技股份有限公司,北京 100071   摘要: ...

  9. 《基于物联网的车内安防系统项目需求说明书+系统概要说明+系统详细说明》

    转载自:https://www.cnblogs.com/duibd/p/4893235.html ①需求说明书部分: 一.引言 1.编写目的 该需求说明书是"基于物联网的车内安防系统&quo ...

  10. 基于物联网技术的医院病床监护系统

    基于物联网技术的医院病床监护系统 最近新冠肺炎病毒肆虐,设计一个医院病床监护系统,要求护士小姐姐可以通过互联网或者手机监测到留观病人的身体的数据,设计一个类似"身联网"系统,描述病 ...

最新文章

  1. iis6中FTP配置的技巧和细节
  2. v-bind 中a标签的使用
  3. 光感是什么_Olay5款热门精华:淡斑小白瓶VS光感小白瓶如何选?超A瓶不太A
  4. ITK:创建三角形四边形网格
  5. 关于 VDD VSS VCC VEE VPP
  6. 七、线性表的链式存储结构
  7. MySQL read-c_技术分享 | MySQL C API 参数 MYSQL_OPT_READ_TIMEOUT 的一些行为分析
  8. 表单html遇到的问题及处理,Html表单中遇到的问题
  9. vagrant 的安装与使用
  10. linux 停止正在执行的shell 程序
  11. echarts r 地图_使用echarts实现省市区地图
  12. 华三路由交换配置命令_h3c路由器配置命令
  13. win10的windows聚焦不显示,灰屏解决方案
  14. 币优网区块链原理浅析
  15. WebSphere如何重启服务
  16. vue3.x自定义换肤
  17. Java的开发架构---浅谈
  18. RTX 4090来了!显卡换新,驱动别拉胯
  19. 锂离子电池被动均衡深度理解
  20. Java 题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n

热门文章

  1. 使用webOffice在线处理word
  2. 数学建模系列---熵权法
  3. mysql 127.0.0.13306_MySQL 问题解决
  4. 又一个关系抽取联合模型!
  5. Linux-wm8960
  6. 选择控制结构if连用时的易错点
  7. american主板网卡灯关机后还亮_玩游戏电脑自己关机。主机灯一闪一闪的。显示器黑屏。键盘鼠标不亮。切短电源才不亮、求大神帮忙看看、、...
  8. 汇编语言里 eax, ebx, ecx, edx, esi, edi, ebp, esp
  9. 字典树(java实现)
  10. 《写给大家看的设计书》为什么要学习这本书: