Датчик температуры dallas
- Войдите на сайт для отправки комментариев
Вс, 20/01/2019 - 22:29
Всем привет,
Сталкнулся с такой проблемой. Подключаю датчик к контроллеру 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();
}
Пока, кроме как на новый БП или уж больно изощренную схему включения термометра, грешить не на что.
Попробуйте считывать температуру 1 раз в 175 строке
, а в строках 176 и 179 использовать переменную Temp. Не стоит лишний раз дергать датчик. И проверьте напряжение питания датчика и контакт с резистором.
, а в строках 176 и 179 использовать переменную Temp. Не стоит лишний раз дергать датчик. И проверьте напряжение питания датчика и контакт с резистором.
Датчику, в принципе, по барабану. Пока не закончится преобразование он будет возвращать предыдущее значение. Тем более, в библиотеке задержка прописана жестко. Я голосую за кривое подключение.
То ТС, попробуйте запустить пример из OneWire, без излишних сущностей и пока не получите корректного значения не городите ничего лишнего. ИМХО.
а не похоже ли это на банальное - "датчик отвалился" ?
Примерно так он подключен, если подключить к компу через usb, то температуру считывает, в консоле видно, а если через адаптер 5 вольт mqtt передает -127.
Поменял код как советовали, но это не помогло.
Примерно так он подключен, если подключить к компу через usb, то температуру считывает, в консоле видно, а если через адаптер 5 вольт mqtt передает -127.
Так надо напряжения питания сравнить от USB и от адаптера (под нагрузкой).
Бывают такие кабели, что на 30см при нагрузке полампера доходит 3,5 вольта из пяти.
Адаптер 5в.
Дата - пульсирует от 1 - 2.5в
На плюс - 3.3в
USB:
Дата - пульсирует от 1.7 - 3.2в
На плюс - 3.3в
Примерно так он подключен, если подключить к компу через usb, то температуру считывает, в консоле видно, а если через адаптер 5 вольт mqtt передает -127.
с адаптера 5В напряжение нужно подавать на +5В пин, а не на Vin
именно так и делает усби, только еще через диод.
Проверил, от адаптера все 5в. и приходят
Так на NodeMCU нету пина 5в.
да, уже открыл
смотрите куда пины усби разъема расходятся, конкретно пин питания, идет он на Vin или еще как.
А если использовать другой адаптер? Может этот пульсации выдает или ток недостаточен?
тоже вариант.
и померяйте что там на 3,3 в в одном и другом случае
Ребят, спасибо за помощь! Проблема была в адаптере!
Дык кто-бы сумлевался, если от одних пяти вольтов работает, а от других нет.