Проблема со считыванием аналоговых входов: термо датчик LM35 + LDR

aleksey_ua
Offline
Зарегистрирован: 19.08.2015

Добрый вечер. 

Мой проект дня:

Термофото плейграудн на Arduino Nano с LM35, LDR, NOKIA 5110

A0 - LM35

A1 - LDR (с внутренним подтягивающим резистором)

Проблема в том, что до тех пор пока не трогать в коде аналоговый вход A1 с LDR все работает отлично, но как только начинать считывать и что-то обрабатывать (блок  // Reading LDR, строки 156-158) - то это влияет на показания температуры, она начинает плясать от 17-40 градусов на дисплее. 

В реальности ничего не нагревается и не дымит. Пересаживал датчики на A2, A4 - не помогает.

Не могу понять в чем проблема. Спасибо за помощь.

Код: 


#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <SPI.h>

// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 6 - LCD chip select (CS)
// pin 7 - LCD reset (RST)

Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
     
float tempc, voltage;
int LDR_Bar, LDR_Block, LM35_Bar, LM35_Block;
long prev_millis;

#define LDR_PIN A1    // pin for LDR
#define LM35_PIN A0   // pin for LM35
#define UPDATE_TIME 3000
#define BAR_SCALE 12.19047619 

static const unsigned char PROGMEM thermometer [] = 
{       
        B00100000, //   #  
	B01010000, //  # # 
	B01010000, //  # # 
	B01010000, //  # # 
	B01010000, //  # # 
        B01010000, //  # # 
	B01010000, //  # # 
	B01110000, //  ### 
	B01110000, //  ### 
	B01110000, //  ### 
	B11111000, // #####
	B11111000, // #####
	B11111000, // #####
	B01110000, //  ### 
};

void setup() {

  pinMode(LDR_PIN,INPUT);
  pinMode(LM35_PIN,INPUT);
  
  // Enable pull-up resistor on Analog Input Pin A1
  digitalWrite(LDR_PIN, HIGH);

  Serial.begin(9600);

  // init
  display.begin();

  // show splashscreen
  display.display();
  delay(1000);
  // clears the screen and buffer
  display.clearDisplay();
  
  // you can change the contrast around to adapt the display for the best viewing!
  display.setContrast(60);
  delay(500);

}

void ClearDisplay() {
  
  // Clear display
  display.display();
  delay(300);
  display.clearDisplay();
  
}

void DisplayTemperature() {
  
  display.setCursor(0, 0);
  display.setTextColor(BLACK);
  display.setTextSize(1);
  display.print("Temperature:");

  // Draw bitmap here
  display.drawBitmap(0, 10, thermometer, 5, 14, BLACK);
 
  display.setCursor(8, 10);
  display.setTextSize(2);
  display.print(tempc);
  display.println("C");

}

void DrawGraphicBar() {
  
  // Graphic bar is awesome!
  display.drawRect(0, 25, 84, 4, BLACK);

  display.setCursor(0, 26);
  display.drawFastHLine(0, 26, LM35_Bar, BLACK);
  display.setCursor(0, 27);
  display.drawFastHLine(0, 27, LDR_Bar, BLACK);
 
}

void DrawBlockTemperatureUnit() {
  
  display.setTextSize(1);
  display.setCursor(0,30);
  
  display.setTextColor(WHITE, BLACK);
  display.print("T/U");
  display.setTextColor(BLACK);
  display.print(":");
  display.println(LM35_Block);
  
}

void DrawBlockTemperatureVoltage() {
  
  display.setTextSize(1);
  display.setCursor(0,30);
  
  display.setCursor(0, 39);
  display.setTextColor(WHITE, BLACK);
  display.print("T/V");
  display.setTextColor(BLACK);
  display.print(":");
  display.print(voltage);
  
}

void DrawBlockLDRUnit() {
  
  display.setTextSize(1);
  display.setCursor(42,30);
  
  display.setTextColor(WHITE, BLACK);
  display.print("LDR");
  display.setTextColor(BLACK);
  display.print(":");
  display.println(LDR_Block);
  
}

void loop() {

  if (millis() - prev_millis >= UPDATE_TIME) {

    prev_millis = millis();
    
    // Let's read and calculate temperature
    voltage = (4.65 * analogRead(LM35_PIN)) / 1024;
    tempc = (voltage * 1000) / 10;
    
  }
  
  // Reading LM35
  LM35_Bar = (analogRead(LM35_PIN) / BAR_SCALE);
  LM35_Block = analogRead(LM35_PIN);
  delay (50);
  
  // Reading LDR
  // LDR_Bar = (analogRead(LDR_PIN) / BAR_SCALE);
  // LDR_Block = analogRead(LDR_PIN);
  delay (50);

  DisplayTemperature();
  DrawGraphicBar();
  DrawBlockTemperatureUnit();
  DrawBlockTemperatureVoltage();
  DrawBlockLDRUnit();
  
  ClearDisplay();
  
}

 

aleksey_ua
Offline
Зарегистрирован: 19.08.2015

Извиняюсь, проблемное место - блок  // Reading LDR, строки 161-162

(к сожалению не могу подправить первое сообщение)

Pyotr
Offline
Зарегистрирован: 12.03.2014

Есть предположение, что А0 ловит наводки/помехи. Подключите кондёр 0.1-1 мкф на А0 и на землю.

aleksey_ua
Offline
Зарегистрирован: 19.08.2015

Спасибо!

Да 100n помогли, так же хорошо работает решение с pull down резистором на 4,7-10k.

HMikayelyan72
Offline
Зарегистрирован: 17.07.2018

Добрый день.

У меня тоже была аналогичная проблема. Поставил параллельно датчикам кондёры - не помогло.

Оказалось, китайские БП в сетчатых корпусах выдаюют довольно солидные помехи. Просто поставил 0.1мкФ прямо на вход +12В ардуино, и счастлив :))