Skip to content

Commit dab3788

Browse files
author
=
committed
Winds01 sensor done
1 parent 4ee5a56 commit dab3788

5 files changed

Lines changed: 297 additions & 10 deletions

File tree

ecomet_i2c_sensors/ecomet/winds01/winds01.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
from ecomet_i2c_sensors.ecomet.winds01 import winds01_constant
1212

1313
reg_list = { 'REG_SERIAL_NUMBER' : winds01_constant.REG_SERIAL_NUMBER,
14-
'REG_CONF' : winds01_constant.REG_CONF, 'REG_INIT' : winds01_constant.REG_INIT, 'REG_ValidCnt' : winds01_constant.REG_ValidCnt,
14+
'REG_CONF' : winds01_constant.REG_CONF, 'REG_INIT' : winds01_constant.REG_INIT,
15+
'REG_ValidCnt' : winds01_constant.REG_ValidCnt, 'REG_EE_Index': winds01_constant.REG_EE_Index,
1516
'REG_AVG00' : winds01_constant.REG_AVG00, 'REG_AVG30' : winds01_constant.REG_AVG30,
1617
'REG_AVG60' : winds01_constant.REG_AVG60, 'REG_AVG360' : winds01_constant.REG_AVG360,
1718
'REG_GUST00' : winds01_constant.REG_GUST00, 'REG_GUST30' : winds01_constant.REG_GUST30,
@@ -50,12 +51,12 @@ def read_value(self) :
5051

5152
# @property
5253
def read_register(self, register = None):
53-
if register == 'REG_SERIAL_NUMBER' or register == 'REG_CONF' or register == 'REG_INIT' or register == 'REG_ValidCnt' \
54+
if register == 'REG_SERIAL_NUMBER' or register == 'REG_CONF' or register == 'REG_INIT' or register == 'REG_ValidCnt' or register == 'REG_EE_Index' \
5455
or register == 'REG_AVG00' or register == 'REG_AVG30' or register == 'REG_AVG60' or register == 'REG_AVG360' \
5556
or register == 'REG_GUST00' or register == 'REG_GUST30' or register == 'REG_GUST60' or register == 'REG_GUST360' \
5657
or register == 'REG_BULK' or register == 'REG_EEPROM_AVG' or register == 'REG_EEPROM_GUST':
5758
ret = 0
58-
if register == 'REG_CONF' or register == 'REG_INIT' or register == 'REG_ValidCnt':
59+
if register == 'REG_CONF' or register == 'REG_INIT' or register == 'REG_ValidCnt' or register == 'REG_EE_Index' :
5960
try:
6061
reg_status_bita = self._device.readList(reg_list[register],1)
6162
reg_status = int.from_bytes(reg_status_bita,byteorder='big')
@@ -87,14 +88,14 @@ def read_register(self, register = None):
8788
ret = ret + 1
8889
elif register == 'REG_BULK':
8990
try:
90-
reg_status_bita = self._device.readList(reg_list[register],20)
91+
reg_status_bita = self._device.readList(reg_list[register],21)
9192
reg_status = int.from_bytes(reg_status_bita,byteorder='big')
9293
except:
9394
ret = ret + 1
9495
if ret > 1 :
9596
self._logger.debug('read_register %s failed (%s)',register,ret)
9697
return (0x0000,ret)
97-
elif ret == 0 and (register == 'REG_ValidCnt'):
98+
elif ret == 0 and (register == 'REG_ValidCnt' or register == 'REG_EE_Index'):
9899
self._logger.debug('read_register %s, data: 0x%s[0b%s]', register,'{0:02X}'.format(reg_status), '{0:8b}'.format(reg_status))
99100
return (reg_status,0)
100101
elif ret == 0 and (register == 'REG_CONF' or register == 'REG_INIT'):

ecomet_i2c_sensors/ecomet/winds01/winds01_constant.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@
1414
REG_GUST30 = 0x08 # 2 bytes read register
1515
REG_GUST60 = 0x09 # 2 bytes read register
1616
REG_GUST360 = 0x0A # 2 bytes read register
17-
REG_ValidCnt = 0x0B # 1 byte read regiter
18-
REG_BULK = 0x0C # 19 bytes read register
19-
REG_EEPROM_AVG = 0x0D # 128 bytes read register
20-
REG_EEPROM_GUST = 0x0E # 128 bytes read register
17+
REG_ValidCnt = 0x0B # 1 byte read register
18+
REG_EE_Index = 0x0C # 1 byte read register
19+
REG_BULK = 0x0D # 19 bytes read register
20+
REG_EEPROM_AVG = 0x0E # 128 bytes read register
21+
REG_EEPROM_GUST = 0x0F # 128 bytes read register
2122

2223
VDD = 5 # Voltage = 5V
2324
MAX_DEGREE = 360 # 360 Degree max position

python_test_scripts/ecomet/winds01_i2c_test3.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def int_to_hex_bytes(value: int, min_length: int = None) -> list[int]:
5454
sens._logger.info('Start logging ...')
5555

5656
value = 0x10
57-
stime = 4
57+
stime = 7
5858
set = 0
5959
start = None
6060
diff = None
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
#!/usr/bin/env python3
2+
3+
import sys,os
4+
5+
sys.path.append(os.getenv("HOME") + '/ecomet_i2c_raspberry_tools/ecomet_i2c_sensors')
6+
from ecomet_i2c_sensors.ecomet.winds01 import winds01, winds01_constant
7+
import time
8+
#from hdc1080 import hdc1080
9+
10+
import logging
11+
from datetime import datetime
12+
13+
logging.basicConfig(level=logging.INFO, # change level looging to (INFO, DEBUG, ERROR)
14+
format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
15+
datefmt='%m-%d %H:%M',
16+
filename='ecomet01.log',
17+
filemode='a')
18+
console = logging.StreamHandler()
19+
console.setLevel(logging.DEBUG)
20+
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
21+
console.setFormatter(formatter)
22+
logging.getLogger('').addHandler(console)
23+
24+
25+
def pad_to_21_left(bytes_list: list[int]) -> list[int]:
26+
"""Strip leading 0x00 then pad left with 0x00 to exactly 21 bytes"""
27+
# Convert to bytes and strip leading zeros
28+
data = bytes(bytes_list).lstrip(b'\x00')
29+
# Pad left
30+
padding_needed = 21 - len(data)
31+
if padding_needed < 0:
32+
raise ValueError("Data longer than 20 bytes after stripping")
33+
return [0] * padding_needed + list(data)
34+
35+
def int_to_hex_bytes(value: int, min_length: int = None) -> list[int]:
36+
"""
37+
Convert large integer to list of bytes (big-endian).
38+
Optionally pad with leading zeros to reach min_length.
39+
"""
40+
hex_str = f"{value:x}"
41+
42+
if len(hex_str) % 2 == 1:
43+
hex_str = "0" + hex_str
44+
45+
bytes_list = [int(hex_str[i:i+2], 16) for i in range(0, len(hex_str), 2)]
46+
47+
if min_length is not None and len(bytes_list) < min_length:
48+
bytes_list = [0] * (min_length - len(bytes_list)) + bytes_list
49+
50+
return bytes_list
51+
52+
sens = winds01.WINDS01()
53+
sens._logger = logging.getLogger('ecomet.ecomet01')
54+
sens._logger.info('Start logging ...')
55+
56+
value = 0x00
57+
stime = 6
58+
set = 0
59+
start = None
60+
diff = None
61+
data = sens.write_register ( register = 'REG_CONF', value = [0b00001110])
62+
time.sleep(1)
63+
while (1):
64+
#data = sens.read_register ( register = 'REG_SERIAL_NUMBER' )
65+
#time.sleep(stime)
66+
while True:
67+
data = sens.write_register ( register = 'REG_INIT', value = [0b10000000] )
68+
#print(f"{data}")
69+
if (data & 0b10000000) == 0:
70+
#print("Bit has changed to 0. Operation complete.")
71+
break # Exit the loop
72+
time.sleep(0.2)
73+
74+
#data = sens.read_register ( register = 'REG_CONF' )
75+
#time.sleep(stime)
76+
data = sens.read_register ( register = 'REG_INIT' )
77+
time.sleep(2)
78+
#data_cnt = sens.read_register ( register = 'REG_ValidCnt' )
79+
#time.sleep(stime)
80+
#data_eeprom = int_to_hex_bytes(sens.read_register ( register = 'REG_EEPROM_AVG' )[0])
81+
data_bulk = pad_to_21_left(int_to_hex_bytes(sens.read_register ( register = 'REG_BULK' )[0]))
82+
reg_avg00 = int.from_bytes(data_bulk[0:2], "little")
83+
reg_avg30 = int.from_bytes(data_bulk[2:5], "little")
84+
reg_avg60 = int.from_bytes(data_bulk[5:8], "little")
85+
reg_avg360 = int.from_bytes(data_bulk[8:11], "little")
86+
reg_gust00 = int.from_bytes(data_bulk[11:13], "little")
87+
reg_gust30 = int.from_bytes(data_bulk[13:15], "little")
88+
reg_gust60 = int.from_bytes(data_bulk[15:17], "little")
89+
reg_gust360 = int.from_bytes(data_bulk[17:19], "little")
90+
reg_ValidCnt = int.from_bytes(data_bulk[19:20], "little")
91+
reg_EE_Index = int.from_bytes(data_bulk[20:21], "little")
92+
if int(reg_ValidCnt) == 0 and set == 0:
93+
start = datetime.now()
94+
print(f"Start Counting ...")
95+
set = 1
96+
if int(reg_ValidCnt) != 0 and set == 1:
97+
set = 2
98+
elif int(reg_ValidCnt) == 0 and set == 2:
99+
if start != None:
100+
end = datetime.now()
101+
diff = end - start
102+
start = end
103+
set = 3
104+
time.sleep(stime)
105+
gust00 = float(reg_gust00 * 0.10194)
106+
gust30 = float(reg_gust30 * 0.10194)
107+
gust60 = float(reg_gust60 * 0.10194)
108+
gust360 = float(reg_gust360 * 0.10194)
109+
avg00 = float(reg_avg00 * 0.003403)
110+
if (reg_avg30 <= 16777200 ):
111+
avg30 = float(reg_avg30 * 0.0006807)
112+
else:
113+
avg00 = None
114+
if (reg_avg60 <= 16777200 ):
115+
avg60 = float(reg_avg60 * 0.00034034)
116+
else:
117+
avg60 = None
118+
if (reg_avg360 <= 16777200 ):
119+
avg360 = float(reg_avg360 * 0.000056723)
120+
else:
121+
avg360 = None
122+
print (f"------------------------------------------------------")
123+
print (f"Count: {reg_ValidCnt} Index: {reg_EE_Index} SET: {set}")
124+
print (f"AVG00: {round(avg00,2)} m.s, GUST00: {round(gust00,2)}")
125+
if avg30 == None:
126+
print (f"AVG30: N/A m.s, GUST30: {round(gust30,2)}")
127+
else:
128+
print (f"AVG30: {round(avg30,2)} m.s, GUST30: {round(gust30,2)}")
129+
if avg60 == None:
130+
print (f"AVG60: N/A m.s, GUST60: {round(gust60,2)}")
131+
else:
132+
print (f"AVG60: {round(avg60,2)} m.s, GUST60: {round(gust60,2)}")
133+
if avg360 == None:
134+
print (f"AVG360: N/A m.s, GUST360: {round(gust360,2)}")
135+
else:
136+
print (f"AVG360: {round(avg360,2)} m.s, GUST360: {round(gust360,2)}")
137+
if set >= 3:
138+
if set == 3:
139+
print(f"Time diff: {diff}")
140+
set = 4
141+
if int(reg_ValidCnt) > 0:
142+
set = 2
143+
#print (f"AVG: {data_avg[0]} m.s, GUST: {data_gust[0]} m.s")
144+
#time.sleep(stime)
145+
#time.sleep(stime)
146+
#data = sens.read_register ( register = 'REG_AVG30' )
147+
#time.sleep(stime)
148+
#data = sens.read_register ( register = 'REG_AVG60' )
149+
#time.sleep(stime)
150+
#data = sens.read_register ( register = 'REG_AVG360' )
151+
#time.sleep(stime)
152+
#data = sens.read_register ( register = 'REG_GUST00' )
153+
#time.sleep(stime)
154+
#data = sens.read_register ( register = 'REG_GUST30' )
155+
#time.sleep(stime)
156+
#data = sens.read_register ( register = 'REG_GUST60' )
157+
#time.sleep(stime)
158+
#data = sens.read_register ( register = 'REG_GUST360' )
159+
#time.sleep(stime)
160+
#data = sens.read_register ( register = 'REG_ValidCnt' )
161+
#time.sleep(stime)
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
#!/usr/bin/env python3
2+
3+
import sys,os
4+
5+
sys.path.append(os.getenv("HOME") + '/ecomet_i2c_raspberry_tools/ecomet_i2c_sensors')
6+
from ecomet_i2c_sensors.ecomet.winds01 import winds01, winds01_constant
7+
import time
8+
#from hdc1080 import hdc1080
9+
10+
import logging
11+
from datetime import datetime
12+
13+
logging.basicConfig(level=logging.INFO, # change level looging to (INFO, DEBUG, ERROR)
14+
format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
15+
datefmt='%m-%d %H:%M',
16+
filename='ecomet01.log',
17+
filemode='a')
18+
console = logging.StreamHandler()
19+
console.setLevel(logging.DEBUG)
20+
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
21+
console.setFormatter(formatter)
22+
logging.getLogger('').addHandler(console)
23+
24+
25+
def pad_to_21_left(bytes_list: list[int]) -> list[int]:
26+
"""Strip leading 0x00 then pad left with 0x00 to exactly 21 bytes"""
27+
# Convert to bytes and strip leading zeros
28+
data = bytes(bytes_list).lstrip(b'\x00')
29+
# Pad left
30+
padding_needed = 21 - len(data)
31+
if padding_needed < 0:
32+
raise ValueError("Data longer than 20 bytes after stripping")
33+
return [0] * padding_needed + list(data)
34+
35+
def int_to_hex_bytes(value: int, min_length: int = None) -> list[int]:
36+
"""
37+
Convert large integer to list of bytes (big-endian).
38+
Optionally pad with leading zeros to reach min_length.
39+
"""
40+
hex_str = f"{value:x}"
41+
42+
if len(hex_str) % 2 == 1:
43+
hex_str = "0" + hex_str
44+
45+
bytes_list = [int(hex_str[i:i+2], 16) for i in range(0, len(hex_str), 2)]
46+
47+
if min_length is not None and len(bytes_list) < min_length:
48+
bytes_list = [0] * (min_length - len(bytes_list)) + bytes_list
49+
50+
return bytes_list
51+
52+
sens = winds01.WINDS01()
53+
sens._logger = logging.getLogger('ecomet.ecomet01')
54+
sens._logger.info('Start logging ...')
55+
56+
value = 0x00
57+
stime = 6
58+
set = 0
59+
start = None
60+
diff = None
61+
data = sens.write_register ( register = 'REG_CONF', value = [0b00001110])
62+
time.sleep(1)
63+
while (1):
64+
#data = sens.read_register ( register = 'REG_SERIAL_NUMBER' )
65+
#time.sleep(stime)
66+
while True:
67+
data = sens.write_register ( register = 'REG_INIT', value = [0b10000000] )
68+
#print(f"{data}")
69+
if (data & 0b10000000) == 0:
70+
#print("Bit has changed to 0. Operation complete.")
71+
break # Exit the loop
72+
time.sleep(0.2)
73+
74+
#data = sens.read_register ( register = 'REG_CONF' )
75+
#time.sleep(stime)
76+
data = sens.read_register ( register = 'REG_INIT' )
77+
time.sleep(2)
78+
#data_cnt = sens.read_register ( register = 'REG_ValidCnt' )
79+
#time.sleep(stime)
80+
#data_eeprom = int_to_hex_bytes(sens.read_register ( register = 'REG_EEPROM_AVG' )[0])
81+
data_bulk = pad_to_21_left(int_to_hex_bytes(sens.read_register ( register = 'REG_BULK' )[0]))
82+
reg_avg00 = int.from_bytes(data_bulk[0:2], "little")
83+
reg_avg30 = int.from_bytes(data_bulk[2:5], "little")
84+
reg_avg60 = int.from_bytes(data_bulk[5:8], "little")
85+
reg_avg360 = int.from_bytes(data_bulk[8:11], "little")
86+
reg_gust00 = int.from_bytes(data_bulk[11:13], "little")
87+
reg_gust30 = int.from_bytes(data_bulk[13:15], "little")
88+
reg_gust60 = int.from_bytes(data_bulk[15:17], "little")
89+
reg_gust360 = int.from_bytes(data_bulk[17:19], "little")
90+
reg_ValidCnt = int.from_bytes(data_bulk[19:20], "little")
91+
reg_EE_Index = int.from_bytes(data_bulk[20:21], "little")
92+
time.sleep(stime)
93+
gust00 = float(reg_gust00 * 0.10194)
94+
avg00 = float(reg_avg00 * 0.003403)
95+
if (reg_avg30 <= 16777200 ):
96+
avg30 = float(reg_avg30 * 0.0006807)
97+
gust30 = float(reg_gust30 * 0.10194)
98+
else:
99+
avg00 = None
100+
if (reg_avg60 <= 16777200 ):
101+
avg60 = float(reg_avg60 * 0.00034034)
102+
gust60 = float(reg_gust60 * 0.10194)
103+
else:
104+
avg60 = None
105+
if (reg_avg360 <= 16777200 ):
106+
avg360 = float(reg_avg360 * 0.000056723)
107+
gust360 = float(reg_gust360 * 0.10194)
108+
else:
109+
avg360 = None
110+
print (f"------------------------------------------------------")
111+
print (f"Count: {reg_ValidCnt} Index: {reg_EE_Index} SET: {set}")
112+
print (f"AVG00: {round(avg00,2)} m.s, GUST00: {round(gust00,2)}")
113+
if avg30 == None:
114+
print (f"AVG30: N/A m.s, GUST30: N/A m.s")
115+
else:
116+
print (f"AVG30: {round(avg30,2)} m.s, GUST30: {round(gust30,2)} m.s")
117+
if avg60 == None:
118+
print (f"AVG60: N/A m.s, GUST60: N/A m.s")
119+
else:
120+
print (f"AVG60: {round(avg60,2)} m.s, GUST60: {round(gust60,2)} m.s")
121+
if avg360 == None:
122+
print (f"AVG360: N/A m.s, GUST360: N/A m.s")
123+
else:
124+
print (f"AVG360: {round(avg360,2)} m.s, GUST360: {round(gust360,2)} m.s")

0 commit comments

Comments
 (0)