Датчик температуры 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 в в одном и другом случае
Ребят, спасибо за помощь! Проблема была в адаптере!
Дык кто-бы сумлевался, если от одних пяти вольтов работает, а от других нет.