风向风速数据采集

2023-12-23 01:41
文章标签 数据 采集 风向 风速

本文主要是介绍风向风速数据采集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

主要采用RS485通讯

1、风速采集

首先要查询传感器在主机上的端口号和波特率(正常为4800),代码如下:

port_list = list(serial.tools.list_ports.comports())if len(port_list) == 0:print("无可用串口!")else:for i in range(0, len(port_list)):print(port_list[i])port_num = 'COM' + input('Port Number = COM:')

根据端口返回的二进制代码转换成十六进制代码,转成十进制,最后根据产品说明书量程数据转换成正常风速

 在根据风力等级表转成对应的风力等级

全部代码

import serial
import time
import serial.tools.list_portsdef wind_speed():temp_send = '01 03 00 00 00 02 C4 0B'ser = serial.Serial(port_num, 4800)# 发送的数据转为2进制b'\x01\x03\x00\x00\x00\x02\xc4\x0b'temp_send = bytes.fromhex(temp_send)#print(temp_send)while True:if ser.is_open:#print('port open ok')ser.write(temp_send)time.sleep(1)# 获取返回的缓冲data,获取的是buffer_data的长度  9buffer_data = ser.in_waiting#print(buffer_data, 'buffer_data')if buffer_data:# 返回的数据为2进制:b'\x01\x03\x04\x01\x08\x022\xfa\xb8'return_data = ser.read(buffer_data)#print('返回的数据2进制:', return_data)# 二进制转换为16进制:010304010802307b79return_data_hex = str(return_data.hex())#print('返回的数据转换为16进制:', return_data_hex)# 对返回的数据进行解析,16进制转成10进制wind_speed = int(return_data_hex[6:10], 16)/10local_time = time.localtime()now_time = time.strftime("%Y/%m/%d %H:%M:%S", local_time)with open('D:\\风速.txt', 'a',encoding='utf-8') as file:##with open('D:\\desktop\\python_study\\python_exe\\电流信号处理\\风速.txt', 'a',encoding='utf-8') as file:if wind_speed <= 0.3:file.write(str(now_time))file.write('\t无风,风速为:')file.write(str(wind_speed))file.write('m/s\n')print(now_time,'\t','无风', wind_speed, 'm/s')elif 0.3 <= wind_speed <=1.5:file.write(str(now_time))file.write('\t一级软风,风速为:')file.write(str(wind_speed))file.write('m/s\n')print(now_time,'\t','1级软风', wind_speed, 'm/s')elif 1.6 <= wind_speed <=3.3:file.write(str(now_time))file.write('\t二级软风,风速为:')file.write(str(wind_speed))file.write('m/s\n')print(now_time, '\t', '2级软风', wind_speed, 'm/s')elif 3.4 <= wind_speed <=5.4:file.write(str(now_time))file.write('\t三级微风,风速为:')file.write(str(wind_speed))file.write('m/s\n')print(now_time, '\t', '3级微风', wind_speed, 'm/s')elif 5.5 <= wind_speed <=7.9:file.write(str(now_time))file.write('\t四级和风,风速为:')file.write(str(wind_speed))file.write('m/s\n')print(now_time, '\t', '4级和风', wind_speed, 'm/s')elif 8.0 <= wind_speed <=10.7:print(now_time, '\t', '5级清劲风', wind_speed, 'm/s')elif 10.8 <= wind_speed <=13.8:print(now_time, '\t', '6级强风', wind_speed, 'm/s')elif 13.9 <= wind_speed <=17.1:print(now_time, '\t', '7级疾风', wind_speed, 'm/s')elif 17.2 <= wind_speed <=20.7:print(now_time, '\t', '8级大风', wind_speed, 'm/s')elif 20.8 <= wind_speed <=24.4:print(now_time, '\t', '9级烈风', wind_speed, 'm/s')time.sleep(1)if __name__ == '__main__':port_list = list(serial.tools.list_ports.comports())if len(port_list) == 0:print("无可用串口!")else:for i in range(0, len(port_list)):print(port_list[i])port_num = 'COM' + input('Port Number = COM:')wind_speed()

 2、风向采集

跟风速采集类似,要先对准北方,然后根据旋转角度得出风向

全部代码:

import serial
import timetemp_send = '01 03 00 00 00 02 C4 0B'
Port_number = input('请输入端口号(COM5/COM6/COM7):')
ser = serial.Serial(Port_number, 4800)
# 发送的数据转为2进制b'\x01\x03\x00\x00\x00\x02\xc4\x0b'
temp_send = bytes.fromhex(temp_send)
#print(temp_send)
while True:if ser.is_open:#print('port open ok')ser.write(temp_send)time.sleep(1)# 获取返回的缓冲data,获取的是buffer_data的长度  9buffer_data = ser.in_waiting#print(buffer_data, 'buffer_data')if buffer_data:# 返回的数据为2进制:b'\x01\x03\x04\x01\x08\x022\xfa\xb8'return_data = ser.read(buffer_data)#print('返回的数据2进制:', return_data)# 二进制转换为16进制:010304010802307b79return_data_hex = str(return_data.hex())#print('返回的数据转换为16进制:', return_data_hex)# 对返回的数据进行解析,16进制转成10进制wind_direction = int(return_data_hex[6:10], 16)local_time = time.localtime()now_time = time.strftime("%Y/%m/%d %H:%M:%S", local_time)if wind_direction == 0:print(now_time, '\t', '北风')elif wind_direction == 1:print(now_time, '\t', '东北风')elif wind_direction == 2:print(now_time, '\t', '东风')elif wind_direction == 3:print(now_time, '\t', '东南风')elif wind_direction == 4:print(now_time, '\t', '南风')elif wind_direction == 5:print(now_time, '\t', '西南风')elif wind_direction == 6:print(now_time, '\t', '西风')elif wind_direction == 7:print(now_time, '\t', '西北风')time.sleep(2)

3、温湿度采集

代码

#!/usr/bin/env python
import RPi.GPIO as GPIO
import numpy as np
import timeDHTPIN = 17  # 引脚号17GPIO.setmode(GPIO.BCM)  # 以BCM编码格式def read_dht11_dat():GPIO.setup(DHTPIN, GPIO.OUT)GPIO.output(DHTPIN, GPIO.LOW)# 给信号提示传感器开始工作,并保持低电平18ms以上time.sleep(0.02)  # 这里保持20msGPIO.output(DHTPIN, GPIO.HIGH)  # 然后输出高电平GPIO.setup(DHTPIN, GPIO.IN)# 发送完开始信号后得把输出模式换成输入模式,不然信号线上电平始终被拉高while GPIO.input(DHTPIN) == GPIO.LOW:continue# DHT11发出应答信号,输出 80 微秒的低电平while GPIO.input(DHTPIN) == GPIO.HIGH:continue# 紧接着输出 80 微秒的高电平通知外设准备接收数据# 开始接收数据j = 0  # 计数器data = []  # 收到的二进制数据kk = []  # 存放每次高电平结束后的k值的列表while j < 40:k = 0while GPIO.input(DHTPIN) == GPIO.LOW:  # 先是 50 微秒的低电平continuewhile GPIO.input(DHTPIN) == GPIO.HIGH:  # 接着是26-28微秒的高电平,或者 70 微秒的高电平k += 1if k > 100:breakkk.append(k)if k < 8:  # 26-28 微秒时高电平时通常k等于5或6data.append(0)  # 在数据列表后面添加一位新的二进制数据“0”else:  # 70 微秒时高电平时通常k等于17或18data.append(1)  # 在数据列表后面添加一位新的二进制数据“1”j += 1print("sensor is working.")print('初始数据高低电平:\n', data ) # 输出初始数据高低电平print('参数k的列表内容:\n', kk ) # 输出高电平结束后的k值m = np.logspace(7, 0, 8, base=2, dtype=int)  # logspace()函数用于创建一个于等比数列的数组# 即[128 64 32 16 8 4 2 1],8位二进制数各位的权值data_array = np.array(data)  # 将data列表转换为数组# dot()函数对于两个一维的数组,计算的是这两个数组对应下标元素的乘积和(数学上称之为内积)humidity = m.dot(data_array[0:8])  # 用前8位二进制数据计算湿度的十进制值humidity_point = m.dot(data_array[8:16])temperature = m.dot(data_array[16:24])temperature_point = m.dot(data_array[24:32])check = m.dot(data_array[32:40])print(humidity, humidity_point, temperature, temperature_point, check)tmp = humidity + humidity_point + temperature + temperature_point# 十进制的数据相加if check == tmp:  # 数据校验,相等则输出return humidity, temperatureelse:  # 错误输出错误信息return Falsedef main():print("Raspberry Pi DHT11 Temperature test program\n")time.sleep(1)  # 通电后前一秒状态不稳定,时延一秒while True:result = read_dht11_dat()if result:humidity, temperature = resultprint("humidity: %s %%,  Temperature: %s  ℃" % \(humidity, temperature))print('\n')time.sleep(1)if result == False:print("Data are wrong,skip\n")time.sleep(1)def destroy():GPIO.cleanup()if __name__ == '__main__':try:main()except KeyboardInterrupt:destroy()

4、采集结果

这篇关于风向风速数据采集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/526281

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元