Датчик температуры DS18B20 замедляет работу Arduino?
Недавно я столкнулся с проблемой, из-за которой обработка всего моего кода замедлялась, например, у меня был установлен таймер миллисекунд на одну минуту, но для завершения потребовалось 1:30 минуты, нажатие кнопок было запаздывающим и т. д.
После нескольких часов копания и комментирования кода по частям я наконец выяснил, что вызывает замедление работы!
контакт DATA моего датчика температуры DS18B20 подключается к контакту A0, когда я удаляю библиотеку, и коды, связанные с обработкой датчика, стали НАМНОГО быстрее, более быстрыми/отзывчивыми...
Погуглив немного, я понял, что все подключили датчик к контакту 2 Arduino!
Обработка медленная, потому что DS18B20 подключен к контакту A0 вместо контакта 2 или что-то не так с самим датчиком или это из-за Эта библиотека?
@ElectronSurf, 👍0
2 ответа
Лучший ответ:
Косвенно это библиотека.
Эта библиотека использует библиотеку OneWire.h. Протокол OneWire требует достаточно точной синхронизации, а поскольку библиотека OneWire.h отключает прерывания во время обмена данными.
Пока прерывания отключены, больше ничего не происходит. Это означает, что прерывание таймера, управляющее millis()
, не может «тикать», поэтому счетчик миллисекунд не увеличивается, пока вы обмениваетесь данными с датчиком температуры.
Программная функция, управляющая протоколом 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
- DS18B20 дает высокие показания. Как заставить его вернуть правильную температуру?
- Проблема с датчиком температуры и влажности DHT11
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- Сокращение времени считывания показаний датчиков температуры DS18B20.
- Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать?
- DHT11 возвращает неверные значения
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Как изменить разрешение DS18B20?
Привет Маженко, какую библиотеку вы предлагаете?, @ElectronSurf
На ардуино практически ничего нельзя сделать. Вам остается только смириться с этим и, возможно, компенсировать время, потраченное на общение., @Majenko
Вы имеете в виду, что смена библиотеки не решит проблему?, @ElectronSurf
Вам нужно будет сделать это на аппаратном уровне. Возможно, с переходником DS2482-100 I2C на OneWire., @Majenko
[эта библиотека](https://github.com/matmunk/DS18B20) не использует библиотеку onewire.h. нет другого пути?, @ElectronSurf
Да, это. В заголовочном файле:
#include <OneWire.h>
, @Majenko