diff --git a/README.md b/README.md index 0afd64d..2d88778 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ THIS IS STILL WORK IN PROGRESS! ## Configuration and Programming -This is the Work in Progress Repository for ATTNode v3 compatible firmware. At the moment it supports LoRa communication using OTAA and a BME280 sensor, as well as deep sleep between measurements. +This is the Work in Progress Repository for ATTNode v3 compatible firmware. At the moment it supports LoRa communication using OTAA and a BME280 or SHT21 sensor, as well as deep sleep between measurements. As there is no PlatformIO Support for the ATTiny3216 yet, it is (for now) developed using Arduino IDE and the [MegaTinyCore](https://github.com/SpenceKonde/megaTinyCore). You also need to set the correct Settings for programming the ATTiny3216 in ArduionIDE. Here is a screenshot of the settings I use: diff --git a/firmware/SHT21.cpp b/firmware/SHT21.cpp new file mode 100644 index 0000000..c55568a --- /dev/null +++ b/firmware/SHT21.cpp @@ -0,0 +1,61 @@ +/* + SHT21.cpp - SHT21 Sensor Library + Copyright (c) 2019-2020, Stefan Brand + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include "SHT21.h" + +SHT21::SHT21() {} + +uint16_t SHT21::sensorRead(uint8_t command) { + + uint8_t d = 85; // Delay after starting Measurement + if(command == SHT21_TEMPHOLD || command == SHT21_TEMPNOHOLD) d = 85; + if(command == SHT21_HUMIHOLD || command == SHT21_HUMINOHOLD) d = 30; + + // Trigger Measurement + Wire.beginTransmission(SHT21_I2CADDR); + Wire.write(command); + Wire.endTransmission(); + + // Wait for Measurement + delay(d); + + // Read and Return value + Wire.requestFrom(SHT21_I2CADDR, 2); + uint16_t result = (Wire.read() << 8) | Wire.read(); + result &= ~0x0003; // Clear CRC Bits + return result; +} + +float SHT21::getTemperature(void) { + return (-46.85 + 175.72 / 65536.0 * (float)(sensorRead(SHT21_TEMPHOLD))); +} + +float SHT21::getHumidity(void) { + return (-6.0 + 125.0 / 65536.0 * (float)(sensorRead(SHT21_HUMIHOLD))); +} diff --git a/firmware/SHT21.h b/firmware/SHT21.h new file mode 100644 index 0000000..a1210c5 --- /dev/null +++ b/firmware/SHT21.h @@ -0,0 +1,52 @@ +/* + SHT21.cpp - SHT21 Sensor Library + Copyright (c) 2019-2020, Stefan Brand + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef SHT21_H +#define SHT21_H + +#include + +#define SHT21_I2CADDR 0x40 + +#define SHT21_TEMPHOLD 0xE3 +#define SHT21_TEMPNOHOLD 0xF3 +#define SHT21_HUMIHOLD 0xE5 +#define SHT21_HUMINOHOLD 0xF5 +#define SHT21_SOFTRESET 0xFE + +class SHT21 +{ + private: + uint16_t sensorRead(uint8_t command); + + public: + SHT21(void); + + float getTemperature(void); + float getHumidity(void); +}; + +#endif diff --git a/firmware/config.h.example b/firmware/config.h.example index fae2c17..6074593 100644 --- a/firmware/config.h.example +++ b/firmware/config.h.example @@ -4,6 +4,8 @@ // Define which Sensor is installed #define HAS_BME280 +// #define HAS_SHT21 +// #define HAS_NO_SENSOR // How many Minutes to sleep between Measuring/Sending // Actual Sleep Time is SLEEP_TIME*2*32 Seconds due to the 32s sleep intervals of the ATTiny3216 diff --git a/firmware/firmware.ino b/firmware/firmware.ino index a41dde4..49cf5f4 100644 --- a/firmware/firmware.ino +++ b/firmware/firmware.ino @@ -16,6 +16,11 @@ BME280 sensor; #endif +#ifdef HAS_SHT21 +#include "SHT21.h" +SHT21 sensor; +#endif + // Define some LMIC Callbacks and Variables void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8); @@ -111,7 +116,17 @@ void blink(uint8_t num) { // All Sensor Code and Data Preparation goes here void do_send(osjob_t* j) { // Prepare LoRa Data Packet - #ifdef HAS_BME280 + #ifdef HAS_NO_SENSOR + struct lora_data { + uint8_t bat; + } __attribute ((packed)) data; + #elif defined HAS_SHT21 + struct lora_data { + uint8_t bat; + int32_t temperature; + int32_t humidity; + } __attribute__ ((packed)) data; + #elif defined HAS_BME280 struct lora_data { uint8_t bat; int32_t temperature; @@ -121,7 +136,7 @@ void do_send(osjob_t* j) { #endif if (LMIC.opmode & OP_TXRXPEND) { - delay(10); + delay(1); } else { // Add Battery Voltage (0.2V Accuracy stored in 1 byte) uint32_t batv = readSupplyVoltage(); @@ -129,7 +144,11 @@ void do_send(osjob_t* j) { if (batv % 20 > 9) data.bat += 1; - #ifdef HAS_BME280 + // Take Measurements depending on Sensor + #ifdef HAS_SHT21 + data.temperature = (int32_t)(sensor.getTemperature()*100); + data.humidity = (int32_t)(sensor.getHumidity()*100); + #elif defined HAS_BME280 sensor.getData(&data.temperature, &data.pressure, &data.humidity); #endif @@ -150,7 +169,7 @@ void setup() // Set RTC while (RTC.STATUS > 0) {} - RTC.CLKSEL = RTC_CLKSEL_INT1K_gc; + RTC.CLKSEL = RTC_CLKSEL_INT1K_gc; while (RTC.PITSTATUS > 0) {} // Initialize Sensor(s)