Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for TEMPerHumM12V1.2 and TEMPerHumM12V1.3 #4

Merged
merged 2 commits into from
Dec 29, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions libtempered/temper_type.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "type_hid/sht1x.h"
#include "type_hid/ntc.h"
#include "type_hid/si7005.h"
#include "type_hid/si7021.h"

// This is an array of known TEMPer types.
struct temper_type known_temper_types[]={
Expand Down Expand Up @@ -37,6 +38,8 @@ struct temper_type known_temper_types[]={
.subtype_strings = (char *[]){
"TEMPerHumV1.0rHu",
"TEMPerHumM12V1.0",
"TEMPerHumM12V1.2",
"TEMPerHumM12V1.3",
NULL
}
},
Expand Down Expand Up @@ -103,6 +106,68 @@ struct temper_type known_temper_types[]={
}
}
},
(struct temper_subtype*)&(struct temper_subtype_hid){
.base = {
.id = 2,
.name = "TEMPerHumM12V1.2",
.open = tempered_type_hid_subtype_open,
.read_sensors = tempered_type_hid_read_sensors,
.get_temperature = tempered_type_hid_get_temperature,
.get_humidity = tempered_type_hid_get_humidity
},
.sensor_group_count = 1,
.sensor_groups = (struct tempered_type_hid_sensor_group[]){
{
.query = {
.length = 9,
.data = (unsigned char[]){ 0, 1, 0x80, 0x33, 1, 0, 0, 0, 0 }
},
.read_sensors = tempered_type_hid_read_sensor_group,
.sensor_count = 1,
.sensors = (struct tempered_type_hid_sensor[]){
{
.get_temperature = tempered_type_hid_get_temperature_si7021,
.get_humidity = tempered_type_hid_get_humidity_si7021,
.temperature_high_byte_offset = 2,
.temperature_low_byte_offset = 3,
.humidity_high_byte_offset = 4,
.humidity_low_byte_offset = 5
}
}
}
}
},
(struct temper_subtype*)&(struct temper_subtype_hid){
.base = {
.id = 3,
.name = "TEMPerHumM12V1.3",
.open = tempered_type_hid_subtype_open,
.read_sensors = tempered_type_hid_read_sensors,
.get_temperature = tempered_type_hid_get_temperature,
.get_humidity = tempered_type_hid_get_humidity
},
.sensor_group_count = 1,
.sensor_groups = (struct tempered_type_hid_sensor_group[]){
{
.query = {
.length = 9,
.data = (unsigned char[]){ 0, 1, 0x80, 0x33, 1, 0, 0, 0, 0 }
},
.read_sensors = tempered_type_hid_read_sensor_group,
.sensor_count = 1,
.sensors = (struct tempered_type_hid_sensor[]){
{
.get_temperature = tempered_type_hid_get_temperature_si7021,
.get_humidity = tempered_type_hid_get_humidity_si7021,
.temperature_high_byte_offset = 2,
.temperature_low_byte_offset = 3,
.humidity_high_byte_offset = 4,
.humidity_low_byte_offset = 5
}
}
}
}
},
NULL // List terminator for subtypes
}
},
Expand Down
69 changes: 69 additions & 0 deletions libtempered/type_hid/si7021.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#include <stdbool.h>
#include <string.h>

#include "type-info.h"
#include "../tempered-internal.h"

bool tempered_type_hid_get_temperature_si7021(
tempered_device *device, struct tempered_type_hid_sensor *sensor,
struct tempered_type_hid_query_result *group_data, float *tempC
) {
if (
group_data->length <= sensor->temperature_high_byte_offset ||
group_data->length <= sensor->temperature_low_byte_offset
) {
tempered_set_error(
device, strdup( "Not enough data was read from the sensor." )
);
return false;
}

// Convert from two separate data bytes to a single integer.
// The result should be an unsigned int between 0x0000 and 0xFFFF.
int low_byte_offset = sensor->temperature_low_byte_offset;
int high_byte_offset = sensor->temperature_high_byte_offset;
int temp = ( group_data->data[low_byte_offset] & 0xFF )
+ ( ( group_data->data[high_byte_offset] & 0xFF ) << 8 )
;

// These formulas and values are based on the Silicon Labs Si7021 datasheet
*tempC = 175.72*temp/65536 - 46.85;

return true;
}

bool tempered_type_hid_get_humidity_si7021(
tempered_device *device, struct tempered_type_hid_sensor *sensor,
struct tempered_type_hid_query_result *group_data, float *rel_hum
) {
float tempC;
if (
!tempered_type_hid_get_temperature_si7021(
device, sensor, group_data, &tempC
)
) {
return false;
}

if (
group_data->length <= sensor->humidity_high_byte_offset ||
group_data->length <= sensor->humidity_low_byte_offset
)
{
tempered_set_error(
device, strdup( "Not enough data was read from the sensor." )
);
return false;
}

int low_byte_offset = sensor->humidity_low_byte_offset;
int high_byte_offset = sensor->humidity_high_byte_offset;
int rh = ( group_data->data[low_byte_offset] & 0xFF )
+ ( ( group_data->data[high_byte_offset] & 0xFF ) << 8 )
;

// These formulas and values are based on the Silicon Labs Si7021 datasheet
*rel_hum = 125.*rh/65536 - 6;

return true;
}
20 changes: 20 additions & 0 deletions libtempered/type_hid/si7021.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#ifndef TEMPERED__TYPE_HID__SI7021_H
#define TEMPERED__TYPE_HID__SI7021_H

#include <stdbool.h>

#include "type-info.h"

// These methods are for the Silicon Labs Si7021 chip.

bool tempered_type_hid_get_temperature_si7021(
tempered_device *device, struct tempered_type_hid_sensor *sensor,
struct tempered_type_hid_query_result *group_data, float *tempC
);

bool tempered_type_hid_get_humidity_si7021(
tempered_device *device, struct tempered_type_hid_sensor *sensor,
struct tempered_type_hid_query_result *group_data, float *rel_hum
);

#endif