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

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

Hãy trao cho Raspberry Pi 4 video 4K !!!
RASPBIAN BUSTER : Trải nghiệm hệ điều hành mới cho Raspberry Pi 4
Raspberry Pi : Cài đặt Ubuntu Mate trên Raspberry Pi 3 B+
Raspberry Pi 4 vs NVIDIA Jetson Nano Developer Kit
Raspberry Pi 4 bản nâng cấp tuyệt vời của Pi 3B+

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 Yenter để 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.