Ready for test on esp8266 and esp32

This commit is contained in:
md5sum-as 2022-10-15 18:39:37 +03:00
parent 61027810fa
commit c4ba1457a1

View File

@ -2,7 +2,7 @@
xsns_05_esp32_ds18x20.ino - DS18x20 temperature sensor support for ESP32 Tasmota xsns_05_esp32_ds18x20.ino - DS18x20 temperature sensor support for ESP32 Tasmota
Copyright (C) 2021 Heiko Krupp and Theo Arends Copyright (C) 2021 Heiko Krupp and Theo Arends
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
@ -15,8 +15,9 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
Updated by md5sum-as (https://github.com/md5sum-as)
*/
#ifdef ESP32 #ifdef ESP32
#ifdef USE_DS18x20 #ifdef USE_DS18x20
@ -59,9 +60,19 @@ struct {
uint8_t valid; uint8_t valid;
#ifdef DS18x20_USE_ID_ALIAS #ifdef DS18x20_USE_ID_ALIAS
uint8_t alias; uint8_t alias;
#endif //DS18x20_USE_ID_ALIAS #endif //DS18x20_USE_ID_ALIAS
#ifdef DS18x20_MULTI_GPIOs
int8_t pins_id = 0;
#endif //DS18x20_MULTI_GPIOs
} ds18x20_sensor[DS18X20_MAX_SENSORS]; } ds18x20_sensor[DS18X20_MAX_SENSORS];
#include <OneWire.h>
#ifdef DS18x20_MULTI_GPIOs
OneWire *ds18x20_gpios[MAX_DSB];
uint8_t ds18x20_ngpio = 0; // Count of GPIO found
#endif
struct { struct {
char name[17]; char name[17];
uint8_t sensors = 0; uint8_t sensors = 0;
@ -69,13 +80,20 @@ struct {
/********************************************************************************************/ /********************************************************************************************/
#include <OneWire.h>
OneWire *ds = nullptr; OneWire *ds = nullptr;
void Ds18x20Init(void) { void Ds18x20Init(void) {
ds = new OneWire(Pin(GPIO_DSB));
#ifdef DS18x20_MULTI_GPIOs
for (uint8_t pins = 0; pins < MAX_DSB; pins++) {
if (PinUsed(GPIO_DSB, pins)) {
ds18x20_gpios[pins] = new OneWire(Pin(GPIO_DSB,pins));
ds18x20_ngpio++;
}
}
#else
ds = new OneWire(Pin(GPIO_DSB));
#endif
Ds18x20Search(); Ds18x20Search();
AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSORS_FOUND " %d"), DS18X20Data.sensors); AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSORS_FOUND " %d"), DS18X20Data.sensors);
} }
@ -84,8 +102,12 @@ void Ds18x20Search(void) {
uint8_t num_sensors=0; uint8_t num_sensors=0;
uint8_t sensor = 0; uint8_t sensor = 0;
#ifdef DS18x20_MULTI_GPIOs
for (uint8_t pins=0; pins < ds18x20_ngpio; pins++) {
ds=ds18x20_gpios[pins];
#endif
ds->reset_search(); ds->reset_search();
for (num_sensors = 0; num_sensors < DS18X20_MAX_SENSORS; num_sensors) { for (num_sensors; num_sensors < DS18X20_MAX_SENSORS; num_sensors) {
if (!ds->search(ds18x20_sensor[num_sensors].address)) { if (!ds->search(ds18x20_sensor[num_sensors].address)) {
ds->reset_search(); ds->reset_search();
break; break;
@ -99,9 +121,16 @@ void Ds18x20Search(void) {
#ifdef DS18x20_USE_ID_ALIAS #ifdef DS18x20_USE_ID_ALIAS
ds18x20_sensor[num_sensors].alias=0; ds18x20_sensor[num_sensors].alias=0;
#endif #endif
#ifdef DS18x20_MULTI_GPIOs
ds18x20_sensor[num_sensors].pins_id = pins;
#endif //DS18x20_MULTI_GPIOs
num_sensors++; num_sensors++;
} }
} }
#ifdef DS18x20_MULTI_GPIOs
}
#endif //DS18x20_MULTI_GPIOs
for (uint32_t i = 0; i < num_sensors; i++) { for (uint32_t i = 0; i < num_sensors; i++) {
ds18x20_sensor[i].index = i; ds18x20_sensor[i].index = i;
} }
@ -116,10 +145,17 @@ void Ds18x20Search(void) {
} }
void Ds18x20Convert(void) { void Ds18x20Convert(void) {
#ifdef DS18x20_MULTI_GPIOs
for (uint8_t i = 0; i < ds18x20_ngpio; i++) {
ds=ds18x20_gpios[i];
#endif
ds->reset(); ds->reset();
ds->write(W1_SKIP_ROM); // Address all Sensors on Bus ds->write(W1_SKIP_ROM); // Address all Sensors on Bus
ds->write(W1_CONVERT_TEMP); // start conversion, no parasite power on at the end ds->write(W1_CONVERT_TEMP); // start conversion, no parasite power on at the end
// delay(750); // 750ms should be enough for 12bit conv // delay(750); // 750ms should be enough for 12bit conv
#ifdef DS18x20_MULTI_GPIOs
}
#endif
} }
bool Ds18x20Read(uint8_t sensor, float &t) { bool Ds18x20Read(uint8_t sensor, float &t) {
@ -130,7 +166,9 @@ bool Ds18x20Read(uint8_t sensor, float &t) {
uint8_t index = ds18x20_sensor[sensor].index; uint8_t index = ds18x20_sensor[sensor].index;
if (ds18x20_sensor[index].valid) { ds18x20_sensor[index].valid--; } if (ds18x20_sensor[index].valid) { ds18x20_sensor[index].valid--; }
#ifdef DS18x20_MULTI_GPIOs
ds=ds18x20_gpios[ds18x20_sensor[index].pins_id];
#endif
ds->reset(); ds->reset();
ds->select(ds18x20_sensor[index].address); ds->select(ds18x20_sensor[index].address);
ds->write(W1_READ_SCRATCHPAD); // Read Scratchpad ds->write(W1_READ_SCRATCHPAD); // Read Scratchpad
@ -315,7 +353,7 @@ void CmndDSAlias(void) {
bool Xsns05(uint8_t function) { bool Xsns05(uint8_t function) {
bool result = false; bool result = false;
if (PinUsed(GPIO_DSB)) { if (PinUsed(GPIO_DSB,GPIO_ANY)) {
switch (function) { switch (function) {
case FUNC_INIT: case FUNC_INIT:
Ds18x20Init(); Ds18x20Init();