Распознавание жестов – увлекательная возможность, позволяющая управлять устройствами с помощью движений. Модуль PAJ7620 отлично вписывается в эту концепцию, а его сочетание с мощной платой ESP32 открывает безграничные перспективы для создания интерактивных проектов.
PAJ7620 – компактный модуль с широкими возможностями распознавания жестов. Обладает высокой чувствительностью и точностью определения движений, что делает его идеальным выбором для интерфейсов на базе жестовых команд. Его преимущества включают удобство подключения, энергоэффективность и широкий набор распознаваемых жестов.
NodeMCU 32S – мощная плата на базе ESP32 с богатым функционалом и высокой производительностью. Она обладает множеством интерфейсов, включая Wi-Fi и Bluetooth, что делает ее универсальным инструментом для IoT и DIY-проектов.
Схема подключения
Модуль PAJ7620 подключается к ESP32 по I2C интерфейсу. VCC модуля соединяется с 3.3V на ESP32, GND – с общей землей. Пины SDA и SCL модуля подключаются к соответствующим GPIO (21 и 22) на ESP32.
PAJ7620 | ESP32 |
---|---|
VCC | 3.3V |
GND | GND |
SDA | GPIO21 (SDA) |
SCL | GPIO22 (SCL) |
Библиотеки
Для работы с модулем PAJ7620 в Arduino IDE требуется библиотека “PAJ7620”.
- Откройте Arduino IDE.
- Перейдите в “Sketch” -> “Include Library” -> “Manage Libraries“.
- Найдите библиотеку “PAJ7620” и установите её.
Пример кода
Приведённый ниже код представляет минимальный функционал для отображения информации о жесте на веб-странице. Он инициализирует веб-сокет на порту 80 и отправляет информацию о жесте на все подключенные клиенты веб-страницы через веб-сокет.
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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
#include <Wire.h> #include <WiFi.h> #include <paj7620.h> #include <ESPAsyncWebServer.h> #define GES_ENTRY_TIME 800 #define GES_QUIT_TIME 1000 // Формируем HTLM документ, который будем отправлять в браузер const char index_html[] PROGMEM = R"rawliteral( <!DOCTYPE HTML> <html lang="ru"> <head> <!-- Устанавливаем стили для страницы --> <style> body { font-family: Arial, sans-serif;} #gesture h1 { font-size: 2em; } </style> </head> <body> <!-- Создаем заголовок и элемент span для отображения жеста --> <h1>Gesture: <span id="gesture"></span></h1> <script> // Адрес сервера WebSocket var gateway = `ws://${window.location.hostname}/ws`; var websocket; // Добавляем обработчик события загрузки окна window.addEventListener('load', onload); // Функция вызывается при загрузке окна function onload(event) { initWebSocket(); } // Инициализируем WebSocket function initWebSocket() { console.log('Попытка открыть соединение WebSocket…'); websocket = new WebSocket(gateway); websocket.onopen = onOpen; websocket.onclose = onClose; websocket.onmessage = onMessage; } // Обработчик события открытия соединения function onOpen(event) { console.log('Соединение открыто'); // При получении сообщения от сервера обновляем текст элемента span document.getElementById('gesture').innerText = event.data; } // Обработчик события закрытия соединения function onClose(event) { console.log('Соединение закрыто'); // После закрытия соединения пытаемся его заново открыть через 2 секунды setTimeout(initWebSocket, 2000); } // Обработчик события получения сообщения от сервера function onMessage(event) { console.log(event.data); // Парсим полученные данные из формата JSON var myObj = JSON.parse(event.data); console.log(myObj) // Обновляем текст элемента span новыми данными document.getElementById('gesture').innerText = myObj; } </script> </body> </html> )rawliteral"; // Параметры WiFi const char *ssid = "ЗАМЕНИТЕ НА ВАШ SSID"; const char *password = "ЗАМЕНИТЕ НА ВАШ ПАРОЛЬ"; // Веб-сервер AsyncWebServer server(80); AsyncWebSocket ws("/ws"); void setup() { Serial.begin(9600); // Инициализация датчика uint8_t error = paj7620Init(); if (error) { Serial.print("Ошибка инициализации: "); Serial.println(error); } else { Serial.println("Датчик настроен!\n"); } // Инициализация WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Подключение к WiFi..."); } Serial.println(WiFi.localIP()); // Создание веб-сервера server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send_P(200, "text/html", index_html); }); // Обработчик вебсокетов ws.onEvent([](AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { if (type == WS_EVT_CONNECT) { Serial.println("Клиен присоединился"); } else if (type == WS_EVT_DISCONNECT) { Serial.println("Клиент отсоединился"); } else if (type == WS_EVT_DATA) { AwsFrameInfo *info = (AwsFrameInfo *)arg; if (info->final && info->index == 0 && info->len == len) { data[len] = '\0'; String msg = (char *)data; client->text(msg); } } }); // Запуск сервера server.addHandler(&ws); server.begin(); } void loop() { String gest = get_gest(); Serial.println(gest); ws.textAll(gest); ws.cleanupClients(); } String get_gest() { String gest = "unknown"; uint8_t data = 0, data1 = 0, error; error = paj7620ReadReg(0x43, 1, &data); // Запрашиваем жест if (!error) { delay(GES_ENTRY_TIME); switch (data) { // "вправо" case GES_RIGHT_FLAG: gest = "right"; break; // "влево"" case GES_LEFT_FLAG: gest = "left"; break; // "вверх" case GES_UP_FLAG: gest = "up"; break; // "вниз" case GES_DOWN_FLAG: gest = "down"; break; // "вперед" case GES_FORWARD_FLAG: gest = "forward"; break; // "назад" case GES_BACKWARD_FLAG: gest = "backward"; break; // "по часовой стрелке" case GES_CLOCKWISE_FLAG: gest = "clockwise"; break; // "против часовой стрелки" case GES_COUNT_CLOCKWISE_FLAG: gest = "anti-clockwise"; break; default: error = paj7620ReadReg(0x44, 1, &data1); if (!error && data1 == GES_WAVE_FLAG) gest = "wave"; break; } delay(GES_QUIT_TIME); } return gest; } |
Подключение сенсора жестов PAJ7620 к плате NodeMCU 32S открывает новые возможности для управления вашими проектами с помощью жестов. Этот модуль предоставляет простой способ добавить интерактивность в ваши DIY проекты.