Проблема со считыванием аналоговых входов: термо датчик LM35 + LDR
- Войдите на сайт для отправки комментариев
Ср, 19/08/2015 - 01:45
Добрый вечер.
Мой проект дня:
Термофото плейграудн на 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();
}
Извиняюсь, проблемное место - блок // Reading LDR, строки 161-162
(к сожалению не могу подправить первое сообщение)
Есть предположение, что А0 ловит наводки/помехи. Подключите кондёр 0.1-1 мкф на А0 и на землю.
Спасибо!
Да 100n помогли, так же хорошо работает решение с pull down резистором на 4,7-10k.
Добрый день.
У меня тоже была аналогичная проблема. Поставил параллельно датчикам кондёры - не помогло.
Оказалось, китайские БП в сетчатых корпусах выдаюют довольно солидные помехи. Просто поставил 0.1мкФ прямо на вход +12В ардуино, и счастлив :))