Kết nối cảm biến bụi Dust Sensor với Pi cùng sự giúp sức của ARPI600
17:48 - 26/01/2019
Đo mật độ bụi Dust Sensor dùng Pi với sự giúp sức của ARPI600
NVIDIA Jetson AGX Orin Hardware Layout and GPIO Expansion Header Pinout
NVIDIA Jetson là nền tảng hàng đầu thế giới dành cho Trí tuệ nhân tạo (AI) và Deep Learning
Cách sử dụng Camera CSI với hệ điều hành Raspberry Pi Bulleyes mới nhất
Jetson Stats dùng cho Giám sát và Điều khiển trên NVIDIA Jetson Ecosystem [Xavier NX, Nano, AGX Xavier, TX1, TX2]
Giới thiệu, nội dung chính
- Cảm biến bụi (Dust Sensor) sẽ giúp chúng ta đo đạc, tính toán ra lượng bụi trong không khí, tuy nhiên, củ chuối thay :( OUTPUT của em cảm biến này lại là Analog (đương nhiên là vậy rồi :x), mà em Pi của chúng ta bị khó khăn bởi dạng tín hiệu này.
- Không sao ! Chúng ta đã có ARPI600 một adapter board giúp em Pi của chúng ta có thể đọc được tín hiệu analog. Sau đây mình xin đi vào cụ thể. - Video test sản phẩm:
Phần cứng:
- Chúng ta cần một module Dust Sensor, đo mật độ bụi trong không khí.
- Một adapter board ARPI600 để giúp em Pi đọc được tín hiệu Analog. Tại sao lại phải dùng board này? Trong khi chúng ta có những phương pháp dễ hơn? Thực ra mình dùng board này vì nó có cực kỳ nhiều ứng dụng, mình sẽ ra loạt bài viết về tính năng của board này với Raspberry Pi. Ngoài giúp Pi đọc analog chúng ta có thể làm nhiều thứ hơn với Real-time, Xbee, ...
- Dưới đây là cách nối ( ta chỉ cần cắm vào là xong phần kết nối giữa ARPI600 và Pi)
- Một Raspberry Pi, ở đây mình sử dụng Pi 3 B+
Thông số cơ bản của module
- Độ nhạy: 0.5V / (100 mg / m3).
- Dải đo: 500μg / m3.
- Nguồn cung cấp: 2.5V ~ 5.5V.
- Dòng hoạt động: 20mA (tối đa).
- Nhiệt độ hoạt động: -10 ℃ ~ 65 ℃.
- Nhiệt độ bảo quản: -20 ℃ ~ 80 ℃.
- Thời gian sử dụng: 5 năm.
- Kích thước: 63.2mm × 41.3mm × 21.1mm.
- Kích thước lỗ khí: 9.0mm.
Sơ đồ nối chân
- Chân VCC: kết nối nguồn 2.5V ~ 5.5V. (ở đây mình dùng 3.3v)
- Chân GND: đấu GND trên ARPI600
- Chân Aout : T_A6 của ARPI600
- Chân I led: P1 của ARPI600
Hoạt động
- Kích hoạt các diot hồng ngoại bằng cách thiết lập các pin LED ở mức HIGH.
- Chờ 0.28ms, sau đó bắt đầu để lấy mẫu điện áp từ pin Aout của module. Ghi chú rằng tín hiệu đầu ra sẽ mất 0.28ms để đạt trạng thái ổn định sau khi diot hồng ngoại được kích hoạt.
- Chu kì lấy mẫu là 0.004ms . Khi hoàn tất, thiết lập các pin LED LOW để vô hiệu hóa các diot hồng ngoại.
- Tính nồng độ bụi theo mối quan hệ giữa điện áp đầu ra và nồng độ bụi.
Bảng quan hệ giữa giá trị điện áp ra và nồng độ bụi.
Các tiêu chí chất lượng không khí.
Ứng dụng minh họa: đo và cảnh báo mức độ ô nhiễm trong văn phòng hiển thị thông số trên Terminal.
Lập trình:
Chúng ta sẽ làm việc trên Terminal.
- Tạo một file General_Sensor.c ở Desktop,:
cd Desktop/
sudo nano General_Sensor.c
- Code:
_________________________________________________________________________________________________________
#include <stdio.h>
#include <wiringPi.h>
#define Clock 27
#define Address 28
#define DataOut 29
#define COV_RATIO 0.2 //ug/mmm / mv
#define NO_DUST_VOLTAGE 400 //mv
#define SYS_VOLTAGE 3300
#define D0 0
#define S0 1 //iLed
int adcvalue = 0;
float voltage = 0;
int Filter(int m)
{
static int flag_first = 0, _buff[10], sum;
const int _buff_max = 10;
int i;
if(flag_first == 0)
{
flag_first = 1;
for(i = 0, sum = 0; i < _buff_max; i++)
{
_buff[i] = m;
sum += _buff[i];
}
return m;
}
else
{
sum -= _buff[0];
for(i = 0; i < (_buff_max - 1); i++)
{
_buff[i] = _buff[i + 1];
}
_buff[9] = m;
sum += _buff[9];
i = sum / 10.0;
return i;
}
}
unsigned int ADC_Read(unsigned char channel)
{
unsigned int value;
unsigned char i;
unsigned char LSB = 0, MSB = 0;
channel = channel << 4;
for (i = 0; i < 4; i ++)
{
if(channel & 0x80)
digitalWrite(Address,1);
else
digitalWrite(Address,0);
digitalWrite(Clock ,1);
digitalWrite(Clock ,0);
channel = channel << 1;
}
for (i = 0; i < 6;i ++)
{
digitalWrite(Clock ,1);
digitalWrite(Clock ,0);
}
delayMicroseconds(15);
for (i = 0; i < 2; i ++)
{
digitalWrite(Clock ,1);
MSB <<= 1;
if (digitalRead(DataOut))
MSB |= 0x1;
digitalWrite(Clock ,0);
}
for (i = 0; i < 8; i ++)
{
digitalWrite(Clock ,1);
LSB <<= 1;
if (digitalRead(DataOut))
LSB |= 0x1;
digitalWrite(Clock ,0);
}
value = MSB;
value <<= 8;
value |= LSB;
return value;
}
void Level_Polution( float den){
if(den <= 35)
{
printf(" Moi Truong sach!\n");
}
else if(den <= 75)
{
printf(" Moi Truong o muc trung binh!\n");
}
else if(den <= 115)
{
printf(" Moi Truong o muc o nhiem nhe!\n");
}
else if(den <= 150)
{
printf(" Moi Truong o muc o nhiem vua!\n");
}
else if(den <= 250)
{
printf(" Moi Truong o muc o nhiem nang!\n");
}
else
{
printf(" Moi Truong o nhiem nghiem trong!\n");
}
}
int main()
{
if (wiringPiSetup() < 0)return 1 ;
pinMode (DataOut,INPUT);
pullUpDnControl(DataOut, PUD_UP);
pinMode(Clock,OUTPUT);
pinMode(Address,OUTPUT);
pinMode(D0,INPUT);
digitalWrite(D0,0);
float density = 0;
pinMode(S0, OUTPUT);
while(1)
{ //lay tin hieu dien ap
digitalWrite(S0, HIGH); // bat dau lay tin hieu analog
delayMicroseconds(280); // chờ 280us
adcvalue = ADC_Read(6);
digitalWrite(S0, LOW); // ket thuc lay tin hieu
//loc tin hieu
adcvalue = Filter(adcvalue);
// tinh toan
voltage =( SYS_VOLTAGE/1024.0)*adcvalue*11;
if(voltage >= NO_DUST_VOLTAGE )
{
voltage -= NO_DUST_VOLTAGE;
density = voltage * COV_RATIO;
}
else
density = 0;
printf(" Do bui: %f ug/m3\n", density);
Level_Polution(density);
delay(1000);
}
}
_______________________________________________________________________________________________________________
- Sau đó, chúng ta dùng tổ hợp phím Ctrl + X để thoát, chọn Y và enter để lưu file.
- Tiếp theo, dùng lệnh : gcc -Wall -o General_Sensor General_Sensor.c -lwiringPi để compile.
- Cuối cùng: sudo ./General_Sensor và hưởng thụ thành quả :D.
VÀ TÈN TENNNN ĐÂY LÀ KẾT QUẢ, HÔM NAY MÌNH NGỒI GẦN CỬA RA VÀO NÊN CÓ THỂ THẤY MẬT ĐỘ BỤI KHÁ LỚN, CHẮC HÔM SAU MÌNH SẼ KHÔNG NGỒI ĐÂY NỮA. :<
*Lưu ý: Một số thông số đầu tiên có thể chưa chính xác.
Sắp tới mình sẽ ra loạt bài viết về adapter này, các ứng dụng với Pi.
PIVIETNAM CHÚC CÁC BẠN THÀNH CÔNG !!!
Thực hiện bài viết: Nguyễn Huy Hiệp
Để cập nhật các tin tức công nghệ mới các bạn làm theo hướng dẫn sau đây :
Các bạn vào Trang chủ >> Tin tức. ở mục này có các bài viết kỹ thuật thuộc các lĩnh vực khác nhau các bạn có thể lựa chọn lĩnh vực mà mình quan tâm để đọc nhé !!!
Các bạn cũng có thế kéo xuống cuối trang để xem những tin tức công nghệ mới nhất.