Skip to content

Commit 3549212

Browse files
author
andy
committed
fix airsensor read fail issue, add vibration sensor
1 parent 9bc7d2d commit 3549212

File tree

6 files changed

+196
-32
lines changed

6 files changed

+196
-32
lines changed
258 Bytes
Binary file not shown.

devices/air_sensor2.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33

44
class AirSensor2:
5-
def __init__(self):
6-
self.server = Server()
5+
def __init__(self, port):
6+
self.server = Server(port)
77

88
def connect(self):
99
"""
@@ -15,6 +15,7 @@ def get_air_params(self):
1515
"""
1616
send get value
1717
"""
18+
data = None
1819
try:
1920
data = self.server.send_and_receive("GetMValue", 2)
2021
data_list = data.split('\r\n')
@@ -32,13 +33,21 @@ def get_air_params(self):
3233
}
3334
}
3435
except Exception as e:
36+
print('Getting data error:\n')
37+
print(data)
3538
print(e)
3639
return {"success": False}
3740

3841

3942
if __name__ == '__main__':
40-
sensor = AirSensor2()
41-
sensor.connect()
43+
sensor1 = AirSensor2(49846)
44+
sensor2 = AirSensor2(49847)
45+
sensor1.connect()
46+
sensor2.connect()
4247
while True:
43-
ret = sensor.get_air_params()
44-
print(ret)
48+
ret1 = sensor1.get_air_params()
49+
ret2 = sensor2.get_air_params()
50+
print("RET - 1: ")
51+
print(ret1)
52+
print("RET - 2: ")
53+
print(ret2)

devices/wtvb01_bt50.py

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
from drivers.serial_driver import SerialDriver
2+
import time
3+
import codecs
4+
from typing import Optional
5+
6+
READ_LENGTH = 28
7+
START_WORD = 55
8+
FLAG_WORD = 61
9+
10+
11+
class WVTB01_BT50:
12+
def __init__(self):
13+
self.baud = 115200
14+
self.serial: Optional[SerialDriver, None] = None
15+
16+
def build_device(self):
17+
self.serial = SerialDriver()
18+
self.serial.init(self.baud)
19+
20+
def read_data(self):
21+
"""
22+
read buffer
23+
"""
24+
for i in range(5):
25+
data = self.serial.read_buffer2(READ_LENGTH, hex_flag=True)
26+
if len(data) == READ_LENGTH * 2 and str(START_WORD) in data and str(FLAG_WORD) in data:
27+
return data
28+
else:
29+
print(f"Try {i + 1}s Error")
30+
31+
def cal_get_value(self, value: str):
32+
"""
33+
计算str类型值,转换为可用的测量值
34+
"""
35+
value_i = int(value, 16)
36+
value_h = value_i & 0xFF00
37+
value_l = value_i & 0x00FF
38+
value_h = value_h >> 8
39+
value_l = value_l << 8
40+
value_ret = value_h + value_l
41+
return value_ret
42+
43+
def get_vibration_velocity(self, data) -> dict:
44+
"""
45+
get x y z, 震动速度
46+
"""
47+
48+
_x = self.cal_get_value(data[4:8])
49+
_y = self.cal_get_value(data[8:12])
50+
_z = self.cal_get_value(data[12:16])
51+
return {"x": _x, "y": _y, "z": _z}
52+
53+
def get_vibration_angular(self, data) -> dict:
54+
"""
55+
get x y z, 震动角度
56+
"""
57+
_x = self.cal_get_value(data[16:20])
58+
_y = self.cal_get_value(data[20:24])
59+
_z = self.cal_get_value(data[24:28])
60+
return {"x": _x, "y": _y, "z": _z}
61+
62+
def get_temperature(self, data) -> float:
63+
"""
64+
get temp
65+
"""
66+
_temp = self.cal_get_value(data[28: 32])
67+
return _temp / 100
68+
69+
def get_vibration_distance(self, data) -> dict:
70+
"""
71+
get _x, _y, _z, 震动位移 (um)
72+
"""
73+
_x = self.cal_get_value(data[32:36])
74+
_y = self.cal_get_value(data[36:40])
75+
_z = self.cal_get_value(data[40:44])
76+
return {"x": _x, "y": _y, "z": _z}
77+
78+
def get_viration_hz(self, data) -> dict:
79+
"""
80+
get 震动频率 (Hz)
81+
"""
82+
_x = self.cal_get_value(data[44:48])
83+
_y = self.cal_get_value(data[48:52])
84+
_z = self.cal_get_value(data[52:56])
85+
return {"x": _x, "y": _y, "z": _z}
86+
87+
88+
if __name__ == '__main__':
89+
device = WVTB01_BT50()
90+
device.build_device()
91+
while True:
92+
data = device.read_data()
93+
94+
result = device.get_vibration_velocity(data)
95+
print("====震动速度====")
96+
print(result)
97+
print('\n')
98+
result = device.get_vibration_angular(data)
99+
print("====震动角度=====")
100+
print(result)
101+
print('\n')
102+
result = device.get_temperature(data)
103+
print("====温度====")
104+
print(result)
105+
print('\n')
106+
result = device.get_vibration_distance(data)
107+
print("====震动距离=====")
108+
print(result)
109+
print('\n')
110+
result = device.get_viration_hz(data)
111+
print("====震动频率=====")
112+
print(result)
113+
print('\n')
114+
115+
time.sleep(1)

drivers/serial_driver.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def get_com_list(cls):
1818
def __init__(self):
1919
self.device = None
2020
self.com = None
21+
self.receive_buffer = None
2122

2223
def get_device(self, select_default=False):
2324
"""
@@ -110,17 +111,29 @@ def read_buffer(self):
110111
pass
111112
time.sleep(3)
112113
# length = self.com.inWaiting()
113-
length = ReceiveBuffer
114+
length = ReceiveBuffer if self.receive_buffer is None else self.receive_buffer
114115
data = self.com.read(length)
115116
self.com.flushInput()
116117
self.com.flushOutput()
117118
return data.decode('utf-8')
118119

120+
def read_buffer2(self, read_length, hex_flag=None):
121+
"""
122+
get specify length of buffer
123+
"""
124+
self.com.flushInput() # 清除接收缓存数据
125+
for _i in range(5):
126+
time.sleep(0.1)
127+
length = self.com.in_waiting
128+
if length < read_length:
129+
continue
130+
else:
131+
return self.com.read(read_length) if hex_flag is None else self.com.read(read_length).hex()
132+
119133

120134
if __name__ == '__main__':
121135
s = SerialDriver()
122-
s.init(9600)
136+
s.init(115200)
123137
for i in range(100):
124-
ret = s.read_buffer()
125-
print(ret)
126-
time.sleep(1)
138+
data = s.read_buffer2(28, hex_flag=True)
139+
print(data)

drivers/socket_interface.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33

44

55
class Server:
6-
def __init__(self):
7-
self.port = 49846
6+
def __init__(self, port):
7+
self.port = port
88
self.server_socket = None
99

1010
def initial_server(self):
1111
try:
1212
# 创建socket对象
1313
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
14+
self.server_socket.settimeout(6)
1415
# 获取本地机器的IP地址
1516
localhost = socket.gethostbyname(socket.gethostname())
1617
# 绑定socket到地址
@@ -38,7 +39,7 @@ def send_and_receive(self, cmd: str, delay_s: float, buffer=1024):
3839

3940

4041
if __name__ == '__main__':
41-
server = Server()
42+
server = Server(49846)
4243
server.initial_server()
4344
for i in range(100):
4445
data = server.send_and_receive("GetMValue", 2)

tools/airsensor_saver.py

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,47 @@
55
from utils import Utils
66

77

8-
def init_connection():
9-
sensor1 = AirSensor()
10-
sensor2 = AirSensor2()
8+
def init_connection(sensor1=None):
9+
if sensor1 is None:
10+
sensor1 = None
11+
else:
12+
sensor1 = AirSensor()
13+
sensor2 = AirSensor2(49846)
14+
sensor3 = AirSensor2(49847)
1115
sensor2.connect()
12-
return sensor1, sensor2
16+
sensor3.connect()
17+
return sensor1, sensor2, sensor3
1318

1419

15-
def read_air_params(sensor1, sensor2):
20+
def read_air_params(sensor1, sensor2, sensor3):
1621
"""
1722
read tem/humidity/pressure
1823
"""
19-
sensor1_tem, sensor1_hum = sensor1.get_read()
20-
air_params = sensor2.get_air_params()
24+
if sensor1 is not None:
25+
sensor1_tem, sensor1_hum = sensor1.get_read()
26+
else:
27+
sensor1_tem = ""
28+
sensor1_hum = ""
29+
2130
for i in range(30):
22-
if air_params["success"] is True:
23-
sensor2_tem = air_params["data"]["temperature"]
24-
sensor2_hum = air_params["data"]["humidity"]
25-
sensor2_pressure = air_params["data"]["pressure"]
26-
return (sensor1_tem, sensor1_hum), (sensor2_tem, sensor2_hum, sensor2_pressure)
31+
air_params_2 = sensor2.get_air_params()
32+
air_params_3 = sensor3.get_air_params()
33+
if air_params_2["success"] is True and air_params_3["success"] is True:
34+
sensor2_tem = air_params_2["data"]["temperature"]
35+
sensor2_hum = air_params_2["data"]["humidity"]
36+
sensor2_pressure = air_params_2["data"]["pressure"]
37+
sensor2_pressure_diff = air_params_2["data"]["p_difference"]
38+
39+
sensor3_tem = air_params_3["data"]["temperature"]
40+
sensor3_hum = air_params_3["data"]["humidity"]
41+
sensor3_pressure = air_params_3["data"]["pressure"]
42+
sensor3_pressure_diff = air_params_3["data"]["p_difference"]
43+
44+
return (sensor1_tem, sensor1_hum), (sensor2_tem, sensor2_hum, sensor2_pressure, sensor2_pressure_diff), \
45+
(sensor3_tem, sensor3_hum, sensor3_pressure, sensor3_pressure_diff)
2746
else:
2847
if i < 9:
29-
print(f"Reading Fail {i+1} times")
48+
print(f"Reading Fail {i + 1} times")
3049
time.sleep(1)
3150
else:
3251
raise ValueError
@@ -35,19 +54,26 @@ def read_air_params(sensor1, sensor2):
3554
def reading_and_write_csv(file_name):
3655
# write title
3756
Utils.write_to_csv(file_name, ["Time", "Sensor1-Temperature", "Sensor1-Humidity", "Sensor2-Temperature",
38-
"Sensor2-Humidity", "Sensor2-Pressure"])
39-
sensor1, sensor2 = init_connection()
57+
"Sensor2-Humidity", "Sensor2-Pressure", "Sensor2-Pressure-Diff",
58+
"Sensor3-Temperature",
59+
"Sensor3-Humidity", "Sensor3-Pressure", "Sensor3-Pressure-Diff"])
60+
sensor1, sensor2, sensor3 = init_connection()
4061

4162
while True:
42-
air_params = read_air_params(sensor1, sensor2)
63+
air_params = read_air_params(None, sensor2, sensor3)
4364
current_time = Utils.get_time_string()
4465
print("========Sensor1========")
4566
print(f"Temperature: {air_params[0][0]}, Humidity: {air_params[0][1]} \n")
4667
print("========Sensor2========")
47-
print(f"Temperature: {air_params[1][0]}, Humidity: {air_params[1][1]}, Pressure: {air_params[1][2]}\n")
68+
print(
69+
f"Temperature: {air_params[1][0]}, Humidity: {air_params[1][1]}, Pressure: {air_params[1][2]}, Diff: {air_params[1][3]}\n")
70+
print("========Sensor3========")
71+
print(
72+
f"Temperature: {air_params[2][0]}, Humidity: {air_params[2][1]}, Pressure: {air_params[2][2]}, Diff: {air_params[2][3]}\n")
4873

4974
this_line = [current_time, air_params[0][0], air_params[0][1], air_params[1][0], air_params[1][1],
50-
air_params[1][2]]
75+
air_params[1][2], air_params[1][3], air_params[2][0], air_params[2][1],
76+
air_params[2][2], air_params[2][3]]
5177
Utils.write_to_csv(file_name, this_line)
5278

5379

0 commit comments

Comments
 (0)