РЕШЕНО Esp8266 ds18b20 -127

Тема в разделе "ESP8266, ESP32", создана пользователем Elman, 14 янв 2020.

  1. Elman

    Elman Нерд

    подскажите знающие, протянул провод ~40 метров типа магистраль и по нему каждые ~10-15 метров по отсекам в общем 3 датчика, провода в целом ~100м, запрос в скетче стоит 9 сек и почти через каждый раз показывает -127, ставил усб блок питание 1А, 2.1А, 3А чем больше тем хуже работает, ставлю повербанк работает вообще без сбоев, все четко, если пытаюсь ставить повербанк на зарядку повторяется то же самое, что можно сделать в данной ситуации, 220в не не спрашивайте почему не тянул, просто надо исправить эту ситуацию, какие советы будут?
    подключал по этой схеме( ESP не такой и датчики гильзованные)[​IMG]
    пробовал кондер на каждый датчик ставить чуть лушче становится, но все равно повторяется, если ставить на каждый датчик, то показания с одного пин может появится на другом
    Код (C++):
    #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, "193.124.67.72", 8080);
      DS18B20.begin();
      timer.setInterval(9000L, 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]);
    }
     
  2. Elman

    Elman Нерд

    провод витая пара 4 медных жил
    все провода идут по железкам
     
  3. b707

    b707 Гуру

    Elman = вы же уже задавали этот вопрос неделю назад на ардуино.ру и получили ответ и даже согласились с ним.
    А теперь все по новой и даже никаких выводов не сделали? Схема та же, что и была...

    У вас и с питанием и сигналом проблемы будут на такой линии.
     
  4. Elman

    Elman Нерд

    согласился, попробовал другое БП другие варианты, не решилось, решил узнать тут, может у кого было такое)

    БП ставлю 2А начинает еще сильнее моросить, от 1А хоть как-то работает, я думаю дело не в питании
     
    Последнее редактирование модератором: 14 фев 2020
  5. b707

    b707 Гуру

    Вы вообще понимаете, что означают эти цифры - 1А, 2А ?:) - похоже что нет. какое они имеют отношение к вашей проблеме?
    У вас дело сразу в нескольких факторах.
    Если вас заставить в одиночку копать котлован под фундамент детским совком и при этом не кормить :) - в чем будет дело, когда вы в срок не уложитесь? :)
    В вашем проекте ситуация похожа. Мало того, что вы присобачили датчики на 100м линию, так вы еще и питаете их от 3.3в через тот же 100м провод....Я вам уже советовал - попробуйте, хотя бы для проверки - уменьшить длину линии, питать датчики от 5в или разместить БП рядом с дачтчиками. а не на расстоянии 100м.
    Может стоит на каждый датчик поставить свой контроллер, тогда и проводов длинных не будет.
     
  6. Elman

    Elman Нерд

    может и поставил бы каждый датчик отдельно свой контролер но уже все протянуто да и электричество только там где контролер, уменьшить тоже не могу как сказал электричество только там)
     
  7. b707

    b707 Гуру

    ну раз изменить ничего нельзя - тогда остается смирится с тем, что датчики выдают -127...
     
    parovoZZ нравится это.
  8. parovoZZ

    parovoZZ Гуру

    Тогда только радиодатчик на батарейках.
     
  9. ИгорьК

    ИгорьК Гуру

    Попробуйте уменьшить номинал резистора до 2.2 ком. Потом до 1.2 ком.
    Может(???) помочь.
     
    parovoZZ нравится это.
  10. Airbus

    Airbus Радиохулиган Модератор

    -127 классический косяк.Нет контакта к датчику
     
  11. b707

    b707 Гуру

    Elman, а доступ к датчикам есть или вы уже намертво в стену вмазали?
    Если есть - запустите свою систему и мультиметром измерьте напряжение питания, которое приходит на каждый из датчиков.
     
  12. Elman

    Elman Нерд

    есть идея развернуть это?

    есть доступ к ним, завтра попробую так)
     
    Последнее редактирование модератором: 14 фев 2020
  13. ИгорьК

    ИгорьК Гуру

    Дело теоретически интересное, но малополезное, при условии, что нет обрывов на линии. Полагаю, ТС первое что сделал - проверил целостность соединений.

    Протокол определяет достаточно серьезные требования на импульсы, что бегают между мастером и слейвами. С ростом длины линии, растет ее емкость. На больших линиях пара длина/резистор 4.7 ком не позволяют уложиться в требования документации.

    Поэтому приходится снижать номинал сопротивления до предельно возможного.
     
  14. Slaiterx

    Slaiterx Гик

    нужно уменьшить сопротиение у меня на длинном поводе вообще без него все работает
     
  15. Elman

    Elman Нерд

    без конденсатора пробовал не работает)
     
  16. Elman

    Elman Нерд

    вроде обрывов нет никаких, соединил только так, 60м и 15м провод целый а другие соединил зачистив провода
     

    Вложения:

  17. ИгорьК

    ИгорьК Гуру

    Я
    Я не спец в этих делах, но думаю, такое соединение работать вы не заставите.
     
  18. b707

    b707 Гуру

    дело не в соединениях.
    Предполагаю. что из начальых 3,3в до датчика доходит дай бог 3в. а известно что DS18b20 ниже 3в начинает глючить
     
  19. b707

    b707 Гуру

    тема "температурный сенсор на батарейках" в инете обсосана досконально, полгода-год автономной работы достигаются легко. а если чуть постараться. то и больше
     
  20. ИгорьК

    ИгорьК Гуру

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