Skip to content

Commit

Permalink
Update and Add SHT3X_V3 driver (#1314)
Browse files Browse the repository at this point in the history
* Add alternative support for SHT3x enabled with define USE_SHT3X_V2 in
user_config.h (#1314)
 * Add alternative support for SHT3x enabled with
define USE_SHT3X_V3 in user_config.h (#1314)
  • Loading branch information
arendst committed Dec 8, 2017
1 parent 7013f4a commit 97513fa
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 3 deletions.
3 changes: 2 additions & 1 deletion sonoff/_releasenotes.ino
Expand Up @@ -10,7 +10,8 @@
* Add multipress support and more user configurable options to Sonoff Dual R2 (#1291)
* Fix Sonoff Bridge missed learned key if learned data contains 0x55 (End of Transmission) flag (#1095, #1294)
* Add support for TSL2561 using adafruit library (#661, #1311)
* Add alternative support for SHT3x (#1314)
* Add alternative support for SHT3x enabled with define USE_SHT3X_V2 in user_config.h (#1314)
* Add alternative support for SHT3x enabled with define USE_SHT3X_V3 in user_config.h (#1314)
*
* 5.10.0 20171201
* Upgrade library ArduinoJson to 5.11.2
Expand Down
1 change: 1 addition & 0 deletions sonoff/user_config.h
Expand Up @@ -171,6 +171,7 @@
#define USE_SHT // Add I2C emulating code for SHT1X sensor (+1k4 code)
// #define USE_SHT3X // Add I2C code for SHT3x sensor based on Adafruit (+0k7 code)
// #define USE_SHT3X_V2 // Add I2C code for SHT3x sensor based on EspEasy (+0k7 code)
// #define USE_SHT3X_V3 // Add I2C code for SHT3x sensor based on Wemos (+0k7 code)
#define USE_HTU // Add I2C code for HTU21/SI7013/SI7020/SI7021 sensor (+1k5 code)
#define USE_BMP // Add I2C code for BMP085/BMP180/BMP280/BME280 sensor (+4k code)
// #define USE_BME680 // Add additional support for BME680 sensor using Adafruit Sensor and BME680 libraries (+6k code)
Expand Down
2 changes: 1 addition & 1 deletion sonoff/xsns_14_sht3x.ino
Expand Up @@ -64,7 +64,7 @@ bool Sht3xRead(float &t, float &h)
// }
t = ConvertTemp((float)((((data[0] << 8) | data[1]) * 175) / 65535.0) - 45);
h = (float)((((data[3] << 8) | data[4]) * 100) / 65535.0);
return (!isnan(t) && !isnan(h));
return true;
}

/********************************************************************************************/
Expand Down
2 changes: 1 addition & 1 deletion sonoff/xsns_14_sht3x_v2.ino
Expand Up @@ -61,7 +61,7 @@ bool Sht3xRead(float &t, float &h)
}
t = ConvertTemp((float)((((data[0] << 8) | data[1]) * 175) / 65535.0) - 45);
h = (float)((((data[3] << 8) | data[4]) * 100) / 65535.0);
return (!isnan(t) && !isnan(h));
return true;
}

/********************************************************************************************/
Expand Down
156 changes: 156 additions & 0 deletions sonoff/xsns_14_sht3x_v3.ino
@@ -0,0 +1,156 @@
/*
xsns_14_sht3x.ino - SHT3X temperature and humidity sensor support for Sonoff-Tasmota
Copyright (C) 2017 Theo Arends
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_SHT3X_V3
/*********************************************************************************************\
* SHT3X - Temperature and Humidy
*
* Required library: none but based on Wemos library
*
* I2C Address: 0x44 or 0x45
\*********************************************************************************************/

#define SHT3X_ADDR_GND 0x44 // address pin low (GND)
#define SHT3X_ADDR_VDD 0x45 // address pin high (VDD)

uint8_t sht3x_type = 0;
uint8_t sht3x_address;
uint8_t sht3x_addresses[] = { SHT3X_ADDR_GND, SHT3X_ADDR_VDD };

bool Sht3xConvert()
{
if (sht3x_type) {
// Start I2C Transmission
Wire.beginTransmission(sht3x_address);
// Send measurement command
Wire.write(0x2C);
Wire.write(0x06);
// Stop I2C transmission
if (Wire.endTransmission() != 0) {
return false;
}
}
return true;
}

bool Sht3xRead(float &t, float &h)
{
unsigned int data[6];

t = NAN;
h = NAN;

// Request 6 bytes of data
Wire.requestFrom(sht3x_address, (uint8_t)6);
// Read 6 bytes of data
// cTemp msb, cTemp lsb, cTemp crc, humidity msb, humidity lsb, humidity crc
for (int i = 0; i < 6; i++) {
data[i] = Wire.read();
};
delay(50);
if (Wire.available() != 0) {
return false;
}
// Convert the data
t = ConvertTemp((float)((((data[0] << 8) | data[1]) * 175) / 65535.0) - 45);
h = (float)((((data[3] << 8) | data[4]) * 100) / 65535.0);
return true;
}

/********************************************************************************************/

void Sht3xDetect()
{
if (sht3x_type) {
return;
}

sht3x_type = 1;
for (byte i = 0; i < sizeof(sht3x_addresses); i++) {
sht3x_address = sht3x_addresses[i];
if (Sht3xConvert()) {
snprintf_P(log_data, sizeof(log_data), S_LOG_I2C_FOUND_AT, "SHT3X", sht3x_address);
AddLog(LOG_LEVEL_DEBUG);
return;
}
}
sht3x_type = 0;
}

void Sht3xShow(boolean json)
{
if (sht3x_type) {
float t;
float h;
if (Sht3xRead(t, h)) {
char temperature[10];
char humidity[10];
dtostrfd(t, Settings.flag2.temperature_resolution, temperature);
dtostrfd(h, Settings.flag2.humidity_resolution, humidity);

if (json) {
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, "SHT3X", temperature, humidity);
#ifdef USE_DOMOTICZ
DomoticzTempHumSensor(temperature, humidity);
#endif // USE_DOMOTICZ
#ifdef USE_WEBSERVER
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_TEMP, mqtt_data, "SHT3X", temperature, TempUnit());
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_HUM, mqtt_data, "SHT3X", humidity);
#endif // USE_WEBSERVER
}
}
}
}

/*********************************************************************************************\
* Interface
\*********************************************************************************************/

#define XSNS_14

boolean Xsns14(byte function)
{
boolean result = false;

if (i2c_flg) {
switch (function) {
case FUNC_XSNS_INIT:
Sht3xDetect();
break;
case FUNC_XSNS_PREP:
Sht3xConvert();
break;
case FUNC_XSNS_JSON_APPEND:
Sht3xShow(1);
break;
#ifdef USE_WEBSERVER
case FUNC_XSNS_WEB:
Sht3xShow(0);
Sht3xConvert();
break;
#endif // USE_WEBSERVER
}
}
return result;
}

#endif // USE_SHT3X_V3
#endif // USE_I2C

0 comments on commit 97513fa

Please sign in to comment.