- ส่วนประกอบที่จำเป็น
- APDS9960 RGB และเซ็นเซอร์ท่าทางสัมผัส
- แผนภูมิวงจรรวม
- คำอธิบายรหัส
- การทดสอบลิฟต์แบบไร้สัมผัสที่ควบคุมด้วยท่าทาง
ในช่วงเวลาที่เกิดการระบาดของโรคโคโรนาลิฟต์ได้กลายเป็นสถานที่ที่มีความเสี่ยงสูงที่ทุกคนจะต้องสัมผัสปุ่มเดียวกัน ในหลาย ๆ ที่ผู้คนได้ค้นพบกลเม็ดในการป้องกันการสัมผัสกับปุ่มลิฟต์เช่นการใช้กระดาษปั๊มไม้จิ้มฟันหรือกระดาษทิชชู่สำหรับกดปุ่มลิฟต์
ดังนั้นเพื่อความต่อเนื่องของโครงการด้านความปลอดภัย Corona ก่อนหน้านี้ของเราเช่นเครื่องฆ่าเชื้ออัตโนมัติการตรวจสอบอุณหภูมิแบบไม่สัมผัสและเครื่องตรวจจับระยะทางสังคมเราจะสร้างต้นแบบลิฟต์ที่ควบคุมด้วยท่าทางโดยใช้ Arduino Nano
นี้Contactless ลิฟท์ใช้ Arduino Nano, ท่าทางเซนเซอร์ APDS9960 และโมดูลจอแสดงผล OLED ด้วยแผงควบคุมที่ใช้ท่าทางสัมผัสนี้คุณสามารถควบคุมการยกของคุณได้อย่างง่ายดายโดยทำท่าทางด้วยมือ APDS9960 Sensor ใช้เพื่ออ่านท่าทางสัมผัส ท่าทางขึ้นและลงใช้ในการกำหนดหมายเลขชั้นท่าทางทางซ้ายคือการปิดประตูลิฟต์และเลื่อนลิฟต์ตามหมายเลขชั้นและใช้ท่าทางทางขวาเพื่อเปิดประตู
ส่วนประกอบที่จำเป็น
- Arduino นาโน
- โมดูลแสดงผล OLED
- APDS9960 RGB และเซ็นเซอร์ท่าทางสัมผัส
- เขียงหั่นขนม
- สายจัมเปอร์
APDS9960 RGB และเซ็นเซอร์ท่าทางสัมผัส
APDS9960 RGB & Gesture Detection Module เป็นบอร์ดฝ่าวงล้อมขนาดเล็กที่มาพร้อมกับเซ็นเซอร์ APDS-9960 ในตัวฟิลเตอร์ป้องกัน UV และ IR ไดโอดสี่ตัวแยกกันที่ไวต่อทิศทางที่ต่างกันและอินเทอร์เฟซที่เข้ากันได้กับ I2C เซ็นเซอร์นี้สามารถใช้สำหรับการวัดแสงและสีโดยรอบการตรวจจับความใกล้เคียงและการตรวจจับท่าทางสัมผัสแบบไม่ต้องสัมผัส มีระยะการตรวจจับท่าทางตั้งแต่ 10 ถึง 20 ซม. และสามารถใช้เพื่อควบคุมไมโครคอนโทรลเลอร์หุ่นยนต์และในโครงการอื่น ๆ อีกมากมาย
คุณสมบัติ:
- แรงดันไฟฟ้าในการทำงาน: 2.4V ถึง 3.6V
- ช่วงการใช้งาน: 4-8in (10-20 ซม.)
- อินเทอร์เฟซ I2C (ที่อยู่ I2C: 0x39)
- Ambient Light และ RGB Color Sensing, Proximity
- การตรวจจับและการตรวจจับท่าทางในโมดูลออปติคัล
- I2C-bus Fast Mode Compatible Interface พร้อมอัตราข้อมูลสูงสุด 400 kHz
แผนภูมิวงจรรวม
แผนภาพวงจรสำหรับลิฟต์แบบไม่สัมผัสโดยใช้ APDS9960 แสดงไว้ด้านล่าง
เรากำลังเชื่อมต่อ Arduino Nano กับ APDS9960 Sensor และ OLED Display หมุด VCC และ GND ของเซ็นเซอร์ APDS9960 และจอแสดงผล OLED เชื่อมต่อกับ 3.3V และ GND ของ Arduino ในขณะที่พิน SCL และ SDA ของเซ็นเซอร์ APDS9960 และจอแสดงผล OLED เชื่อมต่อกับหมุด A5 และ A4 ของ Arduino ตามลำดับ
OLED และ APDS9960 Pin |
Arduino Nano Pin |
VCC |
3.3 โวลต์ |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
นี่คือลักษณะการตั้งค่าที่สมบูรณ์สำหรับลิฟต์ที่ควบคุมด้วยท่าทางโดยใช้ Arduino:
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับจอแสดงผล OLED และการเชื่อมต่อกับไมโครคอนโทรลเลอร์อื่น ๆ โปรดไปที่ลิงค์
คำอธิบายรหัส
รหัสที่สมบูรณ์สำหรับContactless Elevator ที่ใช้ APDS9960จะได้รับที่ส่วนท้ายของหน้า เรากำลังอธิบายส่วนสำคัญบางส่วนของโค้ด ในโปรแกรมนี้เราจะไปใช้ APDS9960 และห้องสมุด Adafruit_SH1106 สามารถดาวน์โหลดไลบรารี APDS9960 ได้จาก Arduino IDE ในการดาวน์โหลดไลบรารีไปที่ Sketch> Library Manager> Search จากนั้นป้อนสำหรับArduino APDS9960 ในขณะที่สามารถดาวน์โหลด ไลบรารี Adafruit_SH1106 ได้จากที่นี่
ดังนั้นตามปกติเริ่มต้นรหัสโดยรวมไลบรารีที่จำเป็นทั้งหมด Adafruit_SH1106.h เป็นเวอร์ชันแก้ไขของไลบรารี Adafruit ดั้งเดิม
# รวม
ในบรรทัดถัดไปกำหนดตัวแปรเพื่อจัดเก็บชั้นปัจจุบันและหมายเลขชั้นที่ผู้ใช้ต้องการไป
int Floornum = 0; int currentfloor = 0;
หลังจากนั้นให้ป้อนบิตแมปสำหรับภาพลูกศรขึ้นลูกศรลงเปิดประตูและปิดประตู รหัส HEX สำหรับรูปภาพสามารถสร้างได้โดยใช้ตัวแปลงเช่น Image2cpp หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับวิธีใช้Image2cpp ให้ทำตามบทช่วยสอนการสร้างโค้ด Arduino QR นี้
const ไม่ได้ลงนามถ่าน PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, …………………………… ……………………………………………………….. }; const ไม่ได้ลงนามถ่าน PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, …………………………… ……………………………………………………….. }; const ไม่ได้ลงนามถ่าน dooropen PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xe0, ………………………… ………………………………………………………….. };
ในฟังก์ชันการ ตั้งค่า () เริ่มต้น Serial Monitor ที่อัตราการส่งข้อมูล 9600 เพื่อวัตถุประสงค์ในการดีบัก จากนั้นในบรรทัดถัดไปให้เริ่มต้นจอแสดงผล OLED และเซ็นเซอร์ APDS9960 ด้วยวิธีการ เริ่มต้น () ดังนี้:
Serial.begin (9600); ถ้า (! APDS.begin ()) {Serial.println ("เกิดข้อผิดพลาดในการเริ่มต้นเซ็นเซอร์ APDS9960!"); } Serial.println ("กำลังตรวจจับท่าทาง… "); display.begin (SH1106_SWITCHCAPVCC, 0x3C);
หลังจากการเริ่มต้นการแสดงและการเซ็นเซอร์ล้างบัฟเฟอร์การแสดงผลที่มี clearDisplay () วิธีการและกำหนดขนาดตัวอักษรและสีที่ใช้ display.setTextSize () และ display.setTextColor () วิธีการ
display.setTextSize (2); display.setTextColor (สีขาว); display.clearDisplay (); display.display ();
ภายใน void loop () ให้ ตรวจสอบตลอดเวลาว่ามีท่าทางใด ๆ ถ้าใช่ให้อ่านค่าท่าทางสัมผัสและตรวจสอบว่าท่าทางนั้นเป็นท่าทางใด (ขึ้นลงขวาซ้าย) และพิมพ์ค่าที่อ่านได้บนจอภาพอนุกรม คำสั่งนิ้วขึ้นและลงใช้เพื่อกำหนดหมายเลขพื้นที่ผู้ใช้ต้องการไป ท่าทางทางซ้ายคือการปิดประตูลิฟต์และเลื่อนลิฟท์ตามหมายเลขชั้นในขณะที่ใช้ท่าทางขวาเพื่อเปิดประตู
ถ้า (APDS.gestureAvailable ()) {int ท่าทาง = APDS.readGesture (); สวิตช์ (ท่าทางสัมผัส) {case GESTURE_UP: Serial.println ("Detected UP ท่าทาง"); display.clearDisplay (); ฟลอนัม ++; home1 (); หยุดพัก; กรณี GESTURE_DOWN: Serial.println ("ตรวจพบท่าทางลง"); display.clearDisplay (); ฟลอนัม -; home1 (); หยุดพัก; กรณี GESTURE_LEFT: Serial.println ("ตรวจพบท่าทาง LEFT"); display.clearDisplay (); เริ่มต้น (); หยุดพัก; กรณี GESTURE_RIGHT: Serial.println ("ตรวจพบท่าทางที่ถูกต้อง"); display.clearDisplay (); home1 (); หยุดพัก; ค่าเริ่มต้น: ทำลาย; }
Home1 () ฟังก์ชั่นที่ใช้ในการวาดการแสดงผลที่บ้านสำหรับลิฟท์ ซึ่งประกอบด้วยลูกศรขึ้นลูกศรลงประตูเปิดป้ายปิดประตูและหมายเลขชั้นปัจจุบัน ฟังก์ชัน drawBitmap () ใช้เพื่อวาดภาพบนจอแสดงผล OLED ไวยากรณ์สำหรับ ฟังก์ชัน drawBitmap () ได้รับด้านล่าง:
drawBitmap (int16_t x, int16_t y, บิตแมป, int16_t w, int16_t h, สี);
ที่ไหน:
int16_t x, int16_t y คือพิกัด X และ Y ของจอแสดงผล OLED
บิตแมปคือชื่อของบิตแมป
int16_t w, int16_t hคือความสูงและน้ำหนักของรูปภาพ
เป็นโมฆะ home1 () {display.setCursor (101,23); display.println (ฟลอร์นั่ม); display.drawBitmap (23, 0, uparrow, 40, 18, WHITE); display.drawBitmap (26, 46, downarrow, 40, 18, WHITE); display.drawBitmap (0, 15, dooropen, 29, 30, WHITE); display.drawBitmap (60, 15, closedoor, 29, 30, WHITE); display.display (); }
ฟังก์ชัน start () ใช้เพื่อเลื่อนลิฟต์ขึ้นหรือลง ด้วยเหตุนี้ชั้นปัจจุบันจะถูกเปรียบเทียบกับหมายเลขชั้นที่ผู้ใช้ต้องการไป หากหมายเลขชั้นมากกว่าเลขที่ชั้นปัจจุบัน จากนั้นลิฟท์จะเคลื่อนตัวขึ้นและหากจำนวนชั้นน้อยกว่าชั้นปัจจุบัน จากนั้นลิฟท์จะเคลื่อนตัวลง ลิฟท์จะหยุดเมื่อทั้งสองชั้นปัจจุบันไม่มี และชั้นที่ เหมือนกัน.
เป็นโมฆะ start () {while (floornum> currentfloor) {Serial.println ("กำลังขึ้น"); ชั้นปัจจุบัน ++; display.drawBitmap (0, 0, ขึ้น, 100, 64, WHITE); display.setCursor (101,23); display.println (ชั้นปัจจุบัน); display.display (); display.clearDisplay (); ล่าช้า (2000); } ในขณะที่ (floornum <currentfloor) {Serial.println ("going Down"); ชั้นปัจจุบัน -; display.drawBitmap (0, 0, ลง, 100, 64, ขาว); display.setCursor (101,23); display.println (ชั้นปัจจุบัน); display.display (); display.clearDisplay (); ล่าช้า (2000); } if (floornum == currentfloor) {Serial.println ("ถึงแล้ว"); display.clearDisplay (); home1 (); Serial.print (ชั้นปัจจุบัน); }}
การทดสอบลิฟต์แบบไร้สัมผัสที่ควบคุมด้วยท่าทาง
เมื่อฮาร์ดแวร์และรหัสพร้อมแล้วให้เชื่อมต่อ Arduino Nano เข้ากับแล็ปท็อปและอัปโหลดรหัสทั้งหมดที่ระบุด้านล่าง อย่างที่คุณเห็นโดยค่าเริ่มต้น OLED จะแสดง UI ของลิฟต์
ตอนนี้โบกมือขึ้นหรือลงตามที่แสดงในวิดีโอด้านล่างเพื่อกำหนดพื้นที่คุณต้องการไป จากนั้นทำท่าทางซ้ายเพื่อรับทราบลิฟต์เพื่อไปที่ชั้นนั้น หากคุณต้องการหยุดลิฟต์ให้ใช้ท่าทางที่ถูกต้องด้วยมือของคุณ
วิดีโอและรหัสการทำงานที่สมบูรณ์สำหรับโครงการนี้มีให้ด้านล่าง หวังว่าคุณจะสนุกกับการสร้างโครงการนี้ หากคุณมีคำถามใด ๆ เกี่ยวกับโครงการนี้โปรดทิ้งไว้ในส่วนความคิดเห็น