风向风速数据采集

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

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

pandas数据过滤

Pandas 数据过滤方法 Pandas 提供了多种方法来过滤数据,可以根据不同的条件进行筛选。以下是一些常见的 Pandas 数据过滤方法,结合实例进行讲解,希望能帮你快速理解。 1. 基于条件筛选行 可以使用布尔索引来根据条件过滤行。 import pandas as pd# 创建示例数据data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dav

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者