Не корректно отображается значение с 2х и более датчиков ds18b20

Тема в разделе "Arduino & Shields", создана пользователем 4QQ4QQ4231Q, 23 мар 2024.

  1. 4QQ4QQ4231Q

    4QQ4QQ4231Q Нуб

    Код создаю на wokwi.com

    Есть код и проблема.

    По заданию нужно
    Разработать устройство (электрическую схему принципиальную соединения ЭВМ и периферийных устройств, блок-схему алгоритма, программный код его реализующий), которое измеряет температуру с трех датчиков 1 раз в минуту, отображает на экране «Температура 1 датчика» значение температуры с точностью до одного знака после запятой « °С», через 5 секунд 2-го датчика, еще через 5 секунд 3-го датчика, записывает результат измерения на карту microSD в файл temp.csv, в формате ММ:ЧЧ ДД:ММ:ГГГГ; значение температуры с точностью до одного знака после запятой в °С 1-го датчика; значение температуры с точностью до одного знака после запятой в °С 2-го датчика; значение температуры с точностью до одного знака после запятой в °С 3-го датчика.

    LCD 1602 экран с интерфейсом I2C – 1 шт.
    Адаптер карт памяти microSD с картой памяти – 1 шт.
    DS18B20 – датчик температуры с интерфейсом 1-Wire– 3 шт.




    Если подключать только один датчик, например первый - то значение первого отображается корректное, остальные -127.

    Если к этому первому подключить еще один то все ломается значение первого становится тоже -127.0, смена значений на датчиках ни к чему не приводит, так же -127.0

    В симуляции у каждого датчика "device serial number" установлен 0, 1, 2 соответственно.

    Если кто-то знает помогите пж.

    Схема ---- [​IMG]

    Код:


    Код (C++):

    #include <LiquidCrystal_I2C.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <SD.h>
    #include <TimeLib.h>

    LiquidCrystal_I2C lcd(0x27, 16, 2);  // Адрес I2C модуля LCD, количество столбцов и строк
    File dataFile;

    #define ONE_WIRE_BUS 2
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);

    void setup() {
      lcd.init();
      lcd.backlight();
      Serial.begin(9600);

      if (!SD.begin(10)) {
        Serial.println("SD initialization failed!");
        return;
      }
     
      dataFile = SD.open("temp.csv", FILE_WRITE);
      if (dataFile) {
        dataFile.println("Time;Temperature1;Temperature2;Temperature3");
        dataFile.close();
      } else {
        Serial.println("error opening temp.csv");
      }

      sensors.begin();
    }

    String getTime() {
      String timeStr = "";
      timeStr += String(hour());
      timeStr += ":";
      timeStr += String(minute());
      timeStr += " ";
      timeStr += String(day());
      timeStr += ":";
      timeStr += String(month());
      timeStr += ":";
      timeStr += String(year());
      return timeStr;
    }

    void writeDataToFile(String data) {
      dataFile = SD.open("temp.csv", FILE_WRITE);
      if (dataFile) {
        dataFile.println(data);
        dataFile.close();
      } else {
        Serial.println("error opening temp.csv");
      }
    }

    void loop() {
      float temp1, temp2, temp3;

      sensors.requestTemperatures();
      temp1 = sensors.getTempCByIndex(0);
      temp2 = sensors.getTempCByIndex(1);
      temp3 = sensors.getTempCByIndex(2);

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temp1: ");
      lcd.print(temp1, 1);
      delay(2000);

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temp2: ");
      lcd.print(temp2, 1);
      delay(2000);

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temp3: ");
      lcd.print(temp3, 1);
      delay(2000);

      String data = getTime() + ";" + String(temp1, 1) + ";" + String(temp2, 1) + ";" + String(temp3, 1);
      writeDataToFile(data);
    }
     
     
  2. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Может вы неправильно создаете адреса сенсоров. Вот пример из библы для Далласов.
     

    Вложения:

    • Multiple.zip
      Размер файла:
      1,8 КБ
      Просмотров:
      54
  3. 4QQ4QQ4231Q

    4QQ4QQ4231Q Нуб

    А как можно указать датчику адрес на wokwi ?
    На сайте отображены созданные мною три датчика, у них разная температура, мною установленная. Но один адрес -- deviceID: 10000000000000fb
     

    Вложения:

  4. Andy16

    Andy16 Гик

    Схемы не вижу. Может у вас на каждом датчике по резистору, а они же на одном пине висят?
     
  5. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Чето я схемы не понял. Датчики должны быть подключены так. Не знаю что такое wokwi.com. Oт всякого он-лайна стараюсь держаться подальше. Для симуляции есть Proteus 8.6 Prof
    Вот симуляция трех датчиков в приложенном коде.. Для вашей темы надо изменить параметр Resolution.
    ПС. Натыкался на такой глюк. Модель датчика имеет параметр Time reset Low. Установлен 480мкСек. И библиотеки выдают такой же интервал. В результате в симуляторе датчик не ресетится и не работает. В реале у датчика этот параметр 460 мкСек.
     

    Вложения:

    • Безым.png
      Безым.png
      Размер файла:
      7 КБ
      Просмотров:
      50
    • Безым2.png
      Безым2.png
      Размер файла:
      55,7 КБ
      Просмотров:
      43
    Последнее редактирование: 24 мар 2024
    Andy16 нравится это.
  6. 4QQ4QQ4231Q

    4QQ4QQ4231Q Нуб

    Попробовал подключить таким образом. Показание первого датчика стало показывать 0.0 (при значении температуры 0), остальных датчиков -127.0.
    Если сменить значение температуры первого датчика на отличное от нуля - то его показание становится -127.0.
    прикрепил схему
     

    Вложения:

    • схема.jpg
      схема.jpg
      Размер файла:
      96 КБ
      Просмотров:
      46
  7. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1 Сопротивление резистора какое ?
    2. Ваш код целиком я просимулировать не могу, тк надо кард-ридер, образ файла и тд.
    3. Схема у вас сейчас верная.
     

    Вложения:

    • triple.zip
      Размер файла:
      1,8 КБ
      Просмотров:
      42
  8. 4QQ4QQ4231Q

    4QQ4QQ4231Q Нуб

    Резистор 4.7 кОм.

    Удалил все что связано с SD картой и т.д. Оставил только датчики и экран. Код приложил.
    Может ли быть проблема в том, что у датчиков показываются одинаковые адреса, но разные температуры. Как на скриншоте прикрепленном.
     

    Вложения:

  9. Ariadna-on-Line

    Ariadna-on-Line Гуру

    На скриншоте каждая третья строка сенсора говорит что идентификатор (то бишь адрес) слишком короткий (=0) и вероятны ошибки.
    temp1 = sensors.getTempCByIndex(0); - я не программист, это надо местных гуру спрашивать - подразумевает что сначала были считаны с сенсоров и записаны в некий массив их адреса. И пытается по индексу выдрать конкретный адрес из массива. А массива такого в вашем коде (это должно было быть сделано в setup() )- не создавалось !!!
    Код (C++):
     
      sensors.begin();

      // locate devices on the bus
      Serial.print("Locating devices...");
      Serial.print("Found ");
      Serial.print(sensors.getDeviceCount(), DEC);
      Serial.println(" devices.");

    // Search for devices on the bus and assign based on an index. Ideally,
      // you would do this to initially discover addresses on the bus and then
      // use those addresses and manually assign them (see above) once you know
      // the devices on your bus (and assuming they don't change).
      //
      // method 1: by index
      if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
      if (!sensors.getAddress(wallThermometer, 1)) Serial.println("Unable to find address for Device 1");
      if (!sensors.getAddress(outsideThermometer, 2)) Serial.println("Unable to find address for Device 2");
     
     
    Последнее редактирование: 24 мар 2024