LM35DZ скачут показания на длинном проводе

Al_Ninyo
Offline
Зарегистрирован: 09.11.2014

Доброго времени суток, уважаемые!

Сделал себе небольшую погодную станцию дома (Arduino Nano + RTC DS1302 + DHT11 + LM35DZ + LCD Nokia 5110).

DHT11 изначально с помощью примерно 3-4 метров проводов из витой пары был вынесен на балкон. Сейчас решил его сделать комнатным термометром (всё равно он минуса не меряет), а для улицы прилепить имеющийся LM35DZ (под рукой пока больше ничего нет). Подключил LM35DZ напрямую к Ардуинке - показания адекватные, меняются при нагревании/охлаждении датчика. Повесил его на провода на балконе вместо DHT11 - показания стали скакать как ужаленные :( Укоротил сигнальный кабель почти в 2 раза (около 2-х метров осталось, короче никак) - не помогло. Значения скачут от 0 до 20+.

Проблема вроде как не в коде, т.к. без проводов всё работает. Может кто-нибудь подсказать, как это побороть? Может кто знает, какая длина провода максимальная для него? ESP866 и далласовские датчики ждать ещё месяц, а хочется уже сейчас смотреть температуру красиво :) Есть желание дальше модернизировать систему (включать подсветку экрана по кнопке, например, чтобы ночью не светилось), но эта беда немного омрачает радость творчества.

Да, питание ардуинки идёт от отдельного БП (телефонная зарядка) - 5 В / 700 мА.

На всякий случай скетч, вдруг кому пригодится:

#include <stdio.h>
#include <DS1302.h>

namespace {

// Set the appropriate digital I/O pin connections. These are the pin
// assignments for the Arduino as well for as the DS1302 chip. See the DS1302
// datasheet:
//
//   http://datasheets.maximintegrated.com/en/ds/DS1302.pdf

//DS1302 pins
const int kCePin   = 10;  // Chip Enable (RST)
const int kIoPin   = 9;  // Input/Output (DA)
const int kSclkPin = 8;  // Serial Clock (CLK)

//LCD pins
//RST - 6
//CE - 7
//DC - 5
//Din - 4
//Clk - 3


// Create a DS1302 object.
DS1302 rtc(kCePin, kIoPin, kSclkPin);

String dayAsString(const Time::Day day) {
  switch (day) {
    case Time::kSunday: return "Вс";
    case Time::kMonday: return "Пн";
    case Time::kTuesday: return "Вт";
    case Time::kWednesday: return "Ср";
    case Time::kThursday: return "Чт";
    case Time::kFriday: return "Пт";
    case Time::kSaturday: return "Сб";
  }
  return "(unknown day)";
}
}  // namespace

#include <PCD8544.h>
static PCD8544 lcd;

#include "DHT.h"

#define DHTPIN 13
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

float tempOut;
int tempOutPin = 7; // пин подключения LM35DZ

void setup() {
  Serial.begin(9600);
  dht.begin();
  lcd.begin(84, 48);
  //раскомментить, чтобы задать время!

//  rtc.writeProtect(false);
//  rtc.halt(false);
    // Sunday, September 22, 2013 at 01:38:50.
//  Time t(2015, 3, 18, 20, 54, 50, Time::kWednesday);

    // Set the time and date on the chip.
//  rtc.time(t);
  
}

void loop() {
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  tempOut = analogRead(tempOutPin);
  tempOut = tempOut * 0.48828125;
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
    lcd.setCursor(0, 0);
    lcd.print("Failed to read from DHT");
  } else {
    lcd.setCursor(0, 0);
    lcd.print("Темп-ра Дом/Ул");
    lcd.setCursor(0, 1);
    if (t < 10) {
      lcd.print(t);
      lcd.print(" ");
    } else {
       lcd.print(t); 
      }
    lcd.setCursor(12, 1);
    lcd.print(" / ");
    if (tempOut < 10) {
      lcd.print(tempOut);
      lcd.print(" ");
    } else {
       lcd.print(tempOut);
      }
    lcd.print(" *C");
    lcd.setCursor(0, 2);
    lcd.print("Влажность ");
    lcd.setCursor(0, 3);
    lcd.print(h);
    lcd.setCursor(12, 3);
    lcd.print("%");
    lcd.setCursor(24, 3);
      if (h < 40) {
        lcd.print("- сухо\t");
      } else if (h > 60) {
        lcd.print("- мокро\t");
      } else {
        lcd.print("- норма\t"); 
      }
/*    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" *C");
    Serial.print("TEMPRATURE = ");
  Serial.print(tempOut);
  Serial.print("*C");
  Serial.println();
*/
    // Get the current time and date from the chip.
  Time t = rtc.time();

  // Name the day of the week.
  const String day = dayAsString(t.day);

  // Format the time and date and insert into the temporary buffer.
  char buf[50];
  snprintf(buf, sizeof(buf), "%s %02d.%02d.%04d %02d:%02d:%02d      ",
           day.c_str(),
           t.date, t.mon, t.yr,
           t.hr, t.min, t.sec);

  // Print the formatted string to serial so we can see the time.
  Serial.println(buf);
  lcd.setCursor(0, 4);
  lcd.print(buf);
  }
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Al_Ninyo,  Можно попробовать использовать экранированный провод, и керамические конденсаторы по 0,1...1мкф между общим и сигналом. Между общим и питанием тоже не помешает.

Al_Ninyo
Offline
Зарегистрирован: 09.11.2014

Хм. Экранированного провода столько нет, а конденсаторы имеются. Буду пробовать, спасибо!

Al_Ninyo
Offline
Зарегистрирован: 09.11.2014

Спасибо, dimax! Поставил два конденсатора 105 (1 мкФ) как вы посоветовали. Показания стабилизировались, хотя всё равно периодически прыгают на +/- 0,5 градуса. Буду чуть подправлять программу, чтобы показания раз в минуту считывались, ибо чаще нет смысла точно.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

У меня два таких датчика висят на 1.5кв проводе световом длинной около 2.5м... Показания скакали одно время из-за нестабильного питания и хренового контата...Как все перебрал и посадил на разные источники питания, то скачки прошли... Правда пришлось изменить коэффициент для более точного показания температуры)

Krendelyok
Offline
Зарегистрирован: 05.10.2016

Я правильно понимаю, что показания скакали, но контрольная сумма при этом проходила нормально? 

FAI4
Offline
Зарегистрирован: 23.09.2016

Сделайте математическое усреднение результатов измерений.

(например усреднение по 100 измерениям)

 

Скорее всего у вас наводки 50 Гц по длинным проводам...

bwn
Offline
Зарегистрирован: 25.08.2014

Krendelyok пишет:

Я правильно понимаю, что показания скакали, но контрольная сумма при этом проходила нормально? 

Нет у него контрольной суммы, аналоговый он.

Krendelyok
Offline
Зарегистрирован: 05.10.2016

Понял. Я просто тут с dht11 бьюсь. Вот и набрасываюсь на любую информацию))

bwn
Offline
Зарегистрирован: 25.08.2014

А чего с ним биться, взять и выбросить. Хуже наверное только самому на плате вытравить, да и то большой вопрос.

Krendelyok
Offline
Зарегистрирован: 05.10.2016

bwn пишет:

А чего с ним биться, взять и выбросить. Хуже наверное только самому на плате вытравить, да и то большой вопрос.

Да тут дело принципа))) На ардуинке работает нормально. А в тиньке13 с этим же кодом скачут данные.