Skip to main content

Arduino đọc Analog của cảm biến độ ẩm đất và lọc nhiễu bằng bộ lọc Kalman

Giá trị analog thường có độ nhiễu lớn vì vậy trước khi xử lý, các giá trị này cần phải cho qua một bộ lọc để phần điều khiển có thể làm việc tốt hơn. Chúng ta sẽ tiến hành đọc giá trị analog của cảm biến độ ẩm đất, sau đó cho qua bộ lọc Kalman và vẽ đồ thị để so sánh giá trị trước và sau khi lọc.

Cảm biến độ ẩm đất

Kết nối phần cứng (bên trái là cảm biến độ ẩm đất, bên phải là arduino uno):
AO (Analog Ouput) <===> A0
DO (Digital Ouput) <===> 2 (Chưa sử dụng tới nhưng cứ cắm vào sẵn)
VCC <===> 5V
GND <===> GND

Cài đặt thư viện SimpleKalmanFilter bằng cách vào Tools > Manage Libraries... và cài đặt thư viện như sau

Cài đặt thư viện SimpleKalmanFilter

Viết code

#include <SimpleKalmanFilter.h>

void setup()
{
Serial.begin(9600);
pinMode (2, INPUT);
pinMode(A0, INPUT);
pinMode (13, OUTPUT);
}

SimpleKalmanFilter filter(10, 10, 0.05);
float estimate;

void loop()
{
int value = analogRead(A0);
estimate = filter.updateEstimate(value);
Serial.print("K:"); Serial.print(estimate);
Serial.print(",V:"); Serial.println(value);
delay(10);
}

Ghi chú: thư viện SimpleKalmanFilter có ba tham số. Tham số thứ nhất là sai số của thiết bị đo, thí dụ thiết bị đo trả về giá trị từ 0 - 1023, tức là 1024 giá trị, giả sử sai số là 10% thì giá trị này là 10.24, có thể làm tròn thành 10. Tham số thứ hai theo tác giả thì cứ cho bằng giá trị với tham số thứ nhất. Tham số thứ 3 là tốc độ "bám sát" của giá trị dự đoán so với giá trị đo được. Số này càng lớn thì tốc độ "bám sát" càng nhanh. Theo tác giả đề nghị là hãy bắt đầu thử nghiệm với 0.01 (1%). Như ví dụ ở trên thì bộ lọc Kalman đang dùng là SimpleKalmanFilter filter(10, 10, 0.05);

Mở menu Tools chọn đúng board arduino của bạn và cổng COM sau đó upload chương trình. Sau đó vào Tools > Serial Plotter để xem kết quả

Kalman Filter


Link mua hàng
AliExpress.com Product - 5pcs Soil Hygrometer Humidity Detection Module Moisture Water Sensor Soil moisture AliExpress.com Product - Smart Electronics Soil Moisture Hygrometer Detection Humidity Sensor Module For arduino Development Board DIY Robot Smart Car AliExpress.com Product - Water Sensor Soil Hygrometer Humidity Detection Module Moisture Soil Moisture For Arduino Development Robot Car Diy Electronic
AliExpress.com Product - WAVGAT high quality One set UNO R3 (CH340G) MEGA328P for Arduino UNO R3 + USB CABLE ATMEGA328P-AU Development board AliExpress.com Product - high quality One set UNO R3 (CH340G) MEGA328P for Arduino UNO R3 + USB CABLE ATMEGA328P-AU Development board AliExpress.com Product - modified version One set UNO R3 CH340G+MEGA328P Chip 16Mhz For Arduino UNO R3 Development board + USB CABLE

Comments

Popular posts from this blog

Arduino Nano nạp code không được

Tình trạng Khi bạn nạp code cho arduino nano, IDE sẽ hiển thị là Uploading... rất lâu sau đó báo lỗi: avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x5c avrdude: stk500_recv(): programmer is not responding avrdude: s...

STM32F103C8T6 lỗi không nạp được code

Tình trạng Sau khi nạp code lần đầu, STM32 ST-Link Utility sẽ không kết nối được nữa và hiện lên thông báo lỗi: Cannot connect to target! Please select "Connect Under Reset" mode from Target -> Settings menu and try again. If you are trying to connect to low frequency application, please select a lower SWD Frequency mode from Target -> Settings menu. Tình trạng này có thể xảy ra với tất cả các dòng F1 và cách khắc phục cũng tương tự nhau. Khắc phục 1. Trong STM32CubeMX cần phải chọn lại trong SYS > Debug là Serial Wire sau đó generate lại code. 2. Board arm kết nối ST-Link Utility không được, lúc đó hãy nhấn giữ nút Reset trên board rồi nhấn nút Connect trên ST-Link Utility, chờ khoảng 3-5 giây sau đó thả nút Reset. Có thể bạn sẽ phải làm vài lần như vậy mới có được 1 lần kết nối thành công. 3. Sau khi kết nối thành công, nạp code mới có config Debug là Serial Wire ở trên. Khi đó board sẽ kết nối bình thường cho các lần tiếp theo Mạch nạp ST-LINK có thể m...

Dùng mạch nạp USBasp để nạp code cho Arduino

Arduino có thể dễ dàng nạp code và chạy chương trình chỉ với thao tác đơn giản cắm board mạch vào máy tính chọn cổng COM và nhấn nút Upload. Để làm được như vậy, bên trong chip vi xử lý được nạp sẵn một đoạn mã lệnh gọi là boot loader. Boot loader luôn luôn được chạy lên đầu tiên, sau đó mới chuyển quyền điều khiển lại cho phần mã của người dùng nạp vào.   Như vậy để các Chip Arduino có thể làm việc được với Arduino IDE thông qua giao tiếp USB-COM thì trong vi điều khiển phải được nạp sẵn boot loader. Các board mạch Arduino bán sẵn trên thị trường như Arduino Uno, Arduino Nano, Arduino Mega 2560,... đều được nạp sẵn boot loader. Như vậy ưu điểm của boot loader là để người dùng dễ dàng tiếp cận, thử nghiệm, và làm ra được sản phẩm nhanh chóng, dễ dàng. Nhưng nhược điểm là boot loader luôn luôn cần một khoảng thời gian từ 1.6s đến 2s để khởi động. Nếu bạn không muốn mất 1.6 - 2s đầu tiên mà muốn chương trình chạy gần như ngay lập tức khi cấp nguồn hoặc reset thì dùng mạch nạp USBasp ...