Ошибка 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");
}
}
1 ответ
Значение -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
- Драйвер Arduino One Wire Bus DS18B20 собственной разработки, в котором отсутствуют биты или посторонние биты
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
+85 град.С - это значение, возвращаемое этими датчиками после включения/сброса (этого датчика) - возможно, не совсем совпадение. Могли ли устройства, возвращающие это значение, иметь (имитированное) прерывание питания?, @JRobert