Đếm số người ra – vào phòng hiển thị LCD 128×64
Bài viết này sẽ hướng dẫn làm mạch đếm người ra/vào phòng dùng cảm biến hồng ngoài E18-D80NK và hiển thị số người vào/ra trên màn hình LCD 128×64.
Ứng dụng rất thực tiễn cho đếm học sinh ra vào lớp, số người lên-xuống xe bus, tàu hỏa,….
Xem thêm:
- Đếm số người ra vào phòng và Bật Tắt thiết bị sử dụng Arduino
- Đếm số người ra vào phòng và Bật Tắt thiết bị sử dụng Arduino – Phần 2
Các linh kiện cần thiết cho dự án
Tên linh kiện | Số lượng |
Arduino Uno | 1 |
Dây cắm | |
Cảm biến hồng ngoài E18-D80NK | 2 |
LCD 128×64 | 1 |


Cách kết nối với LCD 128×64 xem video này:
Cách kết nối với Cảm Biến Hồng Ngoại E18-D80NK xem video này:
CODE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
#include "U8glib.h" #define DELAY_TIMEOUT 1500 U8GLIB_ST7920_128X64_1X u8g(13,11,10); int ir_right_pin = 6; int ir_left_pin = 7; int ir_right_state = 0; int ir_left_state = 0; int ir_right_state_last = -1; int ir_left_state_last = -1; int in_counter = 0; int out_counter = 0; bool bWalkIn = false; bool bWalkOut = false; unsigned long tm; // for display integer value enum {BufSize=8}; // If a is short use a smaller number, eg 5 or 6 char buf[BufSize]; void draw(void) { // graphic commands to redraw the complete screen should be placed here u8g.setFont(u8g_font_fub20); u8g.drawStr( 10, 25, "IN"); u8g.drawStr( 65, 25, "OUT"); u8g.setFont(u8g_font_timB24); if( in_counter < 10){ snprintf (buf, BufSize, "00%d", in_counter); } else if( in_counter < 100){ snprintf (buf, BufSize, "0%d", in_counter); } u8g.drawStr( 5, 60, buf); if( out_counter < 10){ snprintf (buf, BufSize, "00%d", out_counter); } else if( out_counter < 100){ snprintf (buf, BufSize, "0%d", out_counter); } u8g.drawStr( 70, 60, buf); u8g.drawLine(60,0,60,63); } void setup(void) { Serial.begin(9600); pinMode( ir_right_pin, INPUT); pinMode( ir_left_pin , INPUT); // flip screen, if required // u8g.setRot180(); // set SPI backup if required //u8g.setHardwareBackup(u8g_backup_avr_spi); // assign default color value if ( u8g.getMode() == U8G_MODE_R3G3B2 ) { u8g.setColorIndex(255); // white } else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) { u8g.setColorIndex(3); // max intensity } else if ( u8g.getMode() == U8G_MODE_BW ) { u8g.setColorIndex(1); // pixel on } else if ( u8g.getMode() == U8G_MODE_HICOLOR ) { u8g.setHiColorByRGB(255,255,255); } updateLCD(); } void loop(void) { ir_right_state = digitalRead( ir_right_pin ); ir_left_state = digitalRead( ir_left_pin ); Serial.print( ir_left_state ); Serial.print( " " ); Serial.println( ir_right_state ); checkWalkIn(); checkWalkOUT(); } void checkWalkIn(){ if( ir_right_state != ir_right_state_last ){ ir_right_state_last = ir_right_state; if( (bWalkIn == false) && ( ir_right_state == LOW ) ){ bWalkIn = true; tm = millis(); } } if( (millis() - tm) > DELAY_TIMEOUT ){ bWalkIn = false; } if( bWalkIn && (ir_left_state == LOW) && (ir_right_state == HIGH) ){ bWalkIn = false; in_counter++; updateLCD(); } } void checkWalkOUT(){ if( ir_left_state != ir_left_state_last ){ ir_left_state_last = ir_left_state; if( (bWalkOut == false) && ( ir_left_state == LOW ) ){ bWalkOut = true; tm = millis(); } } if( (millis() - tm) > DELAY_TIMEOUT ){ bWalkOut = false; } if( bWalkOut && (ir_right_state == LOW) && (ir_left_state == HIGH) ){ bWalkOut = false; out_counter++; updateLCD(); } } void updateLCD(){ u8g.firstPage(); do { draw(); } while( u8g.nextPage() ); } |
Thư viện sử dụng: U8glib
Cách thêm thư viện xem ở bài này nhé:
Nguồn: arduinotutorialonline.com
Trả lời