Не работает пара dallas (Датчики температуры)
- Войдите на сайт для отправки комментариев
Сб, 25/01/2020 - 21:57
Решил сделать устройство, которое будет собирать некую информацию с котла, а точнее уровень гранул через датчик SR-04 (который работает от 3.3в). Температуру бойлера и температуру котла с помощью датчиков ds18b20, которые на проводе. И все через контроллер NodeMCU.
Подключал следующим образом:
Датчик sr-04 работает без проблем, а вот температура всегда -127.
Код:
/** 2 dallas sensors and 1 SR-04 using the DALLAS, SR-04 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> //SR-04 const int trigPin = 13; //D7 const int echoPin = 12; //D6 //DALLAS #define PIN_DS18B20 5 //D1 int countDallasSensors; //VARIABLES long SR_Duration; int SR_Distance; float tempBoiler; float tempPot; unsigned long timerStart, timerEnd = 5000; //NETWORK byte mqtt_server[] = { 192, 168, 1, 231 }; char buffer[10]; // WiFi credentials. const char* WIFI_SSID = "#"; const char* WIFI_PASS = "#"; const char* MQTT_SSID = "#"; const char* MQTT_PASS = "#"; OneWire oneWire(PIN_DS18B20); DallasTemperature dallasSensors(&oneWire); void MQTTMessage(char* topic, byte* payload, unsigned int length) { } WiFiClient wifiClient; PubSubClient client(mqtt_server, 1883, MQTTMessage, wifiClient); void connectWIFI() { 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 reconnectMQTT() { // Loop until we're reconnected while (!client.connected()) { Serial.println("Reconnect to MQTT"); client.connect("ESP8266 Thermostate", MQTT_SSID, MQTT_PASS); client.publish("outTopic", "test"); delay(5000); } } void getDistance() { // 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 SR_Duration = pulseIn(echoPin, HIGH); // Calculating the distance SR_Distance = SR_Duration * 0.034 / 2; } void getTemperature(){ dallasSensors.requestTemperatures(); delay(500); tempBoiler = dallasSensors.getTempCByIndex(0); tempPot = dallasSensors.getTempCByIndex(1); } void sendToServer(int distance, double tempBoiler, double tempPot) { StaticJsonDocument<500> obj; if(distance < 150 && distance > 0){ obj["distance"] = distance; } if(tempBoiler < 150 && tempBoiler > 0){ obj["tempBoiler"] = tempBoiler; } if(tempPot < 150 && tempPot > 0){ obj["tempPot"] = tempPot; } char payload[256]; serializeJson(obj, payload); char* s = payload; if (client.connect("ESP8266 Temperature and Distance")) { if(client.publish("ESP/ToHome", s) == true){ Serial.println("Reported!"); } } } void setup() { Serial.begin(9600); // Wait for serial to initialize. while (!Serial) { } dallasSensors.begin(); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); countDallasSensors = dallasSensors.getDeviceCount(); connectWIFI(); Serial.println("Device Started"); Serial.println("-------------------------------------"); } void loop() { if (WiFi.status() != WL_CONNECTED) { connectWIFI(); } if (!client.connected()) { reconnectMQTT(); } if (millis() - timerStart > timerEnd) { getDistance(); getTemperature(); sendToServer(SR_Distance, tempBoiler, tempPot); timerStart += timerEnd; // reset 60 sec timer } delay(1000); client.loop(); }
Кто поможет, в чем может быть причина?
Еще бы заодно было бы интересно узнать, если ли другой способ реализации таймера, который бы не накапливал предыдущее значение? Для долгой работы текущий таймер не подходит.
Не все библиотеки ванваре для атмел работают правильно на есп
подбирать надо, искать...
эта у меня работает
А где Вы взяли резистор на 4 кОм?
И каким напряжением кормите датчики - на Вашей картинке ни хрена не видно.
А где Вы взяли резистор на 4 кОм?
Это прикол или что?
Не все библиотеки ванваре для атмел работают правильно на есп
Вообще что-нибудь в дурдуине работает на этих есп??? Очень бы хотел замутить простой датчик температуры + влажность + давление и чтоб с мобильника по вифи заходить = нифига не получилось ниразу. Так и валяюццо енти есп уже года два без дела.
У меня работают
каждая строка это еспэшка а внизу чиллеры - тоже еспэ + 18B20 (пока модуль только на одном чиллере стоит).
А где Вы взяли резистор на 4 кОм?
Это прикол или что?
Это вопрос.
Такого резистора нет ни в одном из известных мне номинальных рядов. Потому, мне и интересно, там стоит "сборка" или, как это часто бывает, "приведённая схема (и скетч заодно) - это так, чтоб красиво было, а на самом деле у меня там ...". Вчера только была тема, где народ полдня голову ломал что же там не так, пока (через поста постов) не выяснилось, что у ТС, оказывается DUE).
NodeMCU есть только 1 вариант, 3.3в. Резистор 4.7. Все подключено как на картинке ибо сам ее рисовал.
Резистор 4.7. Все подключено как на картинке ибо сам ее рисовал.
Или у меня глюки, или на картинке 4 кОм, а не 4,7.
Закономерный вопрос, а какие ещё сюрпризы нас ожидают?
Поменял резистор на 1ком и температуру показало, так же вместо своего таймаута использовал ESP.deepSleep();
И вроде бы все работало, поставил на рабочее место. Температура дошла до 45 градусов и снова -127.
Пока что буду тестировать дальше!
-127 это проблемы с сигналом. Нужно прочитать документы по правильной проводке линий 1wire, а не воротить непонятно что навесом и силовыми проводами.