- Потрібні компоненти
- APDS9960 RGB і датчик жестів
- Кругова діаграма
- Пояснення коду
- Тестування безконтактного піднімання жестом
У цей час пандемії Корони ліфти стали місцем високого ризику, де всі торкаються одних і тих же кнопок. У багатьох місцях люди знайшли трюки для запобігання контакту з кнопками ліфта, такі як використання паперу для накачування, зубочисток або санітарних тканин для натискання кнопок підйому.
Отже, на продовження наших попередніх проектів безпеки Corona, таких як автоматична дезінфікуюча машина, безконтактний моніторинг температури та соціальний датчик відстані, тут ми збираємося створити прототип ліфта, керований жестом, використовуючи Arduino Nano.
Цей безконтактний ліфт використовує Arduino Nano, датчик жестів APDS9960 та дисплейний модуль OLED. За допомогою цієї панелі управління на основі жестів ви можете легко керувати своїм підйомом, роблячи жест рукою. Датчик APDS9960 використовується для зчитування жестів. Жести ВГОРУ і ВНИЗ використовуються для встановлення номера поверху, лівим жестом є закриття дверей ліфта та переміщення ліфта відповідно до номера поверху, а правим жестом відкривається двері.
Потрібні компоненти
- Arduino Nano
- Модуль дисплея OLED
- APDS9960 RGB і датчик жестів
- Макет
- Провід перемички
APDS9960 RGB і датчик жестів
Модуль виявлення RGB та жестів APDS9960 - це невелика плата для прориву, яка постачається із вбудованим датчиком APDS-9960, блокуючими УФ та ІЧ-фільтрами, чотирма окремими діодами, чутливими до різних напрямків, та інтерфейсом, сумісним з I2C. Цей датчик можна використовувати для вимірювання навколишнього світла та кольорів, виявлення близькості та сенсорного зчитування жестів. Він має діапазон виявлення жестів від 10 до 20 см і може бути використаний для управління мікроконтролером, роботом та у багатьох інших проектах.
Особливості:
- Робоча напруга: від 2,4 до 3,6 В.
- Робочий діапазон: 4-8 дюймів (10-20 см).
- Інтерфейс I2C (Адреса I2C: 0x39).
- Сенсор навколишнього світла та кольорів RGB, близькість
- Зондування та виявлення жестів в оптичному модулі
- Сумісний з швидким режимом інтерфейс I2C-шини зі швидкістю передачі даних до 400 кГц.
Кругова діаграма
Електрична схема безконтактного ліфта з використанням APDS9960 наведена нижче.
Ми взаємодіємо Arduino Nano з датчиком APDS9960 та OLED-дисплеєм. Виводи VCC і GND сенсора APDS9960 і OLED-дисплея підключені до 3,3 В і GND Arduino. Тоді як штирі SCL і SDA сенсора APDS9960 і OLED-дисплей підключені до штифтів A5 і A4 Arduino відповідно.
PIN-код OLED & APDS9960 |
Arduino Nano Pin |
VCC |
3.3v |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
Ось як виглядатиме повне налаштування елеватора, керованого жестами за допомогою Arduino:
Щоб дізнатись більше про OLED-дисплей та його взаємодію з іншими мікроконтролерами, перейдіть за посиланням.
Пояснення коду
Повний код безконтактного ліфта з використанням APDS9960 наведено в кінці сторінки. Тут ми пояснюємо деякі важливі частини коду. У цій програмі ми будемо використовувати бібліотеки APDS9960 та Adafruit_SH1106 . Бібліотеку APDS9960 можна завантажити з Arduino IDE. Щоб завантажити бібліотеку, перейдіть до Ескіз> Менеджер бібліотек> Пошук, а потім введіть Arduino APDS9960. Поки бібліотеку Adafruit_SH1106 можна завантажити звідси.
Отже, як зазвичай, почніть код, включаючи всі необхідні бібліотеки. Adafruit_SH1106.h - це модифікована версія оригінальної бібліотеки Adafruit.
#включати
У наступних рядках визначте змінні для зберігання поточного поверху та номера поверху, куди користувач хоче перейти.
int номер поверху = 0; int currentfloor = 0;
Після цього введіть растрові зображення для стрілок вгору, стрілки вниз, відкритих дверей та закритих дверей. Шістнадцятковий код для зображення може бути сформований за допомогою перетворювача, такого як Image2cpp. Щоб дізнатись більше про те, як користуватися Image2cpp, дотримуйтесь цього посібника з створення QR-коду Arduino.
const unsigned char up PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, …………………………… ………………………………………………………..}; const unsigned char down PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, …………………………… ………………………………………………………..}; const unsigned char dooropen PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xe0,, ………………………… …………………………………………………………..};
У функції setup () ініціалізуйте послідовний монітор зі швидкістю передачі даних 9600 для налагодження. Потім у наступних рядках ініціалізуйте OLED-дисплей і датчик APDS9960 методом begin () наступним чином:
Serial.begin (9600); if (! 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 ();
Усередині порожнього циклу () , постійно перевіряти, якщо якийсь - або жест був зроблений. Якщо так, тоді прочитайте значення жесту та перевірте, який це жест (ВГОРУ, ВНИЗ, ВПРАВО, ВЛІВО) та друкує відповідне зчитування на послідовному моніторі. Жести ВГОРУ та ВНИЗ використовуються для встановлення номера поверху, куди користувач хоче перейти. Лівим жестом є закриття дверей ліфта та переміщення ліфта відповідно до номера поверху, тоді як правим жестом відкриваються двері.
if (APDS.gestureAvailable ()) {int gesture = APDS.readGesture (); перемикач (жест) {case GESTURE_UP: Serial.println ("Виявлений жест вгору"); display.clearDisplay (); номер підлоги ++; home1 (); перерву; регістр GESTURE_DOWN: Serial.println ("Виявлений жест ВНИЗ"); display.clearDisplay (); підлогу - home1 (); перерву; регістр GESTURE_LEFT: Serial.println ("Виявлений жест ВЛІВО"); display.clearDisplay (); start (); перерву; регістр 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 - це висота та вага зображення.
void home1 () {display.setCursor (101,23); display.println (номер підлоги); display.drawBitmap (23, 0, вибій, 40, 18, БІЛИЙ); display.drawBitmap (26, 46, вниз, 40, 18, БІЛИЙ); display.drawBitmap (0, 15, dooropen, 29, 30, БІЛИЙ); display.drawBitmap (60, 15, закритий, 29, 30, БІЛИЙ); display.display (); }
Функція старту () використовується для переміщення підйомника вгору або вниз. Для цього поточний номер поверху порівнюється з номером поверху, куди користувач хоче перейти. Якщо номер поверху більше, ніж поточний номер поверху. тоді ліфт рухатиметься вгору, а якщо номер поверху менший за поточний номер. тоді підйомник рухатиметься вниз. Ліфт зупиниться, коли обидва поточні поверхи не. та поверх No є однакові.
void start () {while (floornum> currentfloor) {Serial.println ("вгору"); currentfloor ++; display.drawBitmap (0, 0, вгору, 100, 64, БІЛИЙ); display.setCursor (101,23); display.println (поточний поверх); display.display (); display.clearDisplay (); затримка (2000); } while (floornum <currentfloor) {Serial.println ("йде вниз"); поточний поверх--; 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 відображатиме інтерфейс елеватора.
Тепер махніть рукою вгору або вниз, як показано на відео нижче, щоб встановити підлогу туди, куди ви хочете піти. Потім зробіть лівий жест для підтвердження підйому, щоб піднятися на той поверх. Якщо ви хочете зупинити підйомник, зробіть правильний жест рукою.
Повне робоче відео та код цього проекту наведено нижче. Сподіваюся, вам сподобалось будувати цей проект. Якщо у вас виникли запитання щодо цього проекту, залиште їх у розділі коментарів.