Датчик температуры LM35

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Профессор Шварценгольд, 15 апр 2019.

Метки:
  1. День добрый! Приобрел датчик температуры LM35. Хочу выводить температуру на экран но температура выводится рывками и при чем разброс такой приличный. Т.е. 1 секунда 22 градуса, 2 секунда 24, 3 секунда 20, 4 секунда 24 и так далее. Датчик стоит в комнате, движения ветра нет, быстрой смены температуры нет. Т.е. по идеи температура не должна так быстро меняться. Использую Ардуино Уно, датчик запитывается от контакта VIN, дата кабель датчика на пин А0. Вот скетч

    Код (C++):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x3F,16,2);  // Устанавливаем дисплей
    int TempSensor = 0;          // Подключаем датчик температуры к аналоговому выходу 0
    void setup()
    {
      lcd.init();                    
      lcd.backlight();// Включаем подсветку дисплея
      lcd.print("TEMPERATURA:  ");
      lcd.setCursor(8, 1);
      lcd.print("С");
      Serial.begin(9600); // подключаем монитор порта
    }
    void loop()
    {

    double valTempSensor = analogRead(TempSensor);    // считываем значение с датчика температуры
      double TempVoltage = valTempSensor*5.0/1024;          // приводим к опорному напряжению в вольтах
      double TempCelsious = TempVoltage*100;                // переводим в градусы Цельсия
      lcd.setCursor(0, 1);
      lcd.print(TempCelsious);
      delay(600);

    }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    От чего плата питается?
     
  3. От USB ПК.
     
  4. Airbus

    Airbus Радиохулиган Модератор

  5. Tomasina

    Tomasina Сушитель лампочек Модератор

    Для проверки засуньте датчик в любую коробку с крышкой, без щелей и отверстий. Если также прыгают показания, то что-то с питанием (наводки).

    P.S. независимо от датчика вот эта формула чтения с аналогового порта будет точнее:
    Код (C++):
    float TempVoltage = ((float) valTempSensor+ 0.5 ) / 1024.0 * 5.0;
    И замерьте вольтметром напряжение Vin - константа "5.0" выставлена для идеального Vin, которое равно точно 5,0 Вольт. В вашем случае может придется подкорректировать.
     
  6. 10мВ/C чувствительность. Это 1 LSB для ацп дуни. Скачки в четыре градуса без специальной схемотехники и фильтров это вполне ожидаемо.
    Считывайте десять раз и считайте среднее арифметическое.
     
    ИгорьК нравится это.
  7. ИгорьК

    ИгорьК Гуру

    Кольцевой фильтр, фильтр Калмана. Этим пользоваться проще, чем добиваться стабильного питания и отсутствия помех.

    Хотя, смотря зачем все это нужно, то есть - в чем цель измерений.
     
  8. parovoZZ

    parovoZZ Гуру

    Для конструктора - это нормально. С референсного напряжения в виде напряжения питания МК выше не прыгнешь. Смирись. Хочешь более точные показания с аналогового датчика - нужна выверенная смехотехника и программа не из конструктора.
     
  9. Измерил напряжение на выводе "5.0V" оно 5.01 вольта. Скажите правильно ли я вашу формулу интерпретировал?

    Код (C++):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x3F, 16, 2); // Устанавливаем дисплей
    float tempC;
    float reading;
    void setup()
    {
      lcd.init();
      lcd.backlight();
      lcd.print("TEMPERATURA:  ");
      lcd.setCursor(8, 1);
       Serial.begin(9600);
    }
    void loop()
    {
      reading = analogRead(A0);        // получаем значение с аналогового входа A0
      tempC = (reading + 0.5 ) / 1024.0 * 5.0;    
      Serial.print(tempC);            // отправляем в монитор порта
      Serial.println(" C");
      // Устанавливаем курсор на вторую строку и нулевой символ.
      lcd.setCursor(0, 1);
      // Выводим на экран количество секунд с момента запуска ардуины
      lcd.print(tempC);
      delay(1000);
    }
    Сейчас температура выводится как значение 0,25. Что то не то видимо в формуле.
     
  10. Tomasina

    Tomasina Сушитель лампочек Модератор

    Нет, приведенная мной формула для точного измерения напряжения, а не температуры.
    Надо так:
    Код (C++):
    reading = analogRead(A0);        // получаем значение с аналогового входа A0
    voltage = (reading + 0.5 ) / 1024.0 * 5.01;     // напряжение на порту, с учетом измеренного напряжения питания
    tempC = voltage * 100;             // переводим в градусы Цельсия
     
     
  11. 25.20 C
    21.28 C
    25.69 C
    27.64 C
    22.75 C
    24.22 C
    24.71 C
    26.18 C
    24.22 C
    23.73 C
    23.73 C
    24.71 C
    23.73 C
    27.64 C
    24.22 C
    25.20 C
    25.20 C
    22.75 C
    25.69 C
    24.71 C
    25.69 C
    Спасибо. В принципе не поменялось кардинально нечего. Вверху вывод температуры посекундно. Датчик поместил в не большое пространство где нет колебаний воздуха и температуры.
     
  12. parovoZZ

    parovoZZ Гуру

    1. сам АЦП - фуфловый. Поэтому нет никакого смысла снимать все 10 бит. Последний бит можно отбрасывать. А лучше два. Остаётся 8. Вот с ними и работать.
    2. Референс в виде напряжения питания - затея весьма смелая. У этих атмег даже внутренний референс в 1.1 вольта сильно скачет, не говоря уже про питающее напряжение. К тому же, как я подозреваю, не принято никаких мер по исключению помех на шине питания. Так тогда какой смысл в выводе десятичных (я не говорю про сотые) значений, если даже нет доверия к единицам градусов???
    Поэтому имеем то, что имеем - спиртовой градусник на стенке гораздо точнее, чем электронный. Хотя должно быть наоборот. Получился классический показометр - температура в комнате где-то между двадцатью и тридцатью градусами. Извольте-с одеться или раздеться по телесным ощущениям-с.
     
    Vovka нравится это.