Dịch Vụ Bách khoa Sửa Chữa Chuyên nghiệp

Mạch đếm sản phẩm dùng cảm biến hồng ngoại – Linh Kiện Tháo Máy – Bán lẽ linh kiện điện tử

Giới Thiệu Mạch đếm sản phẩm dùng cảm biến hồng ngoại


Mạch đếm sản phẩm dùng cảm biến hồng ngoại : Trong bài viết này, mình sẽ phong cách thiết kế Mạch đếm sản phẩm dùng cảm biến hồng ngoại. Chi tiết hơn, mình sẽ sử dụng cảm biến IR để phát hiện vật thể để làm bộ đếm .

Các Ứng dụng thường được sử dụng :

Mạch đếm sản phẩm dùng cảm biến hồng ngoại đếm sản phẩm dùng cảm biến hồng ngoại hoàn toàn có thể được tạo ra không riêng gì với công nghệ IR mà còn với những mạng lưới hệ thống hình ảnh nhiệt sử dụng một loạt những cảm biến phát hiện nguồn nhiệt hoặc sử dụng thị giác máy thường nhu yếu những thuật toán giải quyết và xử lý hình ảnh phức tạp .

Giới thiệu ứng dụng : bộ đếm với công nghệ tiên tiến IR

Khoảng cách từ đối tượng người tiêu dùng là rất quan trọng và trong một số ít trường hợp, cảm biến IR không thích hợp cho những ứng dụng này. Nếu khoảng cách từ vật thể lớn hơn 20-30 cm, cảm biến siêu âm hoàn toàn có thể là lựa chọn tốt hơn .

mình cần biết khi nào cảm biến IR thay đổi trạng thái của nó từ CAO sang THẤP và đếm số lần chuyển đổi này xảy ra: đây được gọi là phát hiện thay đổi trạng thái .  Để biết thêm thông tin về nguyên tắc hoạt động của cảm biến hồng ngoại .

Mạch đếm sản phẩm dùng cảm biến hồng ngoại hai chiều

Các bộ đếm hạng sang sử dụng phần cứng phức tạp cho quy trình đếm. Project của mình là một bộ đếm đối tượng người tiêu dùng đơn thuần dựa trên Arduino và hai cảm biến IR. Chi tiết hơn, nó là bộ đếm từ 0 đến 9, trong đó cảm biến tiên phong được sử dụng để đếm những vật đến, cảm biến thứ hai là những người đi ra. Sự độc lạ ( IN – OUT ) được hiển thị trên LED 7 đoạn .

Mô tả phần cứng : LED 7 đoạn

Tập trung vào LED 7 đoạn SMA42056,  đây là một linh kiện điện tử được thiết kế để hiển thị số và thường được sử dụng trong đồng hồ kỹ thuật số, đồng hồ điện tử và các loại LED số khác.

SMA42056 là LED 7 đoạn cathode chung với một đoạn bổ trợ sau cuối được gọi là dấu thập phân hoặc đơn thuần là dấu chấm, được biểu lộ bằng chữ P ( Xem Hình 2 ), được sử dụng để hiển thị những số không phải số nguyên. Mỗi đoạn chỉ là một đèn LED đơn thuần và thường được bộc lộ bằng những vần âm từ A đến G. LED 7 đoạn không nhúng một điện trở tiếp nối đuôi nhau cho mỗi đèn LED và tinh chỉnh và điều khiển chúng với điện áp một chiều không đổi hoàn toàn có thể làm hư vĩnh viễn những điểm nối : tránh điều này mình sẽ sử dụng một điện trở tiếp nối đuôi nhau 220 Ω cho mỗi đèn LED .

Giải thích về Demo Bộ đếm hai chiều


Mạch sẽ đếm những đối tượng người tiêu dùng không trong suốt đang đi qua hai cổng IR : cổng tiên phong tạo ra số tăng trên bộ đếm tổng, cổng thứ hai tạo ra số giảm. Vì mạch khá đơn thuần và sử dụng led một chữ số, ứng dụng của mình sẽ kiểm tra xem có hai điều đã xảy ra :

  1. Số đếm không được trình diễn bằng số âm ;
  2. Số đếm không được màn biểu diễn bằng số lớn hơn 9 ;

BOM ( Bill of Materials ) của mạch là :

  • Bo mạch Arduino UNO;
  • 2 x cảm biến IR fc-51;
  • 1 x LED 7 – đoạn SMA42056;
  • 8 x R = 220 Ω.

Mạch nguyên tắc

Để điều khiển LED 7 đoạn, mình cần có 7 PIN đầu ra kỹ thuật số như trong Hình 4. Ta cũng cần đọc thông tin từ hai cảm biến IR. Điều này yêu cầu sử dụng 9 chân kỹ thuật số.

Trong trường hợp, ta đã sử dụng chân từ D2 đến D10 của Arduino. Để làm rõ ràng hơn, mình đã xác lập số PIN để gán tên riêng cho chúng. Lưu ý rằng, những tham số không đổi tại thời hạn chạy và do đó, được xác lập tại thời gian biên dịch, mình đang sử dụng những thông tư tiền giải quyết và xử lý .
Sử dụng lệnh “ define ”, mình không riêng gì giảm chiếm hữu bộ nhớ mà còn tối ưu hóa việc thực thi chương trình .
mình được xác lập những chân kỹ thuật số ( từ D2 đến D8 ) mà sẽ sử dụng để tinh chỉnh và điều khiển led là DISP_PIN_x ( x từ 0 đến 6 ). Hai chân đầu ra của cảm biến IR ( D9 và D10 ) đã được xác lập là IR1 và IR2 .

/*===========================================================================*/
/* PIN-map. */
/*===========================================================================*/
#define DISP_PIN_0 2 /* digital pin input for segment A */
#define DISP_PIN_1 3 /* digital pin input for segment B */
#define DISP_PIN_2 4 /* digital pin input for segment C */
#define DISP_PIN_3 5 /* digital pin input for segment D */
#define DISP_PIN_4 6 /* digital pin input for segment E */
#define DISP_PIN_5 7 /* digital pin input for segment F */
#define DISP_PIN_6 8 /* digital pin input for segment G */
#define IR1 9 /* digital pin input for ir sensor */
#define IR2 10 /* digital pin input for ir sensor */

mình cũng đã xác lập 1 số ít hằng số bổ trợ :

  • NUMB_OF_PRESET, đó là số lượng đặt trước được lưu trữ trong Lookup table (tức là 10 vì mình sẽ sử dụng các chữ số từ 0 đến 9);

  • NUMB_OF_SEGMENTS, đó là những đoạn hiển thị mà mình đang sử dụng ;
  • MAX_NUMB, đó là số lượng giới hạn khoanh vùng phạm vi đếm lớn nhất .
/*===========================================================================*/
/* Constant values */
/*===========================================================================*/
#define NUMB_OF_PRESET 10 /* Available preset */
#define NUMB_OF_SEGMENTS 7 /* Available segments */
#define MAX_NUMB 9 /* High counting range limit */

Có 1 số ít giá trị không đổi khác được khai báo trong code của mình, dù sao để dễ sử dụng, mình ưu tiên tàng trữ chúng vào một mảng bidimensional được gọi là displaySEG là một Lookup table : nói cách khác, nó là một tập hợp những mã PIN đặt trước thiết yếu để hiển thị một chữ số nhất định trên màn hình hiển thị hiển thị .
Trong khi những hàng bộc lộ chữ số, những cột bộc lộ từng đoạn ( LED ) của màn hình hiển thị. Ví dụ, để hiển thị số 0, tổng thể những đoạn ngoại trừ G phải được đặt là CAO ( xem Hình 2 ). Phần tử tiên phong của mảng tàng trữ thông số kỹ thuật theo nhu yếu của mỗi DISP_PIN để hiển thị 0. Vì vậy, mình hoàn toàn có thể sử dụng mảng displaySEG [ 0 ] trong một vòng lặp để đặt từng DISP_PIN theo giá trị đặt trước của mình và lấy số 0 của mình .

  /*===========================================================================*/
/* Lookup table. */
/*===========================================================================*/
const byte displaySEG[NUMB_OF_PRESET][NUMB_OF_SEGMENTS] = {
/* A B C D E F G */
{ HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW }, /* 0 */
{ LOW, HIGH, HIGH, LOW, LOW, LOW, LOW }, /* 1 */
{ HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH }, /* 2 */
{ HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH }, /* 3 */
{ LOW, HIGH, HIGH, LOW, LOW, HIGH, HIGH }, /* 4 */
{ HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH }, /* 5 */
{ HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH }, /* 6 */
{ HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW }, /* 7 */
{ HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH }, /* 8 */
{ HIGH, HIGH, HIGH, HIGH, LOW, HIGH, HIGH }, /* 9 */
};

mình cần những biến bổ trợ là trạng thái của cảm biến IR được đặt tên là IRx_out ( với x 1 hoặc 2 ), một biến để tàng trữ giá trị đếm và một biến chung được sử dụng trong những vòng lặp .

int IR1_out = HIGH; /* Avoiding initial false detections. */
int IR2_out = HIGH; /* Avoiding initial false detections. */
int counter = 0;
int i = 0;

Các tính năng được lý giải

setDisplayValue()

Hàm này viết một số ít từ 0 đến 9 trên màn hình hiển thị. Chi tiết hơn, tham số n đại diện thay mặt cho số hiển thị trên màn hình hiển thị của mình. Lưu ý rằng n % 10 là bắt buộc để tránh thực trạng tràn bộ đệm ở đầu cuối .

void setDisplayValue(int n) {
for(i = 0; i 
initDisplay()

Đây không phải là một tính năng mà là một macro mà ridefine setDisplayValue chuyển 0 làm đối số. Macro này được sử dụng để đặt lại hiển thị khi khởi động. Lưu ý rằng bằng cách sử dụng những lệnh tiền giải quyết và xử lý, mình vẫn đang tối ưu hóa những bộ nhớ và hiệu suất tránh để tạo bản ghi kích hoạt bổ trợ .

#define initDisplay() setDisplayValue(0)
increaseAndDisplay()

Chức năng này tăng bộ đếm và update màn hình hiển thị. Lưu ý rằng, nếu bộ đếm lớn hơn MAX_NUMB thì nó sẽ kết thúc thành 1 .

void increaseAndDisplay() {
counter++;
if(counter > MAX_NUMB) {
counter = 1;
}
setDisplayValue(counter);
}
decreaseAndDisplay()

Chức năng này giảm bộ đếm và update màn hình hiển thị. Lưu ý rằng, nếu bộ đếm bằng 0 thì nó không có tính năng gì : theo cách này, mình đang tránh những số âm .

void decreaseAndDisplay() {
if(counter) {
counter--;
setDisplayValue(counter);
}
}

Code chính

setup()

TRUNG TÂM SỬA CHỮA ĐIỆN TỬ QUẢNG BÌNH
MR. XÔ - 0901.679.359 - 80 Võ Thị Sáu, Phường Quảng Thuận, tx Ba Đồn, tỉnh Quảng Bình

Thiết lập () đặt các chế độ chân: IRx làm đầu vào và DISP_PIN_x làm đầu ra. Hơn nó gọi là initDisplay () hiển thị số 0 trên SMA42056 của mình .

void setup() {
Serial.begin (9600);
pinMode(IR1, INPUT);
pinMode(IR2, INPUT);
/* Setting Display related PIN as OUTPUT */
for(i = 0; i 
loop()

Vòng lặp đọc những trạng thái IR được lưu trong chúng vào IRx_out. Khi IR phát hiện một đối tượng người tiêu dùng không trong suốt thì giá trị của nó là THẤP. Lưu ý rằng cần có độ trễ để tránh phát hiện sai .

void loop() {
IR1_out = digitalRead(IR1);
IR2_out = digitalRead(IR2);
if(IR1_out == LOW) {
increaseAndDisplay();
delay(500);
}
if(IR2_out == LOW) {
decreaseAndDisplay();
delay(500);
} 
delay(100);
}