DS1820 плохие показания 4-го датчика
Я новичок в Arduino. Я хочу добавить около 50 датчиков в Arduino R3. Я получаю хорошие показания от трех датчиков, но когда подключаю четвертый, получаю сообщение "Устройства не найдены".
Вот схема:
и вот код, который я использую:
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 8
#define BAUD_RATE 9600
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// arrays to hold device addresses
DeviceAddress devices[10];
int devicesFound = 0;
void setup(void)
{
// start serial port
Serial.begin(BAUD_RATE);
sensors.begin();
devicesFound = sensors.getDeviceCount();
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(devicesFound, DEC);
Serial.println(" devices.");
// report parasite power requirements
Serial.print("Parasite power is: ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");
for (int i = 0; i < devicesFound; i++)
if (!sensors.getAddress(devices[i], i))
Serial.println("Unable to find address for Device" + i);
// show the addresses we found on the bus
for (int i = 0; i < devicesFound; i++)
{
Serial.print("Device " + (String)i + " Address: ");
printAddress(devices[i]);
Serial.println();
}
for (int i = 0; i < devicesFound; i++)
sensors.setResolution(devices[i], TEMPERATURE_PRECISION);
}
// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
// zero pad the address if necessary
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC < 10)
Serial.print("0");
Serial.print(tempC);
}
// function to print a device's resolution
void printResolution(DeviceAddress deviceAddress)
{
Serial.print("Resolution: ");
Serial.print(sensors.getResolution(deviceAddress));
Serial.println();
}
// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
Serial.print("Device Address: ");
printAddress(deviceAddress);
Serial.print(" ");
printTemperature(deviceAddress);
Serial.println();
}
void loop(void)
{
if (devicesFound == 0)
{
Serial.println("No devices found.");
return;
}
int start=millis();
sensors.requestTemperatures();
// print the device information
for (int i = 0; i < devicesFound; i++)
{
printTemperature(devices[i]);
if (i != devicesFound - 1)
Serial.print(" ");
}
Serial.println();
Serial.print(millis() - start);
Serial.println(" ms passed.");
}
Я использую резистор номиналом 4,7 кОм. Что мне следует изменить, чтобы получить хорошие показания? И проблема ли получить показания примерно с 50 датчиков?
ОБНОВЛЕНИЕ
Итак, после нескольких попыток мне удалось получить показания 18 датчиков. Мне удалось создать смешанную топологию. Что я сделал, так это добавил рядом с датчиками резистор, который мне не удалось прочитать (в основном 4,7 кОм, но также несколько 100, 1 кОм). На данный момент я иногда получаю показания -127 от некоторых датчиков, но я думаю, что исправлю это с помощью проверки CRC в программе. Спасибо за вашу помощь! –
@gerpaick, 👍2
Обсуждение2 ответа
Лучший ответ:
Сначала проверьте датчики
Чтобы убедиться, что четвертый датчик не сломан и не приводит к сбою всего оборудования, поменяйте их местами и посмотрите, не возникнет ли сбой при добавлении четвертого датчика (хотя на этот раз это будет другой четвертый датчик).
То есть, если ваш текущий четвертый датчик становится вторым (а второй становится четвертым), он теперь выходит из строя на двух датчиках..? Или он все еще выходит из строя на четырех?
Если два (и три) работают, то (ранее) четвертый датчик не сломан.
Текущие проблемы с поставками
В этом случае может оказаться, что ваш блок питания от Arduino не обеспечивает достаточного тока, и вам необходимо запитать датчики от отдельного внешнего источника питания — отдельного от внешнего блока питания Arduino (особенно когда вы начинаете использовать 50 датчиков)1. Если вы это сделаете, не забудьте подключить GND Arduino (т. е. GND блока питания Arduino) к внешнему блоку питания для датчиков. Однако для четырех датчиков требуемый ток составит всего 4 x 4 мА = 16 мА, так что это не должно быть проблемой.
Если вы используете порт USB в качестве единственного источника питания, то это, скорее всего, вызовет проблемы. Убедитесь, что у вас есть внешний источник питания для Arduino, а не только USB. Кроме того, опять же, потребление 16 мА для 4 датчиков не должно быть проблемой.
Дополнительные ссылки
Есть похожая ссылка на ссылку Мишеля на SE.Electronics, на SE.RPi: Какое максимальное количество датчиков DS18B20 можно подключить к одному входному порту?
На форуме Arduino есть эта тема: Проблема с DS18B20 OneWire и длинными кабелями:
Я добился большего с 1-Wire, используя выделенные интерфейсы, а не подключаю устройство к Arduino, но подозреваю, что принципы те же будет применяться...
a) Вам лучше НЕ использовать паразитный режим. Скромный дополнительный "Неприятности" того стоят.
б) Используйте кабель Cat-5
c) «Волшебный резистор» (упомянутый выше) часто помогает. Правильный ценность? Используйте метод проб и ошибок!
d) Обязательно подключайте несколько микросхем 1-Wire последовательно, а не последовательно. "звезда"... т.е. ОДНА прокладка из двух проводов с чипами 1-wire поперек нее, как перекладины лестницы... НЕ имеют нескольких проводов, выходящих из где находится ваш Arduino, с чипами 1-Wire на каждом из нескольких «лучей» "звезды".
Я протестировал цепочки из трех или четырех датчиков температуры 1-Wire на кабели cat-5 длиной до... эмм, по памяти... 40 м? Они БУДУТ работать! Но как я уже сказал... это было с адаптерами 1-Wire.
Но длина кабеля, похоже, не является вашей проблемой, если ваша диаграмма Fritzing является точным отображением...
В этой длинной теме у кого-то возникли проблемы с более чем семью датчиками, что похоже на вашу проблему, см. Несколько проблем со считыванием DS18B20. Подводя итог, можно сказать, что длина и качество кабеля важны, и избегайте топологии звезда.
1 Для ясности: вам понадобится два блока питания. Один для Arduino и один для 50 датчиков.
Я подключил USB и блок питания к Arduino. Я все еще могу получить показания только с 3 датчиков. И я застрял на 4 датчиках. До 50 еще далеко..., @gerpaick
Хм, если все датчики работают правильно, и, как предполагает Мишель, 4 датчика потребляют только 16 мА, то должно быть что-то еще, что вызывает сбой. Не уверен. Извините. Но ссылка на SE.Electronics в ответе Мишеля выглядит интересной., @Greenonline
Я подключил питание к 3,3 В на плате Arduino и получил показания с 4-го датчика. Но теперь больше. Завтра я собираюсь подключить еще один блок питания только для датчиков. Как я прочитал, 5 В для этого достаточно, я не прав? Мне также следует подключить GND от этого блока питания к GND на Arduino, верно?, @gerpaick
Да, заземление должно быть подключено. Какой кабель вы используете от макетной платы до Arduino и какой он длины? Избегайте топологии звезды. Все ли датчики находятся на одной макетной плате (кажется, это хорошая идея для проверки) Вот еще одна ссылка (у кого-то проблемы с более чем 7 датчиками), https://www.raspberrypi.org/forums/viewtopic.php?t=64477. Удачи. Я хотел бы узнать, как решить вашу проблему, @Greenonline
Спасибо за ссылку. Интересное чтиво. Я использую обычные перемычки, купленные на ebay, на той же макетной плате. Датчики DS1820 находятся на кабеле длиной около 1 м. Таким образом, расстояние от Arduino до датчика составляет максимум 1,4 м. После теста мне нужно подключить эти датчики с помощью 3-жильного кабеля 0,5 мм2., @gerpaick
Я подключил внешний блок питания к датчикам, но без изменений. По-прежнему было видно максимум 3 датчика. У меня также есть этот модуль адаптера DS18B20 для Arduino (https://www.amazon.co.uk/Waterproof-DS18B20-Digital-Temperature-Adapter/dp/B06XJH5HLB/ref=sr_1_1?ie=UTF8&qid=1534371709&sr=8-1&keywords=ds18b20+adapter), и когда я его использую, я вижу новый датчик. У меня подключено 3 датчика без этого адаптера и 2 датчика с этими адаптерами. Мне нужен этот адаптер для каждого датчика? Есть ли шанс, что я смогу сделать это сам? Они довольно дорогие, @gerpaick
Интересно узнать. Итак, теперь у вас есть 5 устройств, видимых для Arduino? Что касается того, сможете ли вы сделать адаптер самостоятельно, возможно, вам придется поискать схему. Но стоит ли это делать, вы узнаете только после того, как найдете схему. Завтра у меня может быть для вас рыбка. Продолжайте в том же духе и держите нас в курсе :-), @Greenonline
Я нашел эту ссылку https://info.kmtronic.com/lan-ds18b20-temperature-monitor-resistors-scheme.html , исходя из вашего опыта, как вы думаете, это может решить мои проблемы? Там также есть ссылка с более подробной информацией, но, как я уже сказал, я совсем новичок и не могу понять этот технический язык., @gerpaick
Похоже, это компенсация очень длинных проводов, но вы ведь не используете очень длинные провода (в настоящее время), не так ли? Так что, возможно, это не текущая проблема. Также обратите внимание на [комментарий Гербена](https://arduino.stackexchange.com/quest ions/55304/ds1820-bad-reading-from-4th-sensor/55306#comment116619_55305) ниже - дополнительное питание для датчиков может быть неактуальным/необходимым. Я вижу, что вы приняли мой ответ, означает ли это, что вы решили проблему?, @Greenonline
Это определенно не проблема с программным обеспечением. У меня проблема с проводкой. Я не знаю, где. Из этого вопроса я почерпнул много материала, из которого могу извлечь уроки, и я совершенно уверен, что если я его изучу, то смогу найти то, чего мне не хватает. Я заказал больше адаптеров терминала ds1820, надеясь, что это решит проблему. Но подключение большего количества датчиков к этому адаптеру позволило мне их увидеть, так что я думаю, что проблема в проводке. Я не знаю, где, но я выясню :), @gerpaick
Итак, после нескольких попыток мне удалось получить показания для 18 датчиков. Мне удалось получить смешанную топологию. Я добавил резистор рядом с датчиками, которые я не считывал (в основном 4,7 кОм, но также несколько 100, 1 кОм). В настоящее время я иногда получаю показания -127 от некоторых датчиков, но я думаю, что исправлю это проверкой CRC в программе. Спасибо за помощь!, @gerpaick
@gerpaick, это здорово, что у вас это получилось, и спасибо, что сообщили нам. Вам действительно стоит разместить свой комментарий выше как отдельный ответ, так как тогда он будет доступен для поиска (комментарии не доступны для поиска). Кроме того, комментарии, как правило, в конечном итоге очищаются, поэтому было бы безопаснее написать все это в ответе :-)., @Greenonline
Максимальный ток
Для 4 датчиков я бы не ожидал проблем, однако для 50 они будут. Максимальный ток на выводе VCC/GND составляет 200 мА, см. Ограничения тока на выводах Arduino.
(Обновление после замечания Gerben, спасибо!): Однако они предназначены для ATMega, а не для Arduino R3. См. Arduino Voltage and Current. Это не официальный документ, но его создал Габриэль Стэплз. Он содержит много ссылок. Но VCC может обрабатывать 0,5 или 1 А в зависимости от USB или питания от батареи.
Это означает: DS1820 использует 4 мА (проверка случайного листа данных), поэтому 50 * 4 = 200 мА, что значительно меньше 500 мА/1000 мА).
Датчики без одного провода (не ваш случай)
Поскольку у вас датчики с одним проводом, следующее неприменимо (просто оставьте это здесь для других):
Ни один однопроводной датчик не использует в основном свой собственный GPIO-контакт. Поскольку Arduino не имеет 50 GPIO-контактов, особенно для аналогового ввода, вам нужны внешние ИС, АЦП (аналого-цифровые преобразователи) или аналоговые мультиплексоры, см. также подключение более 6 аналоговых входных контактов к Arduino.
Датчики с одним проводом (ваш случай)
Возможно, вам будет интересно узнать, сколько датчиков температуры ds18b20 можно подключить к одной шине.
Спасибо за ответ. Насколько я читал об oneWire, я могу подключить много датчиков к одному цифровому выводу. По этой причине я использую DS1820., @gerpaick
@gerpaick да, я только что это увидел (и узнал кое-что), и нашел ссылку, которая может быть вам интересна, см. конец ответа., @Michel Keijzers
Этот предел в 200 мА относится к ATMega328. Это не относится к выводам питания UNO, поскольку ток, проходящий через выводы Vcc и GND UNO, никогда не проходит через ATMega., @Gerben
@Gerben спасибо, я не знал об этом, я добавил ссылку на источник, который выглядит нормально., @Michel Keijzers
- Ошибка компиляции в nodeMCU вместе с датчиком температуры oneWire ds18b20 и ЖК-дисплеем 2x16 (не I2C)
- DS18b20 Заказ датчиков на кабеле
- Подключение DS18B20 к Arduino pro mini
- Обнаружение датчиков DS18B20 и правильное назначение их реле
- Драйвер Arduino One Wire Bus DS18B20 собственной разработки, в котором отсутствуют биты или посторонние биты
- Установка значения float до двух знаков после запятой
- Эмуляция 1-проводных устройств
- ESP-01 неправильно просыпается после глубокого сна
Спасибо за совет. Я изменил схему. Надеюсь, теперь это имеет больше смысла. Я проверю с помощью внешнего источника питания (сейчас я подключен к USB)., @gerpaick
Я подключил внешний источник питания. Выход 9В 2000мА. Но я получаю тот же результат. Датчики менял местами, поэтому неисправный исключаю. Я подключил питание и USB одновременно, потому что мне нужно видеть показания., @gerpaick