diff --git a/esp32test/Esp32DeepSleepTest/include/DS18B20.h b/esp32test/Esp32DeepSleepTest/include/DS18B20.h deleted file mode 100644 index 7ab8e66..0000000 --- a/esp32test/Esp32DeepSleepTest/include/DS18B20.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file DS18B20.h - * @author your name (you@domain.com) - * @brief - * @version 0.1 - * @date 2020-06-09 - * - * @copyright Copyright (c) 2020 - * Based on the LUA code from the ESP8266 - * -------------------------------------------------------------------------------- - * -- DS18B20 one wire module for NODEMCU - * -- NODEMCU TEAM - * -- LICENCE: http://opensource.org/licenses/MIT - * -- Vowstar - * -- 2015/02/14 sza2 Fix for negative values - * -------------------------------------------------------------------------------- - */ - -#ifndef DS18B20_H -#define DS18B20_H - -#include - -class Ds18B20 { - private: - OneWire* mDs; - int foundDevices; - public: - Ds18B20(int pin) { - this->mDs = new OneWire(pin); - } - - ~Ds18B20() { - delete this->mDs; - } - /** - * @brief read amount sensots - * check for available of DS18B20 sensors - * @return amount of sensors - */ - int readDevices(void); - - /** - * @brief Read all temperatures in celsius - * - * @param pTemperatures array of float valuies - * @param maxTemperatures size of the given array - * @return int amount of read temperature values - */ - int readAllTemperatures(float* pTemperatures, int maxTemperatures); -}; -#endif diff --git a/esp32test/Esp32DeepSleepTest/include/DS2438.h b/esp32test/Esp32DeepSleepTest/include/DS2438.h new file mode 100644 index 0000000..b7b2ec3 --- /dev/null +++ b/esp32test/Esp32DeepSleepTest/include/DS2438.h @@ -0,0 +1,74 @@ +/* + * DS2438.h + * + * by Joe Bechter + * + * (C) 2012, bechter.com + * + * All files, software, schematics and designs are provided as-is with no warranty. + * All files, software, schematics and designs are for experimental/hobby use. + * Under no circumstances should any part be used for critical systems where safety, + * life or property depends upon it. You are responsible for all use. + * You are free to use, modify, derive or otherwise extend for your own non-commercial purposes provided + * 1. No part of this software or design may be used to cause injury or death to humans or animals. + * 2. Use is non-commercial. + * 3. Credit is given to the author (i.e. portions © bechter.com), and provide a link to the original source. + * + */ + +#ifndef DS2438_h +#define DS2438_h + +#include +#include + +#define DS2438_TEMPERATURE_CONVERSION_COMMAND 0x44 +#define DS2438_VOLTAGE_CONVERSION_COMMAND 0xb4 +#define DS2438_WRITE_SCRATCHPAD_COMMAND 0x4e +#define DS2438_COPY_SCRATCHPAD_COMMAND 0x48 +#define DS2438_READ_SCRATCHPAD_COMMAND 0xbe +#define DS2438_RECALL_MEMORY_COMMAND 0xb8 +#define DS2438_PAGE_0 0x00 + +#define DS2438_CHA 0 +#define DS2438_CHB 1 + +#define DS2438_MODE_CHA 0x01 +#define DS2438_MODE_CHB 0x02 +#define DS2438_MODE_TEMPERATURE 0x04 + +#define DS2438_TEMPERATURE_DELAY 10 +#define DS2438_VOLTAGE_CONVERSION_DELAY 8 + +typedef uint8_t DeviceAddress[8]; + +class DS2438 { + public: + DS2438(OneWire *ow); + DS2438(OneWire *ow, uint8_t *address); + + void begin(); + void update(); + double getTemperature(); + float getVoltage(int channel=DS2438_CHA); + boolean isError(); + boolean isFound(); + private: + bool validAddress(const uint8_t*); + bool validFamily(const uint8_t* deviceAddress); + + bool deviceFound = false; + OneWire *_ow; + DeviceAddress _address; + uint8_t _mode; + double _temperature; + float _voltageA; + float _voltageB; + boolean _error; + boolean startConversion(int channel, boolean doTemperature); + boolean selectChannel(int channel); + void writePageZero(uint8_t *data); + boolean readPageZero(uint8_t *data); +}; + +#endif \ No newline at end of file diff --git a/esp32test/Esp32DeepSleepTest/src/DS18B20.cpp b/esp32test/Esp32DeepSleepTest/src/DS18B20.cpp deleted file mode 100644 index 0bc738e..0000000 --- a/esp32test/Esp32DeepSleepTest/src/DS18B20.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/** - * @file DS18B20.cpp - * @author your name (you@domain.com) - * @brief - * @version 0.1 - * @date 2020-06-09 - * - * @copyright Copyright (c) 2020 - * - */ - -#include "DS18B20.h" - -#define STARTCONV 0x44 -#define READSCRATCH 0xBE // Read EEPROM -#define TEMP_LSB 0 -#define TEMP_MSB 1 -#define SCRATCHPADSIZE 9 -#define OFFSET_CRC8 8 /**< 9th byte has the CRC of the complete data */ - -//Printf debugging -//#define DS_DEBUG - -int Ds18B20::readDevices() { - byte addr[8]; - - int amount = -1; - while (this->mDs->search(addr)) { - amount++; - } - this->mDs->reset_search(); - return amount; -} - -int Ds18B20::readAllTemperatures(float* pTemperatures, int maxTemperatures) { - byte addr[8]; - uint8_t scratchPad[SCRATCHPADSIZE]; - int currentTemp = 0; - - while (this->mDs->search(addr)) { -#ifdef DS_DEBUG - Serial.print(" ROM ="); - for (i = 0; i < 8; i++) { - Serial.write(' '); - Serial.print(addr[i], HEX); - } -#endif - this->mDs->reset(); - this->mDs->select(addr); - this->mDs->write(STARTCONV); - this->mDs->reset(); - this->mDs->select(addr); - this->mDs->write(READSCRATCH); - - // Read all registers in a simple loop - // byte 0: temperature LSB - // byte 1: temperature MSB - // byte 2: high alarm temp - // byte 3: low alarm temp - // byte 4: DS18S20: store for crc - // DS18B20 & DS1822: configuration register - // byte 5: internal use & crc - // byte 6: DS18S20: COUNT_REMAIN - // DS18B20 & DS1822: store for crc - // byte 7: DS18S20: COUNT_PER_C - // DS18B20 & DS1822: store for crc - // byte 8: SCRATCHPAD_CRC -#ifdef DS_DEBUG - Serial.write("\r\nDATA:"); - for (uint8_t i = 0; i < 9; i++) { - Serial.print(scratchPad[i], HEX); - } -#else - delay(50); -#endif - for (uint8_t i = 0; i < 9; i++) { - scratchPad[i] = this->mDs->read(); - } - uint8_t crc8 = this->mDs->crc8(scratchPad, 8); - - /* Only work an valid data */ - if (crc8 == scratchPad[OFFSET_CRC8]) { - int16_t fpTemperature = (((int16_t) scratchPad[TEMP_MSB]) << 11) - | (((int16_t) scratchPad[TEMP_LSB]) << 3); - float celsius = (float) fpTemperature * 0.0078125; -#ifdef DS_DEBUG - Serial.printf("\r\nTemp%d %f °C (Raw: %d, %x =? %x)\r\n", (currentTemp+1), celsius, fpTemperature, crc8, scratchPad[8]); -#endif - /* check, if the buffer as some space for our data */ - if (currentTemp < maxTemperatures) { - pTemperatures[currentTemp] = celsius; - } else { - return -1; - } - } - currentTemp++; - } - this->mDs->reset(); -#ifdef DS_DEBUG - Serial.println(" No more addresses."); - Serial.println(); -#endif - - return currentTemp; -} \ No newline at end of file diff --git a/esp32test/Esp32DeepSleepTest/src/DS2438.cpp b/esp32test/Esp32DeepSleepTest/src/DS2438.cpp new file mode 100644 index 0000000..67c05c0 --- /dev/null +++ b/esp32test/Esp32DeepSleepTest/src/DS2438.cpp @@ -0,0 +1,203 @@ +/* + * DS2438.cpp + * + * by Joe Bechter + * + * (C) 2012, bechter.com + * + * All files, software, schematics and designs are provided as-is with no warranty. + * All files, software, schematics and designs are for experimental/hobby use. + * Under no circumstances should any part be used for critical systems where safety, + * life or property depends upon it. You are responsible for all use. + * You are free to use, modify, derive or otherwise extend for your own non-commercial purposes provided + * 1. No part of this software or design may be used to cause injury or death to humans or animals. + * 2. Use is non-commercial. + * 3. Credit is given to the author (i.e. portions © bechter.com), and provide a link to the original source. + * + */ + +#include "DS2438.h" + +// DSROM FIELDS +#define DSROM_FAMILY 0 +#define DSROM_CRC 7 + +#define DS2438MODEL 0x26 + +DS2438::DS2438(OneWire *ow) { + _ow = ow; +}; + +void DS2438::begin(){ + DeviceAddress searchDeviceAddress; + + _ow->reset_search(); + memset(searchDeviceAddress,0, 8); + _temperature = 0; + _voltageA = 0.0; + _voltageB = 0.0; + _error = true; + _mode = (DS2438_MODE_CHA | DS2438_MODE_CHB | DS2438_MODE_TEMPERATURE); + + deviceFound = false; // Reset the number of devices when we enumerate wire devices + + while (_ow->search(searchDeviceAddress)) { + if (validAddress(searchDeviceAddress)) { + if (validFamily(searchDeviceAddress)) { + memcpy(_address,searchDeviceAddress,8); + deviceFound = true; + } + } + } +} + +bool DS2438::isFound(){ + return deviceFound; +} + +bool DS2438::validAddress(const uint8_t* deviceAddress) { + return (_ow->crc8(deviceAddress, 7) == deviceAddress[DSROM_CRC]); +} + +bool DS2438::validFamily(const uint8_t* deviceAddress) { + switch (deviceAddress[DSROM_FAMILY]) { + case DS2438MODEL: + return true; + default: + return false; + } +} + +void DS2438::update() { + uint8_t data[9]; + + _error = true; + if(!isFound()){ + return; + } + + if (_mode & DS2438_MODE_CHA || _mode == DS2438_MODE_TEMPERATURE) { + boolean doTemperature = _mode & DS2438_MODE_TEMPERATURE; + if (!startConversion(DS2438_CHA, doTemperature)) { + Serial.println("Error starting temp conversion ds2438 channel a"); + return; + } + if (!readPageZero(data)){ + Serial.println("Error reading zero page ds2438 channel a"); + return; + } + + if (doTemperature) { + _temperature = (double)(((((int16_t)data[2]) << 8) | (data[1] & 0x0ff)) >> 3) * 0.03125; + } + if (_mode & DS2438_MODE_CHA) { + _voltageA = (((data[4] << 8) & 0x00300) | (data[3] & 0x0ff)) / 100.0; + } + } + if (_mode & DS2438_MODE_CHB) { + boolean doTemperature = _mode & DS2438_MODE_TEMPERATURE && !(_mode & DS2438_MODE_CHA); + if (!startConversion(DS2438_CHB, doTemperature)) { + Serial.println("Error starting temp conversion channel b ds2438"); + return; + } + if (!readPageZero(data)){ + Serial.println("Error reading zero page ds2438 channel b"); + return; + } + if (doTemperature) { + int16_t upperByte = ((int16_t)data[2]) << 8; + int16_t lowerByte = data[1] >> 3; + int16_t fullByte = (upperByte | lowerByte); + _temperature = ((double)fullByte) * 0.03125; + } + _voltageB = (((data[4] << 8) & 0x00300) | (data[3] & 0x0ff)) / 100.0; + } + _error = false; +} + +double DS2438::getTemperature() { + return _temperature; +} + +float DS2438::getVoltage(int channel) { + if (channel == DS2438_CHA) { + return _voltageA; + } else if (channel == DS2438_CHB) { + return _voltageB; + } else { + return 0.0; + } +} + +boolean DS2438::isError() { + return _error; +} + +boolean DS2438::startConversion(int channel, boolean doTemperature) { + if(!isFound()){ + return false; + } + if (!selectChannel(channel)){ + return false; + } + _ow->reset(); + _ow->select(_address); + if (doTemperature) { + _ow->write(DS2438_TEMPERATURE_CONVERSION_COMMAND, 0); + delay(DS2438_TEMPERATURE_DELAY); + _ow->reset(); + _ow->select(_address); + } + _ow->write(DS2438_VOLTAGE_CONVERSION_COMMAND, 0); + delay(DS2438_VOLTAGE_CONVERSION_DELAY); + return true; +} + +boolean DS2438::selectChannel(int channel) { + if(!isFound()){ + return false; + } + uint8_t data[9]; + if (readPageZero(data)) { + if (channel == DS2438_CHB){ + data[0] = data[0] | 0x08; + } + else { + data[0] = data[0] & 0xf7; + } + writePageZero(data); + return true; + } + Serial.println("Could not read page zero data"); + return false; +} + +void DS2438::writePageZero(uint8_t *data) { + _ow->reset(); + _ow->select(_address); + _ow->write(DS2438_WRITE_SCRATCHPAD_COMMAND, 0); + _ow->write(DS2438_PAGE_0, 0); + for (int i = 0; i < 8; i++){ + _ow->write(data[i], 0); + } + _ow->reset(); + _ow->select(_address); + _ow->write(DS2438_COPY_SCRATCHPAD_COMMAND, 0); + _ow->write(DS2438_PAGE_0, 0); +} + +boolean DS2438::readPageZero(uint8_t *data) { + _ow->reset(); + _ow->select(_address); + _ow->write(DS2438_RECALL_MEMORY_COMMAND, 0); + _ow->write(DS2438_PAGE_0, 0); + _ow->reset(); + _ow->select(_address); + _ow->write(DS2438_READ_SCRATCHPAD_COMMAND, 0); + _ow->write(DS2438_PAGE_0, 0); + for (int i = 0; i < 9; i++){ + data[i] = _ow->read(); + } + return _ow->crc8(data, 8) == data[8]; +} + diff --git a/esp32test/Esp32DeepSleepTest/src/main.cpp b/esp32test/Esp32DeepSleepTest/src/main.cpp index 81db9b6..c5c4331 100644 --- a/esp32test/Esp32DeepSleepTest/src/main.cpp +++ b/esp32test/Esp32DeepSleepTest/src/main.cpp @@ -1,7 +1,7 @@ #include #include "esp_sleep.h" -#include #include "DallasTemperature.h" +#include "DS2438.h" #define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */ #define TIME_TO_SLEEP 5 /* Time ESP32 will go to sleep (in seconds) */ @@ -34,9 +34,9 @@ RTC_DATA_ATTR int bootCount = 0; RTC_DATA_ATTR int pumpActive = 0; int secondBootCount = 0; -Ds18B20 ds(SENSOR_DS18B20); OneWire oneWire(SENSOR_DS18B20); -DallasTemperature sensors(&oneWire); +DallasTemperature temp(&oneWire); +DS2438 battery(&oneWire); void print_wakeup_reason(){ @@ -95,24 +95,33 @@ void setup() { /* activate power pump and pump 0 */ digitalWrite(OUTPUT_PUMP, HIGH); digitalWrite(OUTPUT_SENSOR, HIGH); + + delay(1); + + temp.begin(); + battery.begin(); } - - void loop() { - Serial.println("test"); delay(200); digitalWrite(OUTPUT_PUMP0, HIGH); - sensors.begin(); - - for(int j=0; j < 5 && sensors.getDeviceCount() == 0; j++) { - delay(100); - sensors.begin(); - Serial.println("Reset 1wire"); + for(int j=0; j < 5 && temp.getDeviceCount() == 0; j++) { + delay(10); + Serial.println("Reset 1wire temp"); + temp.begin(); } - - Serial.println(sensors.getDeviceCount()); - + for(int j=0; j < 5 && (0 == battery.isFound()); j++) { + delay(10); + Serial.println("Reset 1wire bat"); + battery.begin(); + battery.update(); + } + battery.update(); + Serial.print(battery.getVoltage(0)); + Serial.print("\t"); + Serial.print(battery.getVoltage(1)); + Serial.print("\t"); + Serial.println(battery.getTemperature()); } \ No newline at end of file