Датчик температуры dallas

Cools2
Offline
Зарегистрирован: 09.04.2017

Всем привет,

Сталкнулся с такой проблемой. Подключаю датчик к контроллеру esp8266, и планировал по протоколу mqtt передавать значение температуры, все запрограммил, через usb порт покдлючил esp, все работает, температуру считывает. Но в дальнейшем я планировал питать esp через адаптер 5v. Подключил, но температуру показывает -127. С чем это связано?

P.S В коде так же подключаю SR-04. Он при этом работает как надо.

/**
 * Example for reading temperature and humidity
 * using the DHT22 and ESP8266
 * 
 * static const uint8_t D0   = 16;
 * static const uint8_t D1   = 5;
 * static const uint8_t D2   = 4;
 * static const uint8_t D3   = 0;
 * static const uint8_t D4   = 2;
 * static const uint8_t D5   = 14;
 * static const uint8_t D6   = 12;
 * static const uint8_t D7   = 13;
 * static const uint8_t D8   = 15;
 * static const uint8_t D9   = 3;
 * static const uint8_t D10  = 1;
 */
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

const byte green_led = 14;
const byte red_led = 12;
int wait = 2000;

#define PIN_DS18B20 5 //D1
OneWire oneWire(PIN_DS18B20);
// Создаем объект DallasTemperature для работы с сенсорами, передавая ему ссылку на объект для работы с 1-Wire.
DallasTemperature dallasSensors(&oneWire);

// для hc-sr04
const int trigPin = 13;  //D8
const int echoPin = 15;  //D7
// defines variables
long duration;
int distance;

byte mqtt_server[] = { 192, 168, 1, 239 };   
char buffer[10];
// WiFi credentials.
const char* WIFI_SSID = "Rukishi98";
const char* WIFI_PASS = "1234qwer";

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.println("On message");

  char json[length + 1];
  strncpy (json, (char*)payload, length);
  json[length] = '\0';

  String message = String(json);

  Serial.print("Topic: ");
  Serial.println(topic);
  Serial.print("Message: ");
  Serial.println(message);

  wait = message.toInt();
} 

WiFiClient wifiClient;
PubSubClient client(mqtt_server, 1883, callback, wifiClient);

void connect() {

  WiFi.persistent(false);
  WiFi.mode(WIFI_OFF);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);

  unsigned long wifiConnectStart = millis();

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
   
    // Only try for 5 seconds.
    if(millis() - wifiConnectStart > 5000) {
      return;
    }
  }
}

void reconnect() {
      // Loop until we're reconnected
  while (!client.connected()) {
      Serial.println("Reconnect to MQTT");
      client.connect("ESP8266 Temperature and Distance");
      client.setCallback(callback);
      client.publish("outTopic", "test");
      client.subscribe("ESP/Temp/Wait"); // подписывааемся по топик с данными для светодиода
      delay(5000);
  }
}

void setup() {
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
  Serial.begin(9600);
  Serial.setTimeout(2000);

  // Wait for serial to initialize.
  while(!Serial) { }

  Serial.println("Device Started");
  Serial.println("-------------------------------------");

  dallasSensors.begin();
  connect();

  pinMode(green_led, OUTPUT);
  pinMode(red_led, OUTPUT);
}

void report(int distance, double tempC) {
  StaticJsonBuffer<500> jsonBuffer;
  JsonObject& root = jsonBuffer.createObject();
  root["distance"] = distance;
  root["tempC"] = tempC;
  char payload[256];
  root.printTo(payload, sizeof(payload));
  char* s = payload;
  if (client.connect("ESP8266 Temperature and Distance")) {
    if(client.publish("ESP/Temp", s) == true){
      Serial.println("Reported!");
      delay(wait);
      //ESP.deepSleep(20e6); // 20e6 is 20 seconds
    }
  }
}

void loop() {

  // Есть пропал сигнал с mqtt
  if (!client.connected()) {
    reconnect();
    digitalWrite(red_led, LOW);
  }else{
    digitalWrite(red_led, HIGH);
  }

  bool toReconnect = false;

  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("Disconnected from WiFi");
    digitalWrite(green_led, LOW);
    toReconnect = true;
  }else{
    digitalWrite(green_led, HIGH);
  }

  if (toReconnect) {
    connect();
  }

  // Clears the trigPin
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    
    // Sets the trigPin on HIGH state for 10 micro seconds
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    
    // Reads the echoPin, returns the sound wave travel time in microseconds
    duration = pulseIn(echoPin, HIGH);
    
    // Calculating the distance
    distance = duration*0.034/2;
  
 
   
  dallasSensors.requestTemperatures(); 
  delay(500);
  
  Serial.println(dallasSensors.getTempCByIndex(0));
  Serial.println(distance);
    
  report(distance, dallasSensors.getTempCByIndex(0));
  client.loop();
}

 

ВН
Offline
Зарегистрирован: 25.02.2016

Пока, кроме как на новый БП или уж больно изощренную схему включения термометра, грешить не на что. 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Попробуйте считывать температуру 1 раз в 175 строке

float Temp=dallasSensors.getTempCByIndex(0);

, а в строках 176 и 179 использовать переменную Temp. Не стоит лишний раз дергать датчик. И проверьте напряжение питания датчика и контакт с резистором.

bwn
Offline
Зарегистрирован: 25.08.2014

mykaida пишет:

, а в строках 176 и 179 использовать переменную Temp. Не стоит лишний раз дергать датчик. И проверьте напряжение питания датчика и контакт с резистором.

Датчику, в принципе, по барабану. Пока не закончится преобразование он будет возвращать предыдущее значение. Тем более, в библиотеке задержка прописана жестко. Я голосую за кривое подключение.
То ТС, попробуйте запустить пример из OneWire, без излишних сущностей и пока не получите корректного значения не городите ничего лишнего. ИМХО.

Нуидела
Offline
Зарегистрирован: 31.01.2017

а не похоже ли это на банальное - "датчик отвалился" ?

Cools2
Offline
Зарегистрирован: 09.04.2017

 

Примерно так он подключен, если подключить к компу через usb, то температуру считывает, в консоле видно, а если через адаптер 5 вольт mqtt передает -127.

Поменял код как советовали, но это не помогло.

float temp = dallasSensors.getTempCByIndex(0);
report(distance, temp);

 

bwn
Offline
Зарегистрирован: 25.08.2014

Cools2 пишет:

Примерно так он подключен, если подключить к компу через usb, то температуру считывает, в консоле видно, а если через адаптер 5 вольт mqtt передает -127.

Так надо напряжения питания сравнить от USB и от адаптера (под нагрузкой).

inspiritus
Offline
Зарегистрирован: 17.12.2012

Бывают такие кабели, что на 30см при нагрузке полампера доходит 3,5 вольта из пяти.

Cools2
Offline
Зарегистрирован: 09.04.2017

Адаптер 5в.

Дата - пульсирует от 1 - 2.5в

На плюс - 3.3в

 

USB:

Дата - пульсирует от 1.7 - 3.2в

На плюс - 3.3в

ВН
Offline
Зарегистрирован: 25.02.2016

Cools2 пишет:

 

Примерно так он подключен, если подключить к компу через usb, то температуру считывает, в консоле видно, а если через адаптер 5 вольт mqtt передает -127.

с адаптера 5В напряжение нужно подавать на +5В пин, а не на Vin

именно так и делает усби, только еще через диод.

 

Cools2
Offline
Зарегистрирован: 09.04.2017

Проверил, от адаптера все 5в. и приходят

Cools2
Offline
Зарегистрирован: 09.04.2017

Так на NodeMCU нету пина 5в.

ВН
Offline
Зарегистрирован: 25.02.2016

да, уже открыл

смотрите куда пины усби разъема расходятся, конкретно пин питания, идет он на Vin или еще как.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А если использовать другой адаптер? Может этот пульсации выдает или ток недостаточен?

ВН
Offline
Зарегистрирован: 25.02.2016

тоже вариант.

и померяйте что там на 3,3 в в одном и другом случае

Cools2
Offline
Зарегистрирован: 09.04.2017

Ребят, спасибо за помощь! Проблема была в адаптере!

bwn
Offline
Зарегистрирован: 25.08.2014

Дык кто-бы сумлевался, если от одних пяти вольтов работает, а от других нет.