Почему показания датчика температуры становятся непоследовательными при добавлении к плате дополнительного оборудования?

У меня возникла странная проблема. Мой датчик TMP 36 отлично работает, когда он единственный, подключенный к моей плате Arduino Uno. Измерения напряжения, а значит и температуры, точны и последовательны. Однако, когда я подключаю ЖК-экран к Uno и программа выводит на экран измерения TMP, значения становятся непоследовательными и могут меняться на 10 градусов по Фаренгейту от одного показания к другому. (У меня датчик выполняет измерение каждую секунду.) Этого не происходит, когда ЖК-экран не подключен. Я решил отсоединить отдельные разъемы от экрана и посмотреть, когда измерения снова станут последовательными. Я попробовал это один раз и обнаружил, что заземляющий провод, который идет к соединению 5 на экране, вызывал изменение значения, когда я неоднократно вставлял и вынимал его из заземляющего контакта. Значения TPM менялись, даже когда к ЖК-дисплею не было ничего подключено (он не был включен), кроме заземляющего провода. Я не понимаю, как это возможно, и не знаю, является ли это проблемой оборудования или программного обеспечения.

Я перемонтировал ЖК-экран, начав с проводов датчика, затем провода заземления, а затем два соединения 5 В, одно из которых имело резистор 220 Ом. Я сделал это, пока схема была запитана, и наблюдал за значениями на предмет любых больших изменений. Первое изменение произошло через несколько секунд после того, как я подключил последний провод 5 В. Датчик показывал 80 градусов по Фаренгейту, а затем 85 градусов по Фаренгейту секунду спустя. Затем он упал до 81 на несколько секунд, затем до 87. Значения продолжали меняться, но не так сильно, как в прошлые разы. Кстати, температура в области, где находится Arduino, составляет около 82 градусов по Фаренгейту.

Значения TMP не изменяются более чем на 3 градуса по Фаренгейту, когда ЖК-дисплей не подключен к экрану. Я не понимаю, что может быть причиной этого. У кого-нибудь еще была такая проблема или кто-то знает причину?

Вот макет.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12,11,5,4,3,2);
const int sensorPin = A5;
const float baselineTemp = 20.0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorVal = analogRead(sensorPin);
  Serial.print("Sensor value: ");
  Serial.print(sensorVal);
  float voltage = (sensorVal / 1024.0) * 5.0;
  Serial.print(", volts: ");
  Serial.print(voltage);
  Serial.print(", degrees C: ");
  float temperature = (voltage - .5) * 100;
  Serial.print(temperature);
  Serial.print(", degrees F: ");
  float fahrenheit = (temperature * 1.8 + 32);
  Serial.println(fahrenheit);
  delay(1000);
  lcd.begin(16,2);
  lcd.print(fahrenheit);
  lcd.print(" degrees F");
  float averageTemp;
  if(temperature < baselineTemp) {
    lcd.setCursor(0,1);
    lcd.print("Below room temp");
  }
}

, 👍5

Обсуждение

У вас может быть несколько проблем: электрический шум, просадка питания под нагрузкой в схеме, которая не учитывает это, или, возможно, потребление энергии схемой (большая часть которой будет в конечном итоге в виде тепла), из-за чего сборка нагревается немного выше температуры окружающей среды. На ваш вопрос невозможно ответить без точных данных о вашей установке — схем, номеров деталей, **и физической компоновки**., @Chris Stratton

Можете ли вы попробовать поставить диод (например, светодиод) между ними? Таким образом вы исключите возможность обратной подачи на ЖК-дисплей. Можете ли вы также рассказать нам, какой датчик температуры вы используете? Я делал похожий проект (с DS18B20), но он не вызывал странных показаний ......, @Mero55

Я добавил свой код на всякий случай, хотя я очень сомневаюсь, что он имеет какое-либо отношение к этому. Я также добавлю макет., @MICROexchange6

Макет есть в посте., @MICROexchange6

Вашу «макет» практически невозможно интерпретировать, но попробуйте подключить датчик температуры к источнику питания собственными проводами, чтобы он не делил их с ЖК-дисплеем, и добавьте несколько блокировочных конденсаторов., @Chris Stratton


5 ответов


3

Не берите питание для ЖК-дисплея с контактов Uno. Подключите питание ЖК-дисплея к отдельному источнику питания.

,

+1, Полезное предложение, потому что TMP 36 — это аналоговый датчик, а шум или провал питания могут повлиять на показания. Почему проезжающий мимо минус, @someone?, @JRobert

Я не ставил минус, но это вообще не полный ответ. Это просто общий совет без каких-либо обоснований. Он должен объяснить, почему питание ЖК-дисплея должно быть от отдельного источника питания, и как это связано с вопросом., @redstarcoder


0

Я не вижу +5v -> Aref (и Aref -> байпасный конденсатор -> Gnd). Необходимо, если вы используете напряжение питания в качестве опорного, как вы, судя по всему, и делаете.

,

1

Для аналогового датчика, такого как TMP36, Arduino использует 5 В в качестве опорного. Если 5 В изменяется (но напряжение TMP36 остается прежним), Arduino считает, что изменилась температура. Значение, возвращаемое analogRead(), увеличивается. Вот почему температура, кажется, повышается, если 5 В понижается.

TMP36 (с резистором) выдает определенное напряжение. Это отличается от «ратиометрических» датчиков, они выдают напряжение относительно 5 В, и изменения 5 В не оказывают влияния на результат. «Ратиометрический» датчик — это, например, мост Уитстона или LDR с резистором.

С TMP36 вам нужен хороший опорный источник напряжения для считывания фактического напряжения. Можно использовать внутренний опорный источник напряжения. Возможно, понадобится дополнительный делитель напряжения. Или используйте источник питания для разъема power barrel и позвольте встроенному регулятору напряжения создать фиксированное напряжение 5 В, которое можно использовать в качестве опорного.

При использовании цифровых датчиков температуры, таких как DS18B20, все эти проблемы мгновенно исчезают.

5 В никогда не следует подключать к AREF. По умолчанию он уже внутренне подключен к VCC, и когда выбирается внутренний опорный источник напряжения, вывод AREF изменяет напряжение. В этом случае создается внутренняя короткая ссылка, когда AREF подключается к 5 В. Нет необходимости добавлять 100 нФ к AREF, поскольку Arduino Uno уже имеет 100 нФ к AREF и GND.

На макетной плате могут быть плохие контакты. Поскольку ток ЖК-дисплея использует те же провода GND и +5 В, он может влиять на TMP36. Лучше использовать отдельные провода, как уже упоминал Крис Стрэттон. Чтобы уменьшить шум, можно взять несколько значений analogRead() и использовать среднее значение. Для аналогового датчика температуры общепринятой практикой является усреднение нескольких выборок.

,

1

Попробуйте запитать свою схему от батареи 9 В. У меня тоже была эта проблема, и она работала, когда я использовал отдельный источник питания. Похоже, это электрический шум, вызванный USB вашего компьютера. Ответ, опубликованный JRobert, должен быть необходим, если вы хотите запитать от компьютера.

,

1

У меня была эта проблема, и я подключил конденсатор 0,1 мкФ параллельно датчику и добился значительного снижения шума (в пределах половины градуса, что на самом деле составляет +- один тик).

,