esp8266 ds18b20 пропадает связь

elman434
Offline
Зарегистрирован: 29.11.2019

подключено 5 датчиков ds1820 провода витой пары медной 0,52 сечения в целом около 120 метров, проблема в том что при питание через усб и блок питание теряется связь, показывается темпертуру один датчик или два или три и постоянно прерывается, если подключить через повербанк то все нормально, если повербанк подключить в розетку и включить esp то все повторяется, в чем может быть проблема? подключено по этой схеме

код

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <OneWire.h>
#include<DallasTemperature.h> 

#define BLYNK_PRINT Serial 
#define ONE_WIRE_BUS 2

const char* auth = "";
const char* ssid = "";
const char* pass = "";
const char* host = "esp8266-webupdate";
const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";

SimpleTimer timer;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
ESP8266WebServer server(80);

// Настройки
float temp_limit[5][2] = { // Мин., Макс. температура каждого датчика
  {10, 20},
  {10, 20},
  {10, 20},
  {10, 20},
  {10, 20}
};

#define notify_send 2 // Кол-во отправляемых уведомлений
#define notify_interval 3000 // Интервал отправляемых уведомлений
// Настройки

float temp[5];
bool notify_send_flag[5];
byte notify_send_num[5];
unsigned long notify_send_time[5];
byte sensor_num;

void setup(){
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  DS18B20.begin();
  timer.setInterval(5000L, getSendData);
  
  Serial.println("Booting Sketch...");
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, pass);
  if (WiFi.waitForConnectResult() == WL_CONNECTED) {
    MDNS.begin(host);
    server.on("/", HTTP_GET, []() {
      server.sendHeader("Connection", "close");
      server.send(200, "text/html", serverIndex);
    });
    server.on("/update", HTTP_POST, []() {
      server.sendHeader("Connection", "close");
      server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
      ESP.restart();
    }, []() {
      HTTPUpload& upload = server.upload();
      if (upload.status == UPLOAD_FILE_START) {
        Serial.setDebugOutput(true);
        WiFiUDP::stopAll();
        Serial.printf("Update: %s\n", upload.filename.c_str());
        uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
        if (!Update.begin(maxSketchSpace)) { //start with max available size
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_WRITE) {
        if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_END) {
        if (Update.end(true)) { //true to set the size to the current progress
          Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
        } else {
          Update.printError(Serial);
        }
        Serial.setDebugOutput(false);
      }
      yield();
    });
    server.begin();
    MDNS.addService("http", "tcp", 80);

    Serial.printf("Ready! Open http://%s.local in your browser\n", host);
  } else {
    Serial.println("WiFi Failed");
  }
}

void loop(){
  timer.run();
  Blynk.run();
  server.handleClient();
  MDNS.update();

  if(sensor_num < 5){
    if(temp[sensor_num] > temp_limit[sensor_num][1]){
      if(!notify_send_flag[sensor_num]){
        if(notify_send_num[sensor_num] < notify_send){
          if(millis() - notify_send_time[sensor_num] > notify_interval){
            Blynk.notify(String("Датчик N") + String(sensor_num + 1) + String(" выше ") + String(temp_limit[sensor_num][1]) + String(" C"));
            notify_send_num[sensor_num]++;
            notify_send_time[sensor_num] = millis();
          }
        }
        else
        {
          notify_send_flag[sensor_num] = true;
        }
      }
    }
    else if(temp[sensor_num] < temp_limit[sensor_num][0] && temp[sensor_num] > 0){
      if(!notify_send_flag[sensor_num]){
        if(notify_send_num[sensor_num] < notify_send){
          if(millis() - notify_send_time[sensor_num] > notify_interval){
            Blynk.notify(String("Датчик N") + String(sensor_num + 1) + String(" ниже ") + String(temp_limit[sensor_num][0]) + String(" C"));
            notify_send_num[sensor_num]++;
            notify_send_time[sensor_num] = millis();
          }
        }
        else
        {
          notify_send_flag[sensor_num] = true;
        }
      }
    }
    else
    {
      notify_send_flag[sensor_num] = false;
      notify_send_num[sensor_num] = 0;
    }

    sensor_num++;
  }
  else
  {
    sensor_num = 0;
  }
}

void getSendData(){
  DS18B20.requestTemperatures(); 
  temp[0] = DS18B20.getTempCByIndex(0);
  temp[1] = DS18B20.getTempCByIndex(1);
  temp[2] = DS18B20.getTempCByIndex(2);
  temp[3] = DS18B20.getTempCByIndex(3);
  temp[4] = DS18B20.getTempCByIndex(4);

  Serial.print("Temp_0: ");
  Serial.print(temp[0]);
  Serial.print(" oC ");
  
  Serial.print("Temp_1: ");
  Serial.print(temp[1]);
  Serial.println(" oC");
  
  Serial.print("Temp_2: ");
  Serial.print(temp[2]);
  Serial.println(" oC"); 
  
  Serial.print("Temp_3: ");
  Serial.print(temp[3]);
  Serial.println(" oC");
  
  Serial.print("Temp_4: ");
  Serial.print(temp[4]);
  Serial.println(" oC");
  
  Blynk.virtualWrite(11, temp[0]);
  Blynk.virtualWrite(12, temp[1]);
  Blynk.virtualWrite(13, temp[2]);
  Blynk.virtualWrite(14, temp[3]);
  Blynk.virtualWrite(15, temp[4]);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

3.3V на 120 метров? Даллас крут - ещё и датчики откликаются.

elman434
Offline
Зарегистрирован: 29.11.2019

а как правильно запитать, подскажите)

b707
Offline
Зарегистрирован: 26.05.2017

elman434 пишет:

а как правильно запитать, подскажите)

дело не в питании, поместите плату ближе к датчикам, чтоб длина проводов была хотя бы метров 30 максимум

elman434
Offline
Зарегистрирован: 29.11.2019

b707 пишет:

elman434 пишет:

а как правильно запитать, подскажите)

дело не в питании, поместите плату ближе к датчикам, чтоб длина проводов была хотя бы метров 30 максимум

расстояние между? если да, то расстояние между ними около 20м.

просто есть факт что с повербанка работает идеально

b707
Offline
Зарегистрирован: 26.05.2017

elman434 пишет:

расстояние между? если да, то расстояние между ними около 20м.

нет, общая длина всей шины со всеми датчиками

elman434
Offline
Зарегистрирован: 29.11.2019

b707 пишет:

elman434 пишет:

расстояние между? если да, то расстояние между ними около 20м.

нет, общая длина всей шины со всеми датчиками

а как объясниться что от банка работает в том же месте нормально?)

elman434
Offline
Зарегистрирован: 29.11.2019

какое максимальное расстояние по витой паре у датчиков ds18b20?

b707
Offline
Зарегистрирован: 26.05.2017

elman434 пишет:

а как объясниться что от банка работает в том же месте нормально?)

Так и обьяснить, что при длинной линии связь с датчиками становится неустойчивой и проявляется это именно в том, что от малейших помех начинаются проблемы.

Возможно у вас БП плохой, не держит напряжение или дает наводки, найдите другой и попробуйте

elman434
Offline
Зарегистрирован: 29.11.2019

b707 пишет:

elman434 пишет:

а как объясниться что от банка работает в том же месте нормально?)

Так и обьяснить, что при длинной линии связь с датчиками становится неустойчивой и проявляется это именно в том, что от малейших помех начинаются проблемы.

Возможно у вас БП плохой, не держит напряжение или дает наводки, найдите другой и попробуйте

понял спасибо)