Нет контакта между DS18B20 и WeMos D1 Mini
У меня есть водонепроницаемый датчик DS18B20, который я подключил к микроконтроллеру WeMos D1 Mini. Этот контроллер подключается к Wi-Fi и MQTT-брокеру, отправляет данные о температуре с датчика и уходит в глубокий сон.
Все работает хорошо, кроме показаний датчика. Он возвращает -127, что означает, что датчик отключен. Я проверил кабели, измерил напряжение, и все должно быть в порядке.
У меня есть кабель передачи данных для датчика, подключенный к D2, поэтому в моем скетче я безуспешно пробовал следующие контакты: oneWire(D2)
- oneWire(2)
- oneWire(GPIO4)
- oneWire(4)
. Нет успеха.
Кто-нибудь может помочь мне со следующим наброском?
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// настройки Wi-Fi
const char* ssid = "[REDACTED]";
const char* password = "[REDACTED]";
// настройки MQTT
const char* mqttServer = "[REDACTED]";
const char* mqttUser = "[REDACTED]";
const char* mqttPassword = "[REDACTED]";
const int mqttPort = 1883;
const char* mqttClient = "[REDACTED]";
const char* mqttTopic = "[REDACTED]";
#define durationSleep 15 // продолжительность глубокого сна в минутах
#define NB_TRYWIFI 20 // количество попыток подключения к Wi-Fi
#define ONE_WIRE_BUS 4 // подключение датчика температуры
WiFiClient espClient;
PubSubClient client(espClient);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
float celsius = 0;
void setup() {
Serial.begin(115200);
// Подключаемся к датчикам
sensor.begin();
// Настройка Wi-Fi
WiFi.begin(ssid, password);
int _try = 0;
// Подключиться к Wi-Fi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
_try++;
if (_try >= NB_TRYWIFI) {
ESP.deepSleep(durationSleep * 1000000);
}
}
// Настройка MQTT
client.setServer(mqttServer, mqttPort);
// Получить температуру в градусах Цельсия
sensor.setResolution(10);
sensor.requestTemperatures();
celsius = sensor.getTempCByIndex(0);
// Подключаемся к MQTT-брокеру
while (!client.connected()) {
if (client.connect(mqttClient, mqttUser, mqttPassword)) {
client.publish("mspa/temperature", String(celsius).c_str(), true);
delay(1000);
} else {
delay(2000);
}
}
// Идти спать
ESP.deepSleep((durationSleep * 60) * 1000000);
}
void loop() {
}
@rebellion, 👍-1
Обсуждение2 ответа
//Вызовите эту функцию после начала настройки датчика.. поделитесь выводом
uint8_t findDevices(int DSPIN)
{
OneWire ow(pin);
uint8_t address[8];
uint8_t count = 0;
if (ow.search(address))
{
Serial.print("\nuint8_t pin");
Serial.print(pin, DEC);
Serial.println("[][8] = {");
do {
count++;
Serial.println(" {");
for (uint8_t i = 0; i < 8; i++)
{
Serial.print("0x");
if (address[i] < 0x10) Serial.print("0");
Serial.print(address[i], HEX);
if (i < 7) Serial.print(", ");
}
Serial.println(" },");
} while (ow.search(address));
Serial.println("};");
Serial.print("// найдено кол-во устройств: ");
Serial.println(count);
}
return count;
}
Спасибо за Ваш ответ! К сожалению, это ничего не возвращает: ets 8 января 2013 г., первая причина: 2, режим загрузки: (3,6) загрузка 0x4010f000, длина 1392, комната 16 хвост 0 контрольная сумма 0xd0 сумма 0xd0 v3d128e5c ~лд, @rebellion
Кстати, я также пробовал несколько датчиков DS18B20, но безуспешно. Не уверен, что я делаю неправильно. Я также тестировал с другими D1, не повезло., @rebellion
Вы добавили подтягивающий резистор к выводу данных DS18B20?, @StarCat
И для стабильности (Прочитайте комментарии) вашего решения (Все равно измените!) вместо
// ВАЖНО: Это приводит к сбоям из-за разрыва кучи и imho не стабильно работает на микроконтроллерах
client.publish("mspa/temperature", String(celsius).c_str(), true);
// Делаем так - определяем фиксированные символы перед установкой - компилятор помещает их в стек
char mqttBuffer[16] = '\0';
char topic[] = "mspa/temperature";
.....
dtostrf(celsius,6,2,mqttBuffer); // преобразовать число с плавающей запятой в символ
client.publish(topic, mqttBuffer, true); // Мы используем фиксированные символы вместо разбиения кучи Strings
Подробнее о злых строках: https://hackingmajenkoblog.wordpress. com/2016/02/04/the-evils-of-arduino-strings/
Надеюсь, это поможет
- ESP-01 неправильно просыпается после глубокого сна
- Wemos D1R2 - переход Onewire 2 DS18B20 на переменную
- Обнаружение датчиков DS18B20 и правильное назначение их реле
- Как читать и записывать EEPROM в ESP8266
- Как сделать выводы Tx и Rx на ESP-8266-01 в выводах GPIO?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Как заставить 5-вольтовое реле работать с NodeMCU
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
Вы добавили подтягивающий резистор к выводу данных DS18B20?, @StarCat