Skip to content

Commit 49c0439

Browse files
committed
feature/unit/kmeteriso: K-type thermocouple sensor[STM32F0+MAX31855KASA]
1 parent ab99584 commit 49c0439

File tree

3 files changed

+84
-0
lines changed

3 files changed

+84
-0
lines changed

m5stack/libs/unit/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
"VMeterUnit": "vmeter",
5050
"AMeterUnit": "ameter",
5151
"WEIGHT_I2CUnit": "weight_i2c",
52+
"KMETER_ISOUnit": "kmeter_iso",
5253
}
5354

5455

m5stack/libs/unit/kmeter_iso.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from machine import I2C
2+
from .pahub import PAHUBUnit
3+
from .unit_helper import UnitError
4+
import struct
5+
import sys
6+
7+
if sys.platform != "esp32":
8+
from typing import Union
9+
10+
import time
11+
import struct
12+
13+
KMETER_ADDR = 0x66
14+
15+
TEMP_CELSIUS_REG = 0x00
16+
TEMP_FAHREN_REG = 0x04
17+
TEMP_INT_CELSIUS_REG = 0x10
18+
TEMP_INT_FAHREN_REG = 0x14
19+
TEMP_READY_REG = 0x20
20+
TEMP_STR_CELSIUS_REG = 0x30
21+
TEMP_STR_FAHREN_REG = 0x40
22+
TEMP_INTSTR_CELSIUS_REG = 0x50
23+
TEMP_INTSTR_FAHREN_REG = 0x60
24+
FIRM_VER_REG = 0xFE
25+
I2C_ADDR_REG = 0xFF
26+
27+
28+
class KMETER_ISOUnit:
29+
def __init__(self, i2c: Union[I2C, PAHUBUnit], addr=KMETER_ADDR):
30+
"""! Kmeter Initialize Function
31+
addr: 1 ~ 127
32+
"""
33+
self.kmeter_i2c = i2c
34+
if addr >= 0x01 and addr <= 0x7F:
35+
self.unit_addr = addr
36+
if not (self.unit_addr in self.kmeter_i2c.scan()):
37+
raise UnitError("Kmeter iso unit maybe not connect")
38+
39+
def get_kmeter_thermo(self, temp=0):
40+
"""! get thermocouple temperature value."""
41+
buff = self.kmeter_i2c.readfrom_mem(self.unit_addr, TEMP_CELSIUS_REG + (4*temp), 4)
42+
return round((self.int_convert(buff)/100), 2)
43+
44+
def get_kmeter_internal(self, temp=0):
45+
"""! get internal temperature value."""
46+
buff = self.kmeter_i2c.readfrom_mem(self.unit_addr, TEMP_INT_CELSIUS_REG + (4*temp), 4)
47+
return round(self.int_convert(buff)/100, 2)
48+
49+
@property
50+
def get_data_available_status(self):
51+
"""! get temperature measurement value is ready? """
52+
status = self.kmeter_i2c.readfrom_mem(self.unit_addr, TEMP_READY_REG, 1)[0]
53+
return False if status else True
54+
55+
def get_kmeter_thermo_string(self, temp=0):
56+
"""! get thermocouple temperature string value."""
57+
return self.kmeter_i2c.readfrom_mem(self.unit_addr, TEMP_STR_CELSIUS_REG + (temp*0x10), 1).decode() + str(float(self.kmeter_i2c.readfrom_mem(self.unit_addr, TEMP_STR_CELSIUS_REG + (temp*0x10), 8).decode()))
58+
59+
def get_kmeter_internal_string(self, temp=0):
60+
"""! get internal temperature string value."""
61+
return self.kmeter_i2c.readfrom_mem(self.unit_addr, TEMP_INTSTR_CELSIUS_REG + (temp*0x10), 1).decode()+str(float(self.kmeter_i2c.readfrom_mem(self.unit_addr, TEMP_INTSTR_CELSIUS_REG + (temp*0x10), 8).decode()))
62+
63+
def get_device_spec(self, mode) -> int:
64+
"""! Get device firmware version and i2c address.
65+
mode: 0xFE and 0xFF
66+
"""
67+
if mode >= FIRM_VER_REG and mode <= I2C_ADDR_REG:
68+
return self.kmeter_i2c.readfrom_mem(self.unit_addr, mode, 1)[0]
69+
70+
def set_i2c_address(self, addr) -> None:
71+
"""! Set i2c address.
72+
addr: 1 to 127
73+
"""
74+
if addr >= 0x01 and addr <= 0x7F:
75+
if addr != self.unit_addr:
76+
self.kmeter_i2c.writeto_mem(self.unit_addr, I2C_ADDR_REG, struct.pack('b', addr))
77+
self.unit_addr = addr
78+
time.sleep_ms(200)
79+
80+
def int_convert(self, value):
81+
return struct.unpack('<i', value)[0]
82+

m5stack/libs/unit/manifest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"vmeter.py",
5252
"ameter.py",
5353
"weight_i2c.py",
54+
"kmeter_iso.py",
5455
),
5556
base_path="..",
5657
opt=0,

0 commit comments

Comments
 (0)