Водонепроницаемый датчик температуры 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:

Фото проводки:

wiring

, 👍1

Обсуждение

Можете ли вы поделиться своей проводкой, включая ЖК-дисплей через 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


1 ответ


1

В функции DallasTemperature requestTemperatures() происходит задержка — она блокируется до завершения преобразования температуры, если вы предварительно не вызвали setWaitForConversion(FALSE). Если бы вы это сделали, вам все равно пришлось бы ждать преобразования, но вы можете сделать это неблокирующим способом, и я не вижу, чтобы это происходило в вашем коде.

,

Спасибо. Это то, что мне нужно вызвать один раз при настройке? Или каждый раз, когда я опрашиваю температуру с датчика?, @Streamline

Глядя на эту библиотеку DS18b20, флаг *не* меняется, кроме как при внешнем вызове, поэтому установки его один раз должно быть достаточно. [Извините за опечатку в исходном ответе]., @JRobert