Ошибка DS18B20 в Протеусе 8.13

Я использую приведенный ниже код для проверки температуры 36 датчиков DS18B20 с помощью Arduino Mega 2560. Если какой-либо из них превышает 50 градусов. Цельсия, затем он устанавливает выходной контакт в положение HIGH.

Я пытаюсь запустить код на Proteus 8.13, но во время того же запуска иногда виртуальный терминал печатает -127 градусов. Цельсия для всех, иногда правильное для некоторых датчиков и неправильное для других (обычно неправильное значение также составляет 85 градусов Цельсия). Что-то не так с симулятором или моим кодом?

    #include <OneWire.h>
    #include <DallasTemperature.h>
    
    #define NUM_SENSORS 36
    #define START_PIN 14
    #define OUTPUT_PIN 2
    
    OneWire oneWire[NUM_SENSORS];
    DallasTemperature sensors[NUM_SENSORS];
    
    void setup() {
      Serial.begin(9600);
    
      for (int i = 0; i < NUM_SENSORS; i++) {
        oneWire[i] = OneWire(START_PIN + i);
        sensors[i] = DallasTemperature(&oneWire[i]);
        sensors[i].begin();
      }
    
      pinMode(OUTPUT_PIN, OUTPUT);
      digitalWrite(OUTPUT_PIN, LOW);
    }
    
    void loop() {
      float celsius[NUM_SENSORS];
    
      for (int i = 0; i < NUM_SENSORS; i++) {
        sensors[i].requestTemperatures();
        celsius[i] = sensors[i].getTempCByIndex(0);
      }
    
      bool aboveThreshold = false;
    
      for (int i = 0; i < NUM_SENSORS; i++) {
        if (celsius[i] > 50.0) {
          aboveThreshold = true;
          break; 
        }
      }
    
      digitalWrite(OUTPUT_PIN, aboveThreshold);
    
      printSensorData(celsius);
    
      delay(1000);
    }
    
    void printSensorData(float celsius[]) {
      for (int i = 0; i < NUM_SENSORS; i++) {
        Serial.print("Sensor ");
        Serial.print(i + 1);
        Serial.print(": ");
        Serial.print(celsius[i]);
        Serial.print(" C  ");
        Serial.print(sensors[i].toFahrenheit(celsius[i]));
        Serial.println(" F");
      }
    }

, 👍0


1 ответ


0

Значение -127 указывает на неисправность аппаратного обеспечения, обычно на обрыв цепи. Также похоже, что ваш подтягивающий резистор не установлен или находится за пределами допустимого диапазона. Для Mega. UNO и другие блоки на 5 В. 4,7 К — хороший размер, а 3,3 К — для систем 3V3. Обратите внимание, что резистор идет от VCC к выходу датчика.

,

DS18B20 использует однопроводной протокол, без SDA и SCL., @hcheung

Получается, что каждый датчик находится на отдельном выводе - как бы 36 шин 1-Wire. Если это так, есть ли причина, по которой вы не установили датчики всего на несколько шин 1-Wire? Для этого потребуется гораздо меньше подтягивающих резисторов, и будет гораздо меньше механических соединений, которые могут выйти из строя. Существует полезная инструкция по применению [«Рекомендации по созданию надежных однопроводных сетей»](https://pdfserv.maximintegrated.com/en/an/AN148.pdf), в которой обсуждается, как создавать надежные большие сети и каковы ограничения являются., @JRobert