mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-14 06:16:35 +00:00
Adds support for SPL06_007 Temperature & Pressure I2C (+10k2 code) (#21185)
* Adds support for SPL06_007 (+10k2 code) * removes not so used methods. Removes -2kb * change doubles to floats * fixes a name * change sns idx to 25
This commit is contained in:
parent
f01e74f605
commit
13cbf26b87
@ -136,7 +136,7 @@ In addition to @arendst the following code is mainly owned by:
|
|||||||
| xsns_22_sr04 | Nuno Ferreira, @arendst
|
| xsns_22_sr04 | Nuno Ferreira, @arendst
|
||||||
| xsns_23_me007 | Mathias Buder
|
| xsns_23_me007 | Mathias Buder
|
||||||
| xsns_24_si1145 |
|
| xsns_24_si1145 |
|
||||||
| xsns_25 |
|
| xsns_25_spl06-007_sensor | @rai68
|
||||||
| xsns_26_lm75ad | Andre Thomas
|
| xsns_26_lm75ad | Andre Thomas
|
||||||
| xsns_27_apds9960 | Shawn Hymel
|
| xsns_27_apds9960 | Shawn Hymel
|
||||||
| xsns_28 |
|
| xsns_28 |
|
||||||
|
@ -125,5 +125,5 @@ Index | Define | Driver | Device | Address(es) | Bus2 | Descrip
|
|||||||
85 | USE_ENS210 | xsns_112 | ENS210 | 0x43 - 0x44 | | Temperature and humidity sensor
|
85 | USE_ENS210 | xsns_112 | ENS210 | 0x43 - 0x44 | | Temperature and humidity sensor
|
||||||
86 | USE_AMSX915 | xsns_114 | AMS5915 | 0x28 | | Pressure (absolute/differential) and temperature sensor
|
86 | USE_AMSX915 | xsns_114 | AMS5915 | 0x28 | | Pressure (absolute/differential) and temperature sensor
|
||||||
86 | USE_AMSX915 | xsns_114 | AMS6915 | 0x28 | | Pressure (absolute/differential) and temperature sensor
|
86 | USE_AMSX915 | xsns_114 | AMS6915 | 0x28 | | Pressure (absolute/differential) and temperature sensor
|
||||||
|
95 | USE_SPL06_007 | xsns_126 | SPL06-007 | 0x76 | | Pressure and temperature sensor
|
||||||
NOTE: Bus2 supported on ESP32 only.
|
NOTE: Bus2 supported on ESP32 only.
|
||||||
|
7
lib/lib_i2c/SPL06_007/README.md
Normal file
7
lib/lib_i2c/SPL06_007/README.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# SPL06-007
|
||||||
|
Ardino SPL06-007 Library
|
||||||
|
|
||||||
|
This is a work in progress to create a working Arduino library for the SPL06-007 pressure sensor. I am able to get the coefficents, pressure, and temperature readings from the sensor. Need to convert to a standard Arduino library format. Code was developed and tested on an ESP32 microcontroller.
|
||||||
|
|
||||||
|
Link to datasheet
|
||||||
|
https://datasheet.lcsc.com/szlcsc/1912111437_Goertek-SPL06-007_C233787.pdf
|
Binary file not shown.
119
lib/lib_i2c/SPL06_007/examples/Pressure_Info/Pressure_Info.ino
Normal file
119
lib/lib_i2c/SPL06_007/examples/Pressure_Info/Pressure_Info.ino
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
#include <SPL06-007.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
//#define Serial SerialUSB
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Wire.begin(); // begin Wire(I2C)
|
||||||
|
Serial.begin(115200); // begin Serial
|
||||||
|
|
||||||
|
Serial.println("\nGoertek-SPL06-007 Demo\n");
|
||||||
|
|
||||||
|
SPL_init(); // Setup initial SPL chip registers - default i2c address 0x76
|
||||||
|
// SPL_init(0x77); // Uncomment for alternate I2C address 0x77
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
// ---- Register Values ----------------
|
||||||
|
Serial.print("ID: ");
|
||||||
|
Serial.println(get_spl_id());
|
||||||
|
|
||||||
|
Serial.print("PRS_CFG: ");
|
||||||
|
Serial.println(get_spl_prs_cfg(),BIN);
|
||||||
|
|
||||||
|
Serial.print("TMP_CFG: ");
|
||||||
|
Serial.println(get_spl_tmp_cfg(),BIN);
|
||||||
|
|
||||||
|
Serial.print("MEAS_CFG: ");
|
||||||
|
Serial.println(get_spl_meas_cfg(),BIN);
|
||||||
|
|
||||||
|
Serial.print("CFG_REG: ");
|
||||||
|
Serial.println(get_spl_cfg_reg(),BIN);
|
||||||
|
|
||||||
|
Serial.print("INT_STS: ");
|
||||||
|
Serial.println(get_spl_int_sts(),BIN);
|
||||||
|
|
||||||
|
Serial.print("FIFO_STS: ");
|
||||||
|
Serial.println(get_spl_fifo_sts(),BIN);
|
||||||
|
|
||||||
|
|
||||||
|
// ---- Coefficients ----------------
|
||||||
|
Serial.print("c0: ");
|
||||||
|
Serial.println(get_c0());
|
||||||
|
|
||||||
|
Serial.print("c1: ");
|
||||||
|
Serial.println(get_c1());
|
||||||
|
|
||||||
|
Serial.print("c00: ");
|
||||||
|
Serial.println(get_c00());
|
||||||
|
|
||||||
|
Serial.print("c10: ");
|
||||||
|
Serial.println(get_c10());
|
||||||
|
|
||||||
|
Serial.print("c01: ");
|
||||||
|
Serial.println(get_c01());
|
||||||
|
|
||||||
|
Serial.print("c11: ");
|
||||||
|
Serial.println(get_c11());
|
||||||
|
|
||||||
|
Serial.print("c20: ");
|
||||||
|
Serial.println(get_c20());
|
||||||
|
|
||||||
|
Serial.print("c21: ");
|
||||||
|
Serial.println(get_c21());
|
||||||
|
|
||||||
|
Serial.print("c30: ");
|
||||||
|
Serial.println(get_c30());
|
||||||
|
|
||||||
|
|
||||||
|
// ---- Temperature Values ----------------
|
||||||
|
Serial.print("traw: ");
|
||||||
|
Serial.println(get_traw());
|
||||||
|
|
||||||
|
Serial.print("traw_sc: ");
|
||||||
|
Serial.println(get_traw_sc(),3);
|
||||||
|
|
||||||
|
Serial.print("Temperature: ");
|
||||||
|
Serial.print(get_temp_c());
|
||||||
|
Serial.println(" C");
|
||||||
|
|
||||||
|
Serial.print("Temperature: ");
|
||||||
|
Serial.print(get_temp_f());
|
||||||
|
Serial.println(" F");
|
||||||
|
|
||||||
|
|
||||||
|
// ---- Pressure Values ----------------
|
||||||
|
Serial.print("praw: ");
|
||||||
|
Serial.println(get_praw());
|
||||||
|
|
||||||
|
Serial.print("praw_sc: ");
|
||||||
|
Serial.println(get_praw_sc(),3);
|
||||||
|
|
||||||
|
Serial.print("pcomp: ");
|
||||||
|
Serial.println(get_pcomp(),2);
|
||||||
|
|
||||||
|
Serial.print("Measured Air Pressure: ");
|
||||||
|
Serial.print(get_pressure(),2);
|
||||||
|
Serial.println(" mb");
|
||||||
|
|
||||||
|
|
||||||
|
// ---- Altitude Values ----------------
|
||||||
|
double local_pressure = 1011.3; // Look up local sea level pressure on google // Local pressure from airport website 8/22
|
||||||
|
Serial.print("Local Airport Sea Level Pressure: ");
|
||||||
|
Serial.print(local_pressure,2);
|
||||||
|
Serial.println(" mb");
|
||||||
|
|
||||||
|
Serial.print("altitude: ");
|
||||||
|
Serial.print(get_altitude(get_pressure(),local_pressure),1);
|
||||||
|
Serial.println(" m");
|
||||||
|
|
||||||
|
Serial.print("altitude: ");
|
||||||
|
Serial.print(get_altitude_f(get_pressure(),local_pressure),1); // convert from meters to feet
|
||||||
|
Serial.println(" ft");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Serial.println("\n");
|
||||||
|
delay(2000);
|
||||||
|
}
|
57
lib/lib_i2c/SPL06_007/keywords.txt
Normal file
57
lib/lib_i2c/SPL06_007/keywords.txt
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
#######################################
|
||||||
|
# Syntax Coloring Map For SHT21
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Datatypes (KEYWORD1)
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
SPL06-007 KEYWORD1
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Methods and Functions (KEYWORD2)
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
SPL_init KEYWORD2
|
||||||
|
get_spl_id KEYWORD2
|
||||||
|
get_spl_prs_cfg KEYWORD2
|
||||||
|
get_spl_tmp_cfg KEYWORD2
|
||||||
|
get_spl_meas_cfg KEYWORD2
|
||||||
|
get_spl_cfg_reg KEYWORD2
|
||||||
|
get_spl_int_sts KEYWORD2
|
||||||
|
get_spl_fifo_sts KEYWORD2
|
||||||
|
|
||||||
|
get_traw KEYWORD2
|
||||||
|
get_traw_sc KEYWORD2
|
||||||
|
get_temp_c KEYWORD2
|
||||||
|
get_temperature_scale_factor KEYWORD2
|
||||||
|
|
||||||
|
|
||||||
|
get_pressure_scale_factor KEYWORD2
|
||||||
|
get_pcomp KEYWORD2
|
||||||
|
get_praw_sc KEYWORD2
|
||||||
|
get_praw KEYWORD2
|
||||||
|
get_pressure KEYWORD2
|
||||||
|
|
||||||
|
get_c0 KEYWORD2
|
||||||
|
get_c1 KEYWORD2
|
||||||
|
get_c00 KEYWORD2
|
||||||
|
get_c10 KEYWORD2
|
||||||
|
get_c01 KEYWORD2
|
||||||
|
get_c11 KEYWORD2
|
||||||
|
get_c20 KEYWORD2
|
||||||
|
get_c21 KEYWORD2
|
||||||
|
get_c30 KEYWORD2
|
||||||
|
i2c_eeprom_write_uint8_t KEYWORD2
|
||||||
|
i2c_eeprom_read_uint8_t KEYWORD2
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Instances (KEYWORD2)
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Constants (LITERAL1)
|
||||||
|
#######################################
|
11
lib/lib_i2c/SPL06_007/library.properties
Normal file
11
lib/lib_i2c/SPL06_007/library.properties
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
name=SPL06-007
|
||||||
|
version=0.1.0
|
||||||
|
author=rv701
|
||||||
|
maintainer=rv701
|
||||||
|
sentence=SPL06-007 library for Arduino processors
|
||||||
|
paragraph=Supports SPL06-007 I2C pressure sensor.
|
||||||
|
category=Sensors
|
||||||
|
url=https://github.com/rv701/SPL06-007
|
||||||
|
architectures=*
|
||||||
|
includes=SPL06-007.h
|
||||||
|
|
371
lib/lib_i2c/SPL06_007/src/SPL06-007.cpp
Normal file
371
lib/lib_i2c/SPL06_007/src/SPL06-007.cpp
Normal file
@ -0,0 +1,371 @@
|
|||||||
|
#include "SPL06-007.h"
|
||||||
|
#include "Wire.h"
|
||||||
|
|
||||||
|
uint8_t SPL_CHIP_ADDRESS = 0x76;
|
||||||
|
|
||||||
|
void SPL_init(uint8_t spl_address)
|
||||||
|
{
|
||||||
|
if(spl_address == 0x77)
|
||||||
|
SPL_CHIP_ADDRESS = 0x77;
|
||||||
|
|
||||||
|
// ---- Oversampling of >8x for temperature or pressuse requires FIFO operational mode which is not implemented ---
|
||||||
|
// ---- Use rates of 8x or less until feature is implemented ---
|
||||||
|
i2c_eeprom_write_uint8_t(SPL_CHIP_ADDRESS, 0X06, 0x03); // Pressure 8x oversampling
|
||||||
|
|
||||||
|
i2c_eeprom_write_uint8_t(SPL_CHIP_ADDRESS, 0X07, 0X83); // Temperature 8x oversampling
|
||||||
|
|
||||||
|
i2c_eeprom_write_uint8_t(SPL_CHIP_ADDRESS, 0X08, 0B0111); // continuous temp and pressure measurement
|
||||||
|
|
||||||
|
i2c_eeprom_write_uint8_t(SPL_CHIP_ADDRESS, 0X09, 0X00); // FIFO Pressure measurement
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t get_spl_id()
|
||||||
|
{
|
||||||
|
return i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0x0D);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t get_spl_prs_cfg()
|
||||||
|
{
|
||||||
|
return i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0x06);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t get_spl_tmp_cfg()
|
||||||
|
{
|
||||||
|
return i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0x07);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t get_spl_meas_cfg()
|
||||||
|
{
|
||||||
|
return i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0x08);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t get_spl_cfg_reg()
|
||||||
|
{
|
||||||
|
return i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0x09);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t get_spl_int_sts()
|
||||||
|
{
|
||||||
|
return i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0x0A);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t get_spl_fifo_sts()
|
||||||
|
{
|
||||||
|
return i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0x0B);
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_traw_sc() {
|
||||||
|
int32_t traw = get_traw();
|
||||||
|
return (float(traw)/get_temperature_scale_factor());
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_temp_c() {
|
||||||
|
int16_t c0,c1;
|
||||||
|
c0 = get_c0();
|
||||||
|
c1 = get_c1();
|
||||||
|
float traw_sc = get_traw_sc();
|
||||||
|
return (float(c0) * 0.5f) + (float(c1) * traw_sc);
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_temperature_scale_factor()
|
||||||
|
{
|
||||||
|
float k;
|
||||||
|
uint8_t tmp_Byte;
|
||||||
|
tmp_Byte = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X07); // MSB
|
||||||
|
//tmp_Byte = tmp_Byte >> 4; //Focus on bits 6-4
|
||||||
|
tmp_Byte = tmp_Byte & 0B00000111;
|
||||||
|
|
||||||
|
switch (tmp_Byte)
|
||||||
|
{
|
||||||
|
case 0B000:
|
||||||
|
k = 524288.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B001:
|
||||||
|
k = 1572864.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B010:
|
||||||
|
k = 3670016.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B011:
|
||||||
|
k = 7864320.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B100:
|
||||||
|
k = 253952.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B101:
|
||||||
|
k = 516096.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B110:
|
||||||
|
k = 1040384.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B111:
|
||||||
|
k = 2088960.0f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t get_traw()
|
||||||
|
{
|
||||||
|
int32_t tmp;
|
||||||
|
uint8_t tmp_MSB,tmp_LSB,tmp_XLSB;
|
||||||
|
tmp_MSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X03); // MSB
|
||||||
|
|
||||||
|
tmp_LSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X04); // LSB
|
||||||
|
|
||||||
|
tmp_XLSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X05); // XLSB
|
||||||
|
|
||||||
|
tmp = (tmp_MSB << 8) | tmp_LSB;
|
||||||
|
tmp = (tmp << 8) | tmp_XLSB;
|
||||||
|
|
||||||
|
if(tmp & (1 << 23))
|
||||||
|
tmp = tmp | 0XFF000000; // Set left bits to one for 2's complement conversion of negitive number
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_praw_sc()
|
||||||
|
{
|
||||||
|
int32_t praw = get_praw();
|
||||||
|
return (float(praw)/get_pressure_scale_factor());
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_pcomp()
|
||||||
|
{
|
||||||
|
int32_t c00,c10;
|
||||||
|
int16_t c01,c11,c20,c21,c30;
|
||||||
|
c00 = get_c00();
|
||||||
|
c10 = get_c10();
|
||||||
|
c01 = get_c01();
|
||||||
|
c11 = get_c11();
|
||||||
|
c20 = get_c20();
|
||||||
|
c21 = get_c21();
|
||||||
|
c30 = get_c30();
|
||||||
|
float traw_sc = get_traw_sc();
|
||||||
|
float praw_sc = get_praw_sc();
|
||||||
|
return float(c00) + praw_sc * (float(c10) + praw_sc * (float(c20) + praw_sc * float(c30))) + traw_sc * float(c01) + traw_sc * praw_sc * ( float(c11) + praw_sc * float(c21));
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_pressure()
|
||||||
|
{
|
||||||
|
return get_pcomp() / 100; // convert to mb
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_pressure_scale_factor()
|
||||||
|
{
|
||||||
|
float k;
|
||||||
|
|
||||||
|
uint8_t tmp_Byte;
|
||||||
|
tmp_Byte = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X06); // MSB
|
||||||
|
|
||||||
|
tmp_Byte = tmp_Byte & 0B00000111; // Focus on 2-0 oversampling rate
|
||||||
|
|
||||||
|
|
||||||
|
switch (tmp_Byte) // oversampling rate
|
||||||
|
{
|
||||||
|
case 0B000:
|
||||||
|
k = 524288.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B001:
|
||||||
|
k = 1572864.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B010:
|
||||||
|
k = 3670016.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B011:
|
||||||
|
k = 7864320.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B100:
|
||||||
|
k = 253952.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B101:
|
||||||
|
k = 516096.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B110:
|
||||||
|
k = 1040384.0f;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0B111:
|
||||||
|
k = 2088960.0f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return k;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t get_praw()
|
||||||
|
{
|
||||||
|
int32_t tmp;
|
||||||
|
uint8_t tmp_MSB,tmp_LSB,tmp_XLSB;
|
||||||
|
tmp_MSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X00); // MSB
|
||||||
|
|
||||||
|
|
||||||
|
tmp_LSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X01); // LSB
|
||||||
|
|
||||||
|
|
||||||
|
tmp_XLSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X02); // XLSB
|
||||||
|
|
||||||
|
|
||||||
|
tmp = (tmp_MSB << 8) | tmp_LSB;
|
||||||
|
tmp = (tmp << 8) | tmp_XLSB;
|
||||||
|
|
||||||
|
if(tmp & (1 << 23))
|
||||||
|
tmp = tmp | 0XFF000000; // Set left bits to one for 2's complement conversion of negitive number
|
||||||
|
|
||||||
|
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t get_c0()
|
||||||
|
{
|
||||||
|
int16_t tmp;
|
||||||
|
uint8_t tmp_MSB,tmp_LSB;
|
||||||
|
|
||||||
|
tmp_MSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X10);
|
||||||
|
tmp_LSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X11);
|
||||||
|
|
||||||
|
tmp_LSB = tmp_LSB >> 4;
|
||||||
|
|
||||||
|
tmp = (tmp_MSB << 4) | tmp_LSB;
|
||||||
|
|
||||||
|
if(tmp & (1 << 11)) // Check for 2's complement negative number
|
||||||
|
tmp = tmp | 0XF000; // Set left bits to one for 2's complement conversion of negitive number
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t get_c1()
|
||||||
|
{
|
||||||
|
int16_t tmp;
|
||||||
|
uint8_t tmp_MSB,tmp_LSB;
|
||||||
|
|
||||||
|
tmp_MSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X11);
|
||||||
|
tmp_LSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X12);
|
||||||
|
|
||||||
|
tmp_MSB = tmp_MSB & 0XF;
|
||||||
|
|
||||||
|
tmp = (tmp_MSB << 8) | tmp_LSB;
|
||||||
|
|
||||||
|
if(tmp & (1 << 11)) // Check for 2's complement negative number
|
||||||
|
tmp = tmp | 0XF000; // Set left bits to one for 2's complement conversion of negitive number
|
||||||
|
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t get_c00()
|
||||||
|
{
|
||||||
|
int32_t tmp;
|
||||||
|
uint8_t tmp_MSB,tmp_LSB,tmp_XLSB;
|
||||||
|
|
||||||
|
tmp_MSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X13);
|
||||||
|
tmp_LSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X14);
|
||||||
|
tmp_XLSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X15);
|
||||||
|
tmp = (tmp_MSB & 0x80 ? 0xFFF00000 : 0) | ((uint32_t)tmp_MSB << 12) | ((uint32_t)tmp_LSB << 4) | (((uint32_t)tmp_XLSB & 0xF0) >> 4);
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t get_c10()
|
||||||
|
{
|
||||||
|
int32_t tmp;
|
||||||
|
uint8_t tmp_MSB,tmp_LSB,tmp_XLSB;
|
||||||
|
|
||||||
|
tmp_MSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X15); // 4 bits
|
||||||
|
tmp_LSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X16); // 8 bits
|
||||||
|
tmp_XLSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X17); // 8 bits
|
||||||
|
tmp = (tmp_MSB & 0x8 ? 0xFFF00000 : 0) | (((uint32_t)tmp_MSB & 0x0F) << 16) | ((uint32_t)tmp_LSB << 8) | (uint32_t)tmp_XLSB;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t get_c01()
|
||||||
|
{
|
||||||
|
int16_t tmp;
|
||||||
|
uint8_t tmp_MSB,tmp_LSB;
|
||||||
|
|
||||||
|
tmp_MSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X18);
|
||||||
|
tmp_LSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X19);
|
||||||
|
|
||||||
|
tmp = (tmp_MSB << 8) | tmp_LSB;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t get_c11()
|
||||||
|
{
|
||||||
|
int16_t tmp;
|
||||||
|
uint8_t tmp_MSB,tmp_LSB;
|
||||||
|
|
||||||
|
tmp_MSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X1A);
|
||||||
|
tmp_LSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X1B);
|
||||||
|
|
||||||
|
tmp = (tmp_MSB << 8) | tmp_LSB;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t get_c20()
|
||||||
|
{
|
||||||
|
int16_t tmp;
|
||||||
|
uint8_t tmp_MSB,tmp_LSB;
|
||||||
|
|
||||||
|
tmp_MSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X1C);
|
||||||
|
tmp_LSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X1D);
|
||||||
|
|
||||||
|
tmp = (tmp_MSB << 8) | tmp_LSB;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t get_c21()
|
||||||
|
{
|
||||||
|
int16_t tmp;
|
||||||
|
uint8_t tmp_MSB,tmp_LSB;
|
||||||
|
|
||||||
|
tmp_MSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X1E);
|
||||||
|
tmp_LSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X1F);
|
||||||
|
|
||||||
|
tmp = (tmp_MSB << 8) | tmp_LSB;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t get_c30()
|
||||||
|
{
|
||||||
|
int16_t tmp;
|
||||||
|
uint8_t tmp_MSB,tmp_LSB;
|
||||||
|
|
||||||
|
tmp_MSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X20);
|
||||||
|
tmp_LSB = i2c_eeprom_read_uint8_t(SPL_CHIP_ADDRESS, 0X21);
|
||||||
|
|
||||||
|
tmp = (tmp_MSB << 8) | tmp_LSB;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void i2c_eeprom_write_uint8_t( uint8_t deviceaddress, uint8_t eeaddress, uint8_t data )
|
||||||
|
{
|
||||||
|
uint8_t rdata = data;
|
||||||
|
delay(5); // Make sure to delay log enough for EEPROM I2C refresh time
|
||||||
|
Wire.beginTransmission(deviceaddress);
|
||||||
|
Wire.write((uint8_t)(eeaddress));
|
||||||
|
Wire.write(rdata);
|
||||||
|
Wire.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t i2c_eeprom_read_uint8_t( uint8_t deviceaddress, uint8_t eeaddress )
|
||||||
|
{
|
||||||
|
uint8_t rdata = 0xFF;
|
||||||
|
Wire.beginTransmission(deviceaddress);
|
||||||
|
Wire.write(eeaddress);
|
||||||
|
Wire.endTransmission(false); // false to not release the line
|
||||||
|
|
||||||
|
Wire.requestFrom(deviceaddress,1);
|
||||||
|
if (Wire.available()) rdata = Wire.read();
|
||||||
|
return rdata;
|
||||||
|
}
|
37
lib/lib_i2c/SPL06_007/src/SPL06-007.h
Normal file
37
lib/lib_i2c/SPL06_007/src/SPL06-007.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#include "Arduino.h"
|
||||||
|
|
||||||
|
void SPL_init(uint8_t spl_address=0x76);
|
||||||
|
|
||||||
|
uint8_t get_spl_id(); // Get ID Register 0x0D
|
||||||
|
uint8_t get_spl_prs_cfg(); // Get PRS_CFG Register 0x06
|
||||||
|
uint8_t get_spl_tmp_cfg(); // Get TMP_CFG Register 0x07
|
||||||
|
uint8_t get_spl_meas_cfg(); // Get MEAS_CFG Register 0x08
|
||||||
|
uint8_t get_spl_cfg_reg(); // Get CFG_REG Register 0x09
|
||||||
|
uint8_t get_spl_int_sts(); // Get INT_STS Register 0x0A
|
||||||
|
uint8_t get_spl_fifo_sts(); // Get FIFO_STS Register 0x0B
|
||||||
|
|
||||||
|
|
||||||
|
int32_t get_traw();
|
||||||
|
float get_traw_sc();
|
||||||
|
float get_temp_c();
|
||||||
|
float get_temperature_scale_factor();
|
||||||
|
|
||||||
|
int32_t get_praw();
|
||||||
|
float get_praw_sc();
|
||||||
|
float get_pcomp();
|
||||||
|
float get_pressure_scale_factor();
|
||||||
|
float get_pressure();
|
||||||
|
|
||||||
|
int16_t get_c0();
|
||||||
|
int16_t get_c1();
|
||||||
|
int32_t get_c00();
|
||||||
|
int32_t get_c10();
|
||||||
|
int16_t get_c01();
|
||||||
|
int16_t get_c11();
|
||||||
|
int16_t get_c20();
|
||||||
|
int16_t get_c21();
|
||||||
|
int16_t get_c30();
|
||||||
|
|
||||||
|
void i2c_eeprom_write_uint8_t( uint8_t deviceaddress, uint8_t eeaddress, uint8_t data );
|
||||||
|
uint8_t i2c_eeprom_read_uint8_t( uint8_t deviceaddress, uint8_t eeaddress );
|
||||||
|
|
@ -258,6 +258,7 @@
|
|||||||
#define USE_LOX_O2 // Add support for LuminOx LOX O2 Sensor (+0k8 code)
|
#define USE_LOX_O2 // Add support for LuminOx LOX O2 Sensor (+0k8 code)
|
||||||
#undef DEBUG_THEO // Disable debug code
|
#undef DEBUG_THEO // Disable debug code
|
||||||
#undef USE_DEBUG_DRIVER // Disable debug code
|
#undef USE_DEBUG_DRIVER // Disable debug code
|
||||||
|
//#define USE_SPL06_007 // Adds support for SPL06_007 (+10k2 code)
|
||||||
#endif // FIRMWARE_SENSORS
|
#endif // FIRMWARE_SENSORS
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
|
@ -916,6 +916,9 @@ constexpr uint32_t feature[] = {
|
|||||||
#if defined(USE_SPI) && defined(USE_SPI_LORA)
|
#if defined(USE_SPI) && defined(USE_SPI_LORA)
|
||||||
0x00000010 | // xdrv_73_9_lora.ino
|
0x00000010 | // xdrv_73_9_lora.ino
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(USE_I2C) && defined(USE_SPL06_007)
|
||||||
|
0x10000000 | // xsns_25_spl006-7_sensor.ino
|
||||||
|
#endif
|
||||||
// 0x00000020 | //
|
// 0x00000020 | //
|
||||||
// 0x00000040 | //
|
// 0x00000040 | //
|
||||||
// 0x00000080 | //
|
// 0x00000080 | //
|
||||||
|
133
tasmota/tasmota_xsns_sensor/xsns_25_spl06-007_sensor.ino
Normal file
133
tasmota/tasmota_xsns_sensor/xsns_25_spl06-007_sensor.ino
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
xsns_25_spl06-007_sensor.ino - SPL06-007 Temperature and Pressure sensor support for Tasmota
|
||||||
|
|
||||||
|
Copyright (C) 2024 rai68
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef USE_I2C
|
||||||
|
#ifdef USE_SPL06_007
|
||||||
|
|
||||||
|
/*********************************************************************************************\
|
||||||
|
* SPL006/7 Temperature and Pressure sensor support for Tasmota
|
||||||
|
*
|
||||||
|
* Source: rv701
|
||||||
|
*
|
||||||
|
* I2C Address: 0x76
|
||||||
|
\*********************************************************************************************/
|
||||||
|
|
||||||
|
#define XSNS_25 25
|
||||||
|
#define XI2C_95 95 // See I2CDEVICES.md
|
||||||
|
|
||||||
|
#include "SPL06-007.h"
|
||||||
|
|
||||||
|
#define SPL007_ADDRESS 0x76
|
||||||
|
|
||||||
|
struct SPL007 {
|
||||||
|
float temperature = NAN;
|
||||||
|
float pressure = NAN;
|
||||||
|
uint8_t address;
|
||||||
|
bool valid = false;
|
||||||
|
} spl007_s;
|
||||||
|
|
||||||
|
/********************************************************************************************/
|
||||||
|
|
||||||
|
void spl007Detect(void)
|
||||||
|
{
|
||||||
|
if (!I2cActive(SPL007_ADDRESS))
|
||||||
|
{
|
||||||
|
SPL_init();
|
||||||
|
if (get_spl_id() != 16) {
|
||||||
|
AddLog(LOG_LEVEL_ERROR, PSTR("SPL06-007:@%02X not found error!"), SPL007_ADDRESS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
spl007_s.valid = true;
|
||||||
|
I2cSetActiveFound(SPL007_ADDRESS, "SPL06-007");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void spl007Update(void) // Perform every n second
|
||||||
|
{
|
||||||
|
spl007_s.temperature = ConvertTemp(get_temp_c());
|
||||||
|
spl007_s.pressure = ConvertPressure(get_pressure());
|
||||||
|
}
|
||||||
|
|
||||||
|
void spl007Show(bool json)
|
||||||
|
{
|
||||||
|
|
||||||
|
float sealevel = ConvertPressureForSeaLevel(spl007_s.pressure);
|
||||||
|
char sea_pressure[33];
|
||||||
|
dtostrfd(sealevel, Settings->flag2.pressure_resolution, sea_pressure);
|
||||||
|
|
||||||
|
char str_pressure[33];
|
||||||
|
dtostrfd(spl007_s.pressure, Settings->flag2.pressure_resolution, str_pressure);
|
||||||
|
|
||||||
|
if (json) {
|
||||||
|
ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_TEMPERATURE "\":%*_f,\"" D_JSON_PRESSURE "\":%s"),
|
||||||
|
"SPL06-007", Settings->flag2.temperature_resolution, &spl007_s.temperature, str_pressure);
|
||||||
|
if (Settings->altitude != 0) {
|
||||||
|
ResponseAppend_P(PSTR(",\"" D_JSON_PRESSUREATSEALEVEL "\":%s"), sea_pressure);
|
||||||
|
}
|
||||||
|
ResponseJsonEnd();
|
||||||
|
#ifdef USE_DOMOTICZ
|
||||||
|
// Domoticz and knx only support one temp sensor
|
||||||
|
if ((0 == TasmotaGlobal.tele_period)) {
|
||||||
|
DomoticzFloatSensor(DZ_TEMP, spl007_s.temperature);
|
||||||
|
}
|
||||||
|
#endif // USE_DOMOTICZ
|
||||||
|
#ifdef USE_WEBSERVER
|
||||||
|
} else {
|
||||||
|
|
||||||
|
WSContentSend_Temp("SPL06-007", spl007_s.temperature);
|
||||||
|
WSContentSend_PD(HTTP_SNS_PRESSURE, "SPL06-007", str_pressure, PressureUnit().c_str());
|
||||||
|
if (Settings->altitude != 0) {
|
||||||
|
WSContentSend_PD(HTTP_SNS_SEAPRESSURE, "SPL06-007", sea_pressure, PressureUnit().c_str());
|
||||||
|
}
|
||||||
|
#endif // USE_WEBSERVER
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*********************************************************************************************\
|
||||||
|
* Interface
|
||||||
|
\*********************************************************************************************/
|
||||||
|
|
||||||
|
bool Xsns25(uint32_t function)
|
||||||
|
{
|
||||||
|
if (!I2cEnabled(XI2C_95)) { return false; }
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
if (FUNC_INIT == function) {
|
||||||
|
spl007Detect();
|
||||||
|
}
|
||||||
|
else if (spl007_s.valid) {
|
||||||
|
switch (function) {
|
||||||
|
case FUNC_EVERY_SECOND:
|
||||||
|
spl007Update();
|
||||||
|
break;
|
||||||
|
case FUNC_JSON_APPEND:
|
||||||
|
spl007Show(1);
|
||||||
|
break;
|
||||||
|
#ifdef USE_WEBSERVER
|
||||||
|
case FUNC_WEB_SENSOR:
|
||||||
|
spl007Show(0);
|
||||||
|
break;
|
||||||
|
#endif // USE_WEBSERVER
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // USE_SPL06_007
|
||||||
|
#endif // USE_I2C
|
@ -305,7 +305,7 @@ a_features = [[
|
|||||||
"USE_HC8","USE_HDMI_CEC","USE_BLE_ESP32","USE_MATTER_DEVICE"
|
"USE_HC8","USE_HDMI_CEC","USE_BLE_ESP32","USE_MATTER_DEVICE"
|
||||||
],[
|
],[
|
||||||
"USE_MAGIC_SWITCH","USE_PIPSOLAR","USE_GPIO_VIEWER","USE_AMSX915",
|
"USE_MAGIC_SWITCH","USE_PIPSOLAR","USE_GPIO_VIEWER","USE_AMSX915",
|
||||||
"USE_SPI_LORA","","","",
|
"USE_SPI_LORA","USE_SPL06_007","","",
|
||||||
"","","","",
|
"","","","",
|
||||||
"","","","",
|
"","","","",
|
||||||
"","","","",
|
"","","","",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user