Водонепроницаемый датчик температуры SPI.
В моем текущем проекте я использую DS18B20, который, похоже, является единственным датчиком температуры, который появляется при поиске в Google водонепроницаемого датчика температуры для Arduino.
С самим датчиком все в порядке, однако я вывожу данные датчика на экран SPI, и всякий раз, когда датчик вызывается для чтения данных, я считаю, что связь SPI прерывается из-за 1-Wire, и вы можете увидеть белое мерцание на экране. Фоновый светодиод мигает ярче в течение одного кадра. Это почти незаметно, но меня беспокоит.
Я не использую задержки и не перерисовываю лишние элементы на экране заново. При необходимости обновляются только динамические элементы, статические элементы отрисовываются на экране только один раз. Датчик вызывается каждые 5 секунд со сравнением:
if(currentTime - lastTimeQueried >= delay){
lastTimeQueried = currentTime;
temperature = new temperature;
return temperature;
} else {
return temperature;
}
Я также попробовал функцию, при которой я постоянно вызываю датчик и рисую на экране только в случае изменения температуры, но тогда экран все время мерцает. Таким образом я делаю вывод, что мерцание вызвано собственно вызовом сенсора, а не перерисовкой чего-либо на экране.
Итак, мне интересно, есть ли альтернатива DS18B20, которая обменивается данными через SPI и которую я могу использовать в аквариуме, чтобы мне не приходилось использовать оба протокола в моем проекте.
Изменить:
По запросу еще немного моего кода и проводки:
Экран подключен к разъемам ICSP на моем Arduino Mega 2560, а питание подается через 5 В от блока питания, подключенного к моему макету.
DS18B20 подключается к контакту 29 на Arduino, а также получает питание через 5 В от того же источника питания.
//TFT SPI
#define TFT_DC 9
#define TFT_CS 10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
//SD Card Reader SPI
//#define SD_CS 4
//Touchscreen I2C
UTouch myTouch(5, 8, 6, 7, 2); //(T_CLK, T_CS, T_DIN, T_DOUT, T_IRQ)
#define ONE_WIRE_BUS 29
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Вот еще несколько переменных, которые я определил для облегчения использования датчика:
//Измерение температуры
unsigned long lastTempMeasure; //Сохраняет последнюю временную метку unix, измеренную в
char tempMeasureDelay = 5; //Вызов температуры каждые 5 секунд
float sensorTemp; //Удерживает измеренную температуру
В моем цикле я использую эту функцию:
tft.print(temperatureCall());
а затем:
float temperatureCall(){
//получаем unix-время прямо сейчас
unsigned long currentUnix = now();
//если с момента последнего опроса прошло 5 секунд, запросить новую температуру, иначе вернем старое измерение
if(currentUnix - lastTempMeasure >= tempMeasureDelay){
lastTempMeasure = currentUnix; //сохраняем время последнего опроса
sensors.requestTemperatures();
sensorTemp = sensors.getTempCByIndex(0);
return sensorTemp;
} else {
return sensorTemp;
}
}
Как я уже сказал, мерцание происходит только тогда, когда эти два используются каждые 5 секунд:
sensors.requestTemperatures();
sensorTemp = sensors.getTempCByIndex(0);
Изменить 2:
Фото проводки:
@Streamline, 👍1
Обсуждение1 ответ
В функции DallasTemperature requestTemperatures()
происходит задержка — она блокируется до завершения преобразования температуры, если вы предварительно не вызвали setWaitForConversion(FALSE)
. Если бы вы это сделали, вам все равно пришлось бы ждать преобразования, но вы можете сделать это неблокирующим способом, и я не вижу, чтобы это происходило в вашем коде.
Спасибо. Это то, что мне нужно вызвать один раз при настройке? Или каждый раз, когда я опрашиваю температуру с датчика?, @Streamline
Глядя на эту библиотеку DS18b20, флаг *не* меняется, кроме как при внешнем вызове, поэтому установки его один раз должно быть достаточно. [Извините за опечатку в исходном ответе]., @JRobert
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- Путаница между SPI и I2C для SSD1306 OLED
- Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать?
- Взаимодействие с датчиком SSI?
- Объединение кода для нескольких датчиков в одной программе
- Датчик перепада давления DLHR SPI
- DHT20 и дисплей Oled не работают вместе
- Проблема MAX31865 и PT100
Можете ли вы поделиться своей проводкой, включая ЖК-дисплей через SPI и DS18B20, а также еще немного вашего кода?, @Sener
@Sener Я обновил свой пост, @Streamline
Это больше похоже на проблему с питанием, чем на проблему со связью. Как вы включаете подсветку дисплея?, @Majenko
Спасибо за подробности, видеть общую картину в большинстве случаев помогает. Я считаю, что контакты SPI не используются совместно с другими устройствами SPI. Итак, датчик находится на одном из цифровых контактов, и это тоже нормально. Но, поскольку в onewire используется битовая передача, было бы разумно попробовать другие контакты для датчика. Кроме того, светодиодная подсветка не очевидна. Я думаю, что он напрямую подключен к 5В, не так ли? Я рекомендую измерить напряжение и ток, который плата потребляет. Если они колеблются (падение напряжения) или делают резкие движения, мы можем принять меры оттуда., @Sener
Я также подумал, что это действительно может быть проблема с питанием, поскольку датчик использует подтягивающий резистор на линии передачи данных, которая подключена к 5 В. @Majko Светодиод подсветки питается от блока питания напряжением 5В. Дополню пост фотографией проводки., @Streamline
@Sener, почему было бы разумно попробовать другой контакт для датчика? Какой еще пин посоветуете?, @Streamline
Это действительно похоже на внезапное падение напряжения или отсутствие тока (крошечное) при активном датчике считывания. Но в технических характеристиках указано, что это не так уж и важно: от 1 мА до 4 мА. Но, помимо этого, я говорю, что ЖК-дисплеи, работающие на одном из моих продуктов, не очень надежны. В партии у них подсветка у некоторых яркая, у некоторых блеклая, у некоторых мерцающая., @Sener
Я всегда стараюсь попробовать другой вывод при отладке некоторых проблем, чтобы устранить противоречивую конструкцию некоторых ворот, особенно компонентов клонирования. Никогда не знаешь., @Sener
Хм, определенно пища для размышлений. Будет подробнее изучить это. К сожалению, я не могу измерить падение напряжения с помощью мультиметра, который показывает в основном постоянные значения на подсветке. Определенно никаких падений или пиков каждые 5 секунд. Этот проект может стать продуктом, но на этом этапе я буду работать вместе с другом-электриком, который поможет мне в этом, чтобы он мог знать больше. Спасибо, что поделились своими знаниями, ребята, это действительно сводило меня с ума, знание того, что за этим стоит, или, по крайней мере, подтолкнуло меня в правильном направлении, определенно облегчило мой разум., @Streamline
В любой момент. И последнее замечание: вы можете попытаться разместить электролитический элемент емкостью 10 мкФ на шине питания между GND и 5 В. Это может буферизовать (выкупить) некоторое время, когда питание влияет на считывание данных с датчика. Удачи с вашим проектом., @Sener
Протокол 1-wire использует определенное время. Для этого библиотека OneWire временно отключает прерывания для создания этого сигнала. Вы можете проверить это, отключив прерывания на некоторое время и посмотреть, что произойдет. Неужели нет времени на библиотеку OneWire, не беспокоя дисплей? Возможно, эскиз нужно подправить. Есть хорошие датчики температуры i2c. Вы можете сделать их водонепроницаемыми с помощью материалов, безопасных для пищевых продуктов. Лучшим решением может быть замена дисплея и использование интеллектуального дисплея с последовательной связью., @Jot
@Jot, на дисплее есть часы, которые тоже показывают секунды. Возможно, я смогу что-нибудь подстроить, но тогда это может замедлить весь эскиз., @Streamline
@Sener Я добавил конденсатор в свою проводку. Еще одно интересное наблюдение, которое я сделал, заключается в том, что если я подключаю землю от моей направляющей к земле моего Arduino, экран становится полностью белым после того, как скетч проработает 5 секунд, предположительно потому, что затем он вызывает температуру датчика. Когда вынимаю конденсатор, происходит то же самое, но только через 10 или 15 секунд., @Streamline
То, что вы говорите, напоминает мне мой другой опыт совместной работы двух SPI. Если вы не подключите резисторы (4 к7), последовательно подключенные к контактам MOSI и SCK, они будут влиять друг на друга, и мой 2,2-дюймовый TFT-дисплей станет белым. Если да, то то, что говорит @jot, может иметь отношение к вашей проблеме. Вы также можете попробовать другую версию 1-wire библиотек. Скажем, [библиотека 1-wire](https://github.com/PaulStoffregen/OneWire), @Sener
@Sener Я уже использовал резисторы номиналом 1 кОм на каждой линии передачи данных. Я попробовал резисторы 5 кОм, но тогда мне не удалось поддерживать работу дисплея. Он отображал один кадр, а затем делал странные вещи. Пробовал использовать резисторы 2 кОм, что, похоже, немного улучшило проблему. К сожалению, у меня нет под рукой резисторов 4,7 кОм... Мне действительно следует расширить детали, которые у меня есть в моем учебном наборе., @Streamline