Датчик температуры DS18B20 замедляет работу Arduino?

Недавно я столкнулся с проблемой, из-за которой обработка всего моего кода замедлялась, например, у меня был установлен таймер миллисекунд на одну минуту, но для завершения потребовалось 1:30 минуты, нажатие кнопок было запаздывающим и т. д.

После нескольких часов копания и комментирования кода по частям я наконец выяснил, что вызывает замедление работы!

контакт DATA моего датчика температуры DS18B20 подключается к контакту A0, когда я удаляю библиотеку, и коды, связанные с обработкой датчика, стали НАМНОГО быстрее, более быстрыми/отзывчивыми...

Погуглив немного, я понял, что все подключили датчик к контакту 2 Arduino!

Обработка медленная, потому что DS18B20 подключен к контакту A0 вместо контакта 2 или что-то не так с самим датчиком или это из-за Эта библиотека?

, 👍0


2 ответа


Лучший ответ:

2

Косвенно это библиотека.

Эта библиотека использует библиотеку OneWire.h. Протокол OneWire требует достаточно точной синхронизации, а поскольку библиотека OneWire.h отключает прерывания во время обмена данными.

Пока прерывания отключены, больше ничего не происходит. Это означает, что прерывание таймера, управляющее millis(), не может «тикать», поэтому счетчик миллисекунд не увеличивается, пока вы обмениваетесь данными с датчиком температуры.

,

Привет Маженко, какую библиотеку вы предлагаете?, @ElectronSurf

На ардуино практически ничего нельзя сделать. Вам остается только смириться с этим и, возможно, компенсировать время, потраченное на общение., @Majenko

Вы имеете в виду, что смена библиотеки не решит проблему?, @ElectronSurf

Вам нужно будет сделать это на аппаратном уровне. Возможно, с переходником DS2482-100 I2C на OneWire., @Majenko

[эта библиотека](https://github.com/matmunk/DS18B20) не использует библиотеку onewire.h. нет другого пути?, @ElectronSurf

Да, это. В заголовочном файле: #include <OneWire.h>, @Majenko


1

Программная функция, управляющая протоколом 1-wire, обычно имеет несколько непрерываемых разделов для обеспечения синхронизации шины. Это может сделать ваш процессор недоступным в течение длительного периода времени.

Хуже того, некоторые реализации вообще не допускают никаких прерываний.

И даже если ваша реализация допускает прерывание, она, как правило, блокирует основной цикл, поскольку он не выполняется в самом прерывании.

Использование аппаратной реализации для управления 1-wire вместо полного программного обеспечения освободит ЦП от управления синхронизацией и ожидания завершения 1-wire. Но такая аппаратная реализация обычно недоступна в микроконтроллерах.

Однако есть срединный путь. Реализация с открытым исходным кодом, использующая UART микропроцессора или контроллера для обеспечения доступности таймингов ( https://github.com/ MaJerle/onewire_uart) — у MAXIM также есть примечания по применению ( https: //www.maximintegrated.com/en/app-notes/index.mvp/id/214). Это также разгружает процессор и может управляться прерываниями.

Медленна ли обработка, потому что DS18B20 подключен к контакту A0, а не к контакту 2? Это может повлиять, если процессор на вашей плате Arduino будет иметь (частично) совместимый с 1-wire источник на другом выводе, и в этом случае библиотека должна будет воспользоваться этим.

Что-то не так с самим датчиком? Как правило, это не так, но в случае, если у вас есть два датчика на одной шине, протокол 1-wire работает медленнее, поскольку ему нужно найти все периферийные устройства, а мастер должен указать, к какому из них он обращается.

Это из-за "Эта библиотека"? Это не из-за этой библиотеки, но есть другие реализации (см. ссылку выше), которые используют аппаратные ресурсы для повышения производительности за счет использования аппаратных ресурсов (некоторые MCU имеют только 1 HW UART, поэтому у вас не будет второго один, если вам также нужна связь RS232, например, на других сигнальных линиях).

,

UART кажется довольно крутым, но слишком продвинутым для такого пользователя, как я, я пытался читать документы, но чем больше я читал, тем больше я терял! мы подключаем одну сторону UART к двум транзисторам, а другую сторону к ардуино? я выберу ваш ответ как правильный, если вы, пожалуйста, помогите мне понять это..., @ElectronSurf

Шина 1-wire является двунаправленной, поэтому ведомое устройство должно иметь возможность понизить уровень линии. Стандартная операция TX UART заключается в том, чтобы всегда управлять выходом. В примечаниях по применению (https://majerle.eu/documentation/ow/html/page_appnote.html) предлагается решение, в котором два каскадных транзистора преобразуют TX в выход с открытым стоком. В том же примечании к применению указано, что если ваш UC допускает открытый сток на самом выходе, то вам это не нужно (говорят, что STM32 это позволяет) — в этом случае контакты TX и RX соединяются вместе. В обоих случаях у вас есть настоящая однопроводная шина., @le_top