Chỉ số dao động của cảm biến nhiệt độ LM35 (+ - 5 ° C) với Arduino UNO


7

Tôi đang cố gắng đọc một cảm biến nhiệt độ LM35 với Arduino UNO mà tôi đã nhận được như một món quà. Vấn đề là thực tế, rằng các bài đọc cảm biến của tôi, tốt, ít nhất là đáng ngờ - chúng nhảy với mỗi lần đọc khoảng 5 ° C lên hoặc xuống.

Tôi đã sử dụng một số bài viết làm thế nào để kết nối mọi thứ với bo mạch Arduino và lập trình đọc ( 1 , 2 , 3 ) và tạo ra mã được đăng dưới đây. Việc đọc cảm biến dao động rất nhiều - nó nhảy khoảng 3 đến 7 ° C sau mỗi lần đọc bất kể tần số đọc (được kiểm tra với việc đọc mỗi 0,5 giây, 1,0 giây hoặc 2,5 giây). (Thật không may, tôi không sở hữu nhiều đồng hồ để kiểm tra giá trị thực tế.) Để giảm thiểu vấn đề, tôi đã triển khai một trung bình, nhưng vấn đề tiềm ẩn vẫn còn. Các giá trị dự kiến ​​là khoảng 23 hoặc 24 ° C khi được đo bằng trạm thời tiết kỹ thuật số và nhiệt kế lưỡng kim tương ứng.

Bạn đã gặp điều này trước đây? Bạn có bất cứ ý tưởng những gì có thể là nguồn gốc của điều này? Tôi mới bắt đầu học điện tử cũng như Arduino, cố gắng học và chủ yếu hiểu nó.

Mã hoàn chỉnh:

#include <WString.h>

//Stores read analog values 
int readLM35;
const int sensorAnalogPin = 0;
const float voltsToTemperature = 1.1 / 1023 * 100; // (1.1V supply / 10bit resolution) * (10 mV/°C = 1 V / 100 °C)
//Stores the temperature in °C
float temp;
//Averager
float temps[8];
byte position = 0;
float averageTemp;

void setup() {
    Serial.begin(9600);
    pinMode(LED_BUILTIN, OUTPUT);

    //For setting internal analog reference voltage to 1.1V
    analogReference(INTERNAL);
}

void loop() {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(50);
    digitalWrite(LED_BUILTIN, LOW);

    //Measure temperature
    readLM35 = analogRead(sensorAnalogPin);
    temp = readLM35  * voltsToTemperature;

    //Save it
    temps[position] = temp;
    if (position == 7) {
        position = 0;
    } else {
        position++;
    }

    //Get average
    averageTemp = 0;
    for (byte i = 0; i < 8; i++) {
        averageTemp += temps[i] / 8;
    }

    //Write
    Serial.println(String(readLM35) + " => " + String(temp, 1) + " deg. C, avg. " + String(averageTemp, 1));
    delay(2500);
}

Ví dụ về đầu ra (lưu ý các số đầu tiên - đọc thực tế):

211 => 22.7 deg. C, avg. 22.5
186 => 20.0 deg. C, avg. 21.9
234 => 25.2 deg. C, avg. 22.7
173 => 18.6 deg. C, avg. 21.9
237 => 25.5 deg. C, avg. 22.6
185 => 19.9 deg. C, avg. 21.9
231 => 24.8 deg. C, avg. 22.4
193 => 20.8 deg. C, avg. 22.2
223 => 24.0 deg. C, avg. 22.3
206 => 22.2 deg. C, avg. 22.6
197 => 21.2 deg. C, avg. 22.1
225 => 24.2 deg. C, avg. 22.8
183 => 19.7 deg. C, avg. 22.1
240 => 25.8 deg. C, avg. 22.8

Thiết lập thử nghiệm


3
Tôi không thấy bất kỳ tụ tách rời nào (thường là 100 nF) tại LM35. Kiểm tra bảng dữ liệu cho các khuyến nghị.
Transitor

Tôi đã cố gắng xem datasheet ti.com/lit/ds/symlink/lm35.pdf và Hình 13 gợi ý bỏ qua 10 nF. Bạn có ý gì đó giống như nó? (NB Tôi không hiểu điện tử rất tốt, vì vậy xin vui lòng chịu đựng với tôi).

1
Tôi cho +1 cho công việc sửa lỗi của bạn và sự chăm sóc chuẩn bị câu hỏi này.

2
Thêm +1 cho cùng. Câu hỏi rất hay. Tôi sẽ cho +1 khác cho mã trung bình nếu tôi có thể. Bạn đang đi đúng hướng. Tôi luôn sử dụng mũ .1 uF trên các đầu vào tương tự của mình như thế này. Không điện phân. Tôi tránh gốm nhưng tantalum và mica vẫn ổn. Nó có thể lớn hơn về giá trị nhưng sẽ không giúp được nhiều. Một chút sẽ giúp. Nhưng có lẽ nhiều hơn một chút so với lá nhôm & Saran Wrap. ;-) (. Bằng cách này, @analogsystemsrf, bạn nhắc nhở tôi về làm một cái gì đó tương tự với báo trên bàn cà phê cho ăn audio vào tiểu học trên một máy biến áp hi-V thì thứ yếu so với lá làm cho một loa)
SDsolar

@SDsolar ... bạn có thể giải thích lý do tại sao bạn tránh gốm (và không điện phân) không?
Michel Keijzers

Câu trả lời:


1

Nguyên nhân là khả năng chìm thấp của đầu ra LM35. Điều này làm cho đầu ra nhạy cảm với EMI. Có, trở kháng đầu ra đầu ra được xác định là 0,5 ohms nhưng chỉ cho nguồn hiện tại. Dòng điện chìm được giới hạn ở mức 1uA có thể dễ dàng đạt được bằng tiếng ồn môi trường. nhập mô tả hình ảnh ở đây

Bạn cần thêm tải trở kháng thấp giữa đầu ra LM35 và mặt đất, có thể là 200 ohm vì bảng dữ liệu khuyến nghị cho tải điện dung nặng nhưng tôi sẽ không đi xa đến thế, có thể là 1k hoặc 2k để tránh lỗi tự sưởi ấm.

Không có phần mềm chỉ có giải pháp có thể giải quyết lỗi này.


0

Thử :-

const int temperaturePin = A0;

void setup() {
  // put your setup code here, to run once:

        Serial.begin(9600);
    }


double getVoltage(int pin)
{

  return (analogRead(pin) * 0.004882814);

    }

void loop() {

      double degree,voltage;
      degree = analogRead(temperaturePin)*0.48875855;
      voltage = getVoltage(temperaturePin);
      Serial.print(voltage);
      Serial.print(degree);
      delay(1000);

    }

Cảm ơn bạn cho ý tưởng, tôi sẽ thử nó. Nhưng trong lúc này, bạn có thể vui lòng giải thích thêm một chút về cách bạn có được những con số ma thuật đó 0,004882814 và 0,488875855 không? Tôi nghi ngờ một cái gì đó như 5V / 1024 (nhưng điều này khác ở chữ số cuối cùng; lưu ý 1024 ) và 5V / 1023 * 100 (cái này tương ứng với 1023). Tại sao 1000 khác nhau?

máy tính bắt đầu đếm 0thay vì 1...
dandavis

Tôi nhận thức rõ về điều này, nhưng tại sao bạn lại tính đến 1023 và lần khác với 1024? (Nếu giả định của tôi là hợp lệ.) Có vẻ như bạn đã từng sử dụng 'mục cuối cùng là # 1023' và lần khác 'chúng tôi có 1024 mục'.
Rao

0

Tôi đoán khi 0 = 0 và 5V = 1023, thì bạn nên chia cho 1023. Nhìn vào câu hỏi, tôi nhận thấy rằng bạn sử dụng AnalogPin = 0. Bản thân tôi, tôi sẽ gắn bó với AnalogPin = A0. A0 được định nghĩa là:

xác định PIN_A0 (14)

vì vậy nó không tương đương với 0. Bạn có chắc là bạn đang đọc đúng mã pin? Cũng thử một pin khác như A3.


1
Sử dụng 0, A0 hoặc 14 sẽ đọc từ cùng một pin tương tự.
gre_gor

0

Đây là một vấn đề đã biết đối với tất cả các cảm biến Arduino (dao động và trôi), tôi cũng gặp vấn đề này với cảm biến độ ẩm và cảm biến mực nước với bộ so sánh LM393, điều tôi cố gắng làm để biến động ít hơn là cố gắng tính toán số đọc trung bình thay vì đơn đọc hiểu:

for (int i = 0; i < 100; i++) 
{
levelSensorValue = levelSensorValue + analogRead(levelSensorPin);
moistureSensorValue = moistureSensorValue + analogRead(moistureSensorPin);
}
levelSensorValue = levelSensorValue / 100;
moistureSensorValue = moistureSensorValue / 100;

nói chung, tất cả các cảm biến có một phù thủy phạm vi tuyến tính không thể đáng tin cậy ngoài nó, và cũng cần hiệu chuẩn cho chúng.


0

Tại sao bạn đã thực hiện 1.1 / 1023. Bạn nói rằng cung là 1.1v nhưng bạn cung cấp cho nó 5v. Tôi sử dụng (readLM35 / 1024) * 500 để nhận giá trị nhiệt độ ở ° C và nó ngang bằng với nhiệt kế tôi đã mua. Nếu nó không hoạt động, hãy thử với lm35 khác. Bạn có thể có một lỗi.

LM35 cũng được nhà máy hiệu chuẩn cho điện áp. Vì vậy, bạn phải hiệu chỉnh nó theo Arduino bạn sử dụng. Tôi muốn giới thiệu DS18b20 vì nó được hiệu chỉnh theo nhiệt độ. Sử dụng thư viện nhiệt độ Dallas cũng giúp sử dụng dễ dàng hơn

Tôi đã tìm thấy điều này trên diễn đàn Arduino một thời gian trước


0

nhiều câu trả lời, bám sát vào mã hoặc chính LM35 chứ không phải là phần chính, ADC. Khi bạn đang đọc [khoảng] đúng nhiệt độ, thì mã, vRef và pin config là đúng. Tôi gặp vấn đề với ADC khi tôi phải đo nhiều tín hiệu giọng nói cho luận án của mình. Đây là một số vấn đề có thể xảy ra:

  • kiểm tra kỹ nếu bản thân bo mạch, có nắp tách rời AVCC / ISF thích hợp. nhiều bảng nhân bản không chú ý đến thất bại sản xuất. mũ tách rời thường kết nối giữa mặt đất (GND) và đường cung cấp tích cực (như VCC) để lọc tiếng ồn.
  • nếu bạn có quyền truy cập vào chân AVCC / AREF, hãy kết nối 2 hoặc 3 nắp 100nf song song giữa chúng và mặt đất. các giá trị không quan trọng. bất cứ điều gì trong phạm vi 10nF lên đến 10uF đều ổn. bạn có thể sử dụng các giá trị khác nhau cho mỗi nắp.
  • kiểm tra tiếng ồn cung cấp năng lượng đầu vào của bạn. cổng USB máy tính là nguồn cung cấp năng lượng đáng tin cậy nhất. nguồn cung cấp năng lượng khác (bộ điều hợp treo tường, ngân hàng điện giá rẻ, v.v.) có một số tiếng ồn không thể tưởng tượng được.
  • sử dụng các nắp (tách tách mũ. các nắp được kết nối giữa các chân + và -) trên mỗi thành phần hoặc cảm biến. như LCD, cảm biến LM35 ....
  • cố gắng sử dụng mã và cảm biến chính xác trên các chân tương tự khác và nếu bạn có bất kỳ, một Arduino khác. nếu sự cố vẫn còn, thì bạn có thể kiểm tra LM35 khác hoặc mã như những người khác đã nói. Nhưng nếu vấn đề không tồn tại, thì hội đồng quản trị có vấn đề. bất kỳ thành phần bị lỗi trong dòng cung cấp có thể gây ra điều này. từ cơ quan quản lý đến một khớp xấu hoặc PCB thông qua.

Mặc dù tôi đồng ý rằng nguồn cổng USB của máy tính sạch hơn rất nhiều so với cục gạch nguồn của Trung Quốc, nhưng nó không phải là sạch nhất. Có nhiều mô-đun DC-DC khác nhau sẽ cung cấp đầu ra rất sạch và nếu bạn muốn có nguồn năng lượng hoàn hảo, bạn không thể đánh bại pin hóa học. Tôi không bao giờ thiết kế cho những thứ này nhưng tôi sử dụng chúng để khắc phục sự cố.
Peter Wone

0

Nếu vấn đề với bài đọc vẫn còn, hãy đặt một mạch RC để đo điện áp vì nó tương tự như tính trung bình được thực hiện trong phần mềm. Một điều khác mà bạn có thể thử là thay thế LM35 bằng một cái mới vì đôi khi nó có thể bị lỗi hoặc bạn có thể đã làm hỏng nó (đã xảy ra với tôi). Tuy nhiên, bạn có thể dễ dàng kiểm tra điều này bằng cách đo điện áp ở chân cảm biến xem nó có tương ứng với những gì bạn đang nhận không. Nếu bạn đang làm việc với thiết bị điện tử, hãy đầu tư vào một đồng hồ nhiều mét vì nó sẽ giúp bạn trong tất cả các dự án của bạn

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.