Нет контакта между 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() {
}

, 👍-1

Обсуждение

Вы добавили подтягивающий резистор к выводу данных DS18B20?, @StarCat


2 ответа


0

//Вызовите эту функцию после начала настройки датчика.. поделитесь выводом

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


0

И для стабильности (Прочитайте комментарии) вашего решения (Все равно измените!) вместо

// ВАЖНО: Это приводит к сбоям из-за разрыва кучи и 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/
Надеюсь, это поможет

,