基于ESP32—CAM物联网WIFI小车

一.功能概述

        摄像头的画面可以实时的传输到,点灯科技APP的手机端,这样可以实时查看周围环境的状况,灯光不足,画面不清晰时可以打开灯光照明。手机端有左转、右转、前进、后退、停止的按钮。可以根据自己需要,来控制小车。手机APP端还设有模式切换的按钮,可以根据需要进行避障和手动模式的切换。

二、项目模块

小车套件,舵机、esp32-cam、稳压模块、电机驱动模块、超声波模块、开光按钮

三、代码演示

#define BLINKER_WIFI
#include <Blinker.h>
#include "ESP32_CAM_SERVER.h"#define LED 4
#define DriveLeft_A   13         //控制左轮转动方向
#define DriveLeft_B   15
#define DriveRight_A  14        //控制右轮转动方向
#define DriveRight_B  2
#define ServoPin 12  //舵机的引脚
#define Echo     3  //超声波echo
#define Trig     1  //超声波trigconst char* ssid = "nova7";         //wifi账号
const char* password = "66666666";  //wifi密码
char auth[] = "5e3ebc64737f";
int modeflag;
int Wave_len_R;
int Wave_len_L;
bool setup_camera = false;//摄像头默认不开启BlinkerButton Button1("GoForward"); //前进按键
BlinkerButton Button2("GoBack");    //后退按键
BlinkerButton Button3("Left");      //左转按键
BlinkerButton Button4("Right");     //右转按键
BlinkerButton Button5("Stop");      //停车按键
BlinkerButton Button6("led");       //led灯
BlinkerButton Button7("mode");      //模式切换按钮
BlinkerSlider Slider1("duoji");     //舵机滑块//****定义运动函数***********************************//
void Go_Forward( )       // 前进 
{digitalWrite(DriveLeft_A, HIGH);digitalWrite(DriveRight_A, HIGH);digitalWrite(DriveLeft_B, LOW); digitalWrite(DriveRight_B, LOW);
}void Go_Back( )         //后退  
{ digitalWrite(DriveLeft_A, LOW);digitalWrite(DriveRight_A, LOW); digitalWrite(DriveLeft_B, HIGH);digitalWrite(DriveRight_B, HIGH);
}
void Stop_Car( )       //停止
{digitalWrite(DriveLeft_A, LOW);digitalWrite(DriveLeft_B, LOW);digitalWrite(DriveRight_A, LOW);digitalWrite(DriveRight_B, LOW);
}void Turn_Left( )// 左转
{digitalWrite(DriveLeft_A, LOW);digitalWrite(DriveRight_A, HIGH);//左轮后退digitalWrite(DriveLeft_B, HIGH);//右轮前进digitalWrite(DriveRight_B, LOW);
}void Turn_Right( )// 右转 
{digitalWrite(DriveLeft_A, HIGH);//左轮前进digitalWrite(DriveRight_A, LOW);digitalWrite(DriveLeft_B, LOW);digitalWrite(DriveRight_B, HIGH);//右轮后退}//超声波计算距离函数
long getTime() 
{digitalWrite(Trig, HIGH);delayMicroseconds(10);            //发送10us的高电平 让超声波工作digitalWrite(Trig, LOW);return pulseIn(Echo, HIGH);       //返回接收到高电平时的时间
}//舵机的旋转函数
void Myservo(int angle)
{for (int i = 0; i < 5; i++) {int pulsewidth = (angle * 11) + 500;        //将角度转化为500-2480的脉宽值digitalWrite(ServoPin, HIGH);               //将舵机接口电平至高delayMicroseconds(pulsewidth);              //延时脉宽值的微秒数digitalWrite(ServoPin, LOW);                //将舵机接口电平至低delayMicroseconds(20000 - pulsewidth);      //延时脉宽值的微秒数}delay(10);
}void button1_callback(const String & state)                 //定义前进按钮
{BLINKER_LOG("get button state: ", state);if (state == "press" || state == "tap") {                 //判断按键是否被按下Go_Forward();    }else if (state == "pressup") {                            //判断按键是否松开Stop_Car( );}
}void button2_callback(const String & state)                 //定义后退按钮
{BLINKER_LOG("get button state: ", state);if (state == "press" || state == "tap") {         //判断按键是否按下 或者按下但没有松手Go_Back( );}else if (state == "pressup") {Stop_Car( );}
}void button3_callback(const String & state)                  //定义左转按钮
{BLINKER_LOG("get button state: ", state);if (state == "press" || state == "tap") {Turn_Left( );delay(100);Stop_Car( );}else if (state == "pressup") {Stop_Car( );}
}void button4_callback(const String & state)                  //定义右转按钮
{BLINKER_LOG("get button state: ", state);if (state == "press" || state == "tap") {Turn_Right( );delay(100);Stop_Car( );}else if (state == "pressup") {Stop_Car( );}
}void button5_callback(const String & state)                  //定义停止按钮
{BLINKER_LOG("get button state: ", state);Stop_Car( );
}// 按下LED按键即会执行该函数
void button6_callback(const String & state)                  //定义LED灯开关按钮
{BLINKER_LOG("get button state: ", state);digitalWrite(LED, !digitalRead(LED));}// // 切换模式的按键
void button7_callback(const String & state)                  
{BLINKER_LOG("get button state: ", state);if(state=="on"){modeflag = 1;Button7.print("on");Blinker.notify("开启避障模式");    Stop_Car();  }else if(state == "off") {modeflag = 0;Button7.print("off");Blinker.notify("遥控模式");Stop_Car();}Blinker.vibrate();  //手机震动} 
//滑动滑块就要执行的函数
void slider1_callback(int32_t value)
{int val = value;Myservo(val);   //转动多少度
}//反馈点灯科技平台的状态
void dataRead(const String & data)
{BLINKER_LOG("Blinker readString: ", data);Blinker.vibrate();uint32_t BlinkerTime = millis();Blinker.print("millis", BlinkerTime);
}void setup()
{// //超声波的初始化pinMode(Trig,OUTPUT);pinMode(Echo,INPUT);//led灯的初始化pinMode(LED,OUTPUT);digitalWrite(LED,LOW);pinMode(ServoPin,OUTPUT);Myservo(90);    //小车电机引脚设置pinMode(DriveLeft_A, OUTPUT);         pinMode(DriveLeft_B, OUTPUT);pinMode(DriveRight_A, OUTPUT);pinMode(DriveRight_B, OUTPUT);// Serial.begin(115200);//esp32-cam的连接到点灯科技平台BLINKER_DEBUG.stream(Serial);//点灯科技串口的debugBlinker.begin(auth,ssid,password);//通过wifi,密钥,密码连接平台Blinker.attachData(dataRead);//反馈点灯科技的状态//**********注册App按钮对应动作函数********************************//Button1.attach(button1_callback);Button2.attach(button2_callback);Button3.attach(button3_callback);Button4.attach(button4_callback);Button5.attach(button5_callback);Button6.attach(button6_callback);//起到关联处理按键控制函数的作用Button7.attach(button7_callback);//模式切换按键的关联Slider1.attach(slider1_callback);//滑块的关联函数
}void loop()
{Blinker.run();//连接点灯科技int Wave_len = 0;if(modeflag == 0){//获取超声波的数据Wave_len =  getTime()/58;if((Wave_len > 1) && (Wave_len < 25)){Stop_Car();             //停车digitalWrite(LED,HIGH);//开灯Go_Back();             //后退delay(100);Stop_Car();         //停车digitalWrite(LED,LOW);//关灯}}//避障模式else if(modeflag == 1){Go_Forward();//获取超声波的数据Wave_len =  getTime()/58;if((Wave_len > 1) && (Wave_len < 25)){Stop_Car();             //停车digitalWrite(LED,HIGH);//开灯Wave_len =  getTime()/58;if(Wave_len >1 && Wave_len <15){digitalWrite(LED,HIGH);//开灯Go_Back();             //后退delay(100);Stop_Car();         //停车digitalWrite(LED,LOW);//关灯}else{Stop_Car();Myservo(135);Wave_len_L =  getTime()/58;delay(1000);Myservo(45);Wave_len_R = getTime()/58;delay(1000);Myservo(90);delay(100);if(Wave_len_R >= Wave_len_L)//右边的距离大于左边{do{Turn_Right();delay(100);Wave_len_R =  getTime()/58;}while((Wave_len_R > 1) && (Wave_len_R < 25));}else if(Wave_len_R < Wave_len_L){do{Turn_Left();delay(100);Wave_len_L =  getTime()/58;}while((Wave_len_L > 1) && (Wave_len_L <25));}}}}if (Blinker.connected() && !setup_camera){setupCamera();setup_camera = true;Blinker.printObject("video", "{\"str\":\"mjpg\",\"url\":\"http://"+ WiFi.localIP().toString() + "\"}");}
}

四、视频演示

视频地址:https://live.csdn.net/v/382534?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://live.csdn.net/v/382534?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub Copilot申请和使用

GitHub Copilot申请和使用 文章目录 前言一、申请二、使用总结 前言 之前已经成功进行了Github学生认证&#xff0c;今天邮件通知之前的学生认证已经通过。那么就去进行GitHub Copilot申请和使用。 前面准备&#xff1a;Github学生认证 一、申请 进入github的settings&#x…

Eclipse:-Dmaven.multiModuleProjectDirectory system propery is not set.

eclipse中使用maven插件的时候&#xff0c;运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match. 可以设一个环境变量M2_HOME指向你的maven安装目录 M2_HOMED:\Apps\…

Deckset for Mac激活版:MD文档转幻灯片软件

Deckset for Mac是一款专为Mac用户打造的Markdown文档转幻灯片软件。它凭借简洁直观的界面和强大的功能&#xff0c;成为许多用户的心头好。 Deckset for Mac激活版下载 Deckset支持Markdown语法&#xff0c;让用户在编辑文档时无需分心于复杂的格式设置&#xff0c;只需专注于…

【docker 】Windows10安装 Docker

安装 Hyper-V Hyper-V 是微软开发的虚拟机&#xff0c;仅适用于 Windows 10。 按键&#xff1a; win键X &#xff0c;选着程序和功能 在查找设置中输入&#xff1a;启用或关闭Windows功能 选中Hyper-V 点击确定 安装 Docker Desktop for Windows Docker Desktop 官方下载…

2024年 Java 面试八股文——Redis篇

目录 1、介绍下Redis Redis有哪些数据类型 难度系数&#xff1a;⭐ 2、Redis提供了哪几种持久化方式 难度系数&#xff1a;⭐ 3、Redis为什么快 难度系数&#xff1a;⭐ 4、Redis为什么是单线程的 难度系数&#xff1a;⭐ 5、Redis服务器的的内存是多大…

pkpmbs 建设工程质量监督系统 Ajax_operaFile.aspx 文件读取漏洞复现

0x01 产品简介 pkpmbs 建设工程质量监督系统是湖南建研信息技术股份有限公司一个与工程质量检测管理系统相结合的,B/S架构的检测信息监管系统。 0x02 漏洞概述 pkpmbs 建设工程质量监督系统 Ajax_operaFile.aspx接口处存在文件读取漏洞,未经身份认证的攻击者可以利用漏洞读…

助力企业部署国产云原生数据库 XSKY星辰天合与云猿生完成产品互兼容认证

近日&#xff0c;北京星辰天合科技股份有限公司&#xff08;简称&#xff1a;XSKY 星辰天合&#xff09;与杭州云猿生数据有限公司&#xff08;简称“云猿生”&#xff09;完成了产品互兼容认证&#xff0c;星辰天合企业级分布式统一数据平台 XEDP 与云猿生的开源数据库管控平台…

机器学习:逻辑回归

概念 首先&#xff0c;逻辑回归属于分类算法&#xff0c;是线性分类器。我们可以认为逻辑回归是在多元线性回归的基础上把结果给映射到0-1的区间内&#xff0c;hθ&#xff08;x&#xff09;越接近1越有可能是正例&#xff0c;反之&#xff0c;越接近0越有可能是负例。那么&am…

C# wpf 运行时替换方法实现mvvm自动触发刷新

文章目录 前言一、如何实现&#xff1f;1、反射获取属性2、定义替换方法3、交换属性的setter方法 二、完整代码1、接口2、项目 三、使用示例1、倒计时&#xff08;1&#xff09;、继承ViewModelBase&#xff08;2&#xff09;、定义属性&#xff08;3&#xff09;、属性赋值&am…

iOS 创建依赖其他开源库的开源库

参考文章&#xff08;感激各位大神前路的明灯&#xff09; 参考文章一 参考项目 整体流程 流程简介 1&#xff09;使用pod命令行创建本地项目和git仓库并回答终端里的四个问题 2&#xff09;编辑podspec文件 3&#xff09;将需要开源的代码添加到Development Pods文件夹中&am…

iOS 实现类似抖音翻页滚动效果

这里是效果图 参考抖音的滚动效果&#xff0c;需要我们在结束拖动的时候&#xff0c;动画设置偏移量 这里有一个注意点&#xff0c;由于我们是在拖动结束的时候&#xff0c;手动改变tableview的偏移量&#xff0c; 改变了tableView 自身原有的的滚动效果&#xff0c;所以我们…

近几年视频取证、视频篡改检测技术发展现状及挑战

前言 本文主要搜集了视频取证各个子领域近几年的高影响因子/引用数的文章及其主要思想和做法&#xff0c;旨在分析目前视频篡改检测的发展现状与热点领域&#xff0c;文章中也融合了自己的一点看法和展望&#xff0c;欢迎感兴趣的同学和我多多沟通。 本文无论是文献搜集还是方…

Linux网络抓包工具tcpdump是如何实现抓包的,在哪个位置抓包的?

Linux网络抓包工具tcpdump是如何实现抓包的&#xff0c;在哪个位置抓包的&#xff1f; 1. tcpdump抓包架构2. BPF介绍3. 从内核层面看tcpdump抓包流程3.1. 创建socket套接字3.2. 挂载BPF程序 4. 网络收包抓取5. 网络发包抓取6. 疑问和思考6.1 tcpdump抓包跟网卡、内核之间的顺序…

【MySQL | 第八篇】在MySQL中,如何定位慢查询以及对应解决方法?

文章目录 8.在MySQL中&#xff0c;如何定位慢查询以及对应解决方法&#xff1f;8.1MySQL慢查询日志8.1.1开启慢查询&#xff08;1&#xff09;修改配置文件&#xff08;2&#xff09;设置全局变量 8.1.2日志记录在表上&#xff08;实践&#xff09;8.1.3日志记录在文件上&#…

大数据开发工作中的数仓设计(Hadoop,hive ,mysql )

1.HUE工具介绍使用 HUE是CDH提供一个hive和hdfs的操作工具&#xff0c;在hue中编写了hiveSQl也可以操作hdfs的文件 http://主机名字:端口号 hdfs的web访问端口 http://主机名字:端口号 hdfs的程序访问端口 进入后确保hdfs hive yarn 开启 在点击hue开启 在这里面也可以进行h…

Xinlinx FPGA如何降低Block RAM的功耗

FPGA中降低Block RAM的功耗有两种方式&#xff0c;分别是选择合适的写操作模式以及Block RAM的实现算法及综合设置。我们知道对于采用IP核生成对应的RAM时&#xff0c;会有最小面积算法、低功耗算法以及固定原语&#xff0c;但是采用最小功耗算法有时由于级联长度导致无法实现&…

币圈Cryptosquare论坛

Cryptosquare综合性资讯论坛汇集了币圈新闻、空投信息、社会热点以及与Web3相关的工作信息。让我们一起解锁加密世界的种种可能性&#xff0c;探索Cryptosquare论坛带来的精彩&#xff01; 币圈新闻板块&#xff1a; Cryptosquare论坛的币圈新闻板块是用户获取最新加密货币行业…

Elasticsearch中【文档查询】DSL语句以及对应的Java实现

目录 全文检索查询 精准查询 布尔查询 排序、分页查询 高亮 地理查询 复合查询 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;一般测…

全新突破:「Paraverse平行云」实现3D/XR企业级应用全面接入Apple Vision Pro

在前不久举行的GTC开发者大会上&#xff0c;英伟达引领行业风向&#xff0c;宣布其Omniverse平台能够助力企业将3D/XR应用流畅传输至Apple Vision Pro混合现实头显。在英伟达与苹果这两大科技巨头的合作下,此举标志着3D/XR技术迈向新纪元的关键一步。「Paraverse平行云」实时云…

《HCIP-openEuler实验指导手册》1.6 Apache静态资源配置

知识点 常用用途&#xff1a; 软件仓库镜像及提供下载服务&#xff1a; 配置步骤 删除网站主目录中的文件&#xff08;本实验机目录为/home/source ip为192.168.12.137 端口为81&#xff09; cd /home/source rm -rf *在主目录中新建6个文件夹如下图 mkdir test{1..6}新建…