基于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://xiahunao.cn/news/2998750.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

南京航空航天大学用契约锁让校园业务盖章“腾出手”、办事更便捷

南京航空航天大学&#xff08;以下简称“南航”&#xff09;创建于1952年&#xff0c;是国家“双一流”建设高校&#xff0c;国家“211工程”、“985工程优势学科创新平台”重点建设高校之一&#xff0c;同时也是新中国自己创办的第一批航空高等院校之一。 创新高校网上签字盖…

Vitis HLS 学习笔记--Schedule Viewer 调度查看器

目录 1. 简介 2. Schedule Viewer详解 2.1 视图说明 2.1.1 Operation\Control Step 2.1.2 周期关系图 2.1.3 Schedule Viewer 菜单栏 2.1.4 属性视图 2.2 内容说明 2.2.1 实参&#xff08;b&#xff09;解释 2.2.2 实参&#xff08;a&#xff09;解释 2.2.3 变量&am…

一、初识Django

简介 Django 是一个用于构建 Web 应用程序的高级 Python Web 框架。 版本对应 不同版本的django框架是基于特定的不同的python版本开发的&#xff0c;所以不同版本的django框架要正常执行功能只能安装特定的python版本 Django安装 安装 Django # 全局安装 pip install dj…

第一个Cython程序-helloworld

Cython是Python的一个模块&#xff0c;可以将python语言“翻译”成C语言。 如何安装&#xff1f; python -m pip install Cython -i https://pypi.tuna.tsinghua.edu.cn/simple/ 新建两个文件helloworld.pyx和setup.py。 helloworld.pyx print("hello world")setu…

MySQL中SELECT语句的执行过程

2.1.1. 一条SELECT语句的执行过程 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层 Server层负责建立连接、分析和执行SQL存储引擎层负责数据的存储和提取&#xff0c;支持 InnoDB、MyISAM、Memory 等多个存储引擎&#xff0c;MySQL5.5以后默认使用InnoDB&#xff0…

一个单例模式中使用std::unique_ptr引起的莫名其妙的COFF损坏的问题(未解决)

使用static std::unique_ptr和static std::shared_ptr都不行struct IElementAgendaEvents {//! Called to allow listeners to modify the agenda by adding/removing entries before applying tool operation. Return true if entries added or invalidated.virtual bool …

【触摸案例-事件的产生和传递 Objective-C语言】

一、事件的产生和传递 1.事件的产生和传递 1)涉及到的两个方法 2)响应者链条 这个东西呢,比较绕,然后我们接下来一块儿来看一下啊, 我们把上午最后的一份代码,复制粘贴一下,改个名字,叫做“05-事件的产生和传递”, 首先,我们上午说了一下,这个hit test这个方法,…

算法设计与分析 3.2 牛顿法及改进、迭代法、矩阵谱半径、雅可比迭代、高斯迭代

思考题1 改进cosx&#xff1f;优化算法 关键点在于cos计算过于麻烦&#xff0c;而每次都要求sinx的值 故直接简化为cosx的导数 -sinx 即&#xff1a; 原&#xff1a;//double daoshu(double x) { // return 18 * x - cos(x); //} 改&#xff1a;double daoshu(double x) {retu…

Git中单独的功能特性分支是什么含义

在Git中&#xff0c;一个"功能特性分支"&#xff08;通常简称为“特性分支”&#xff09;是指从主开发分支&#xff08;比如main或master&#xff09;独立出来的分支&#xff0c;专门用于开发一个新功能、修复一个bug&#xff0c;或者进行实验性的尝试。使用特性分支…

LT9611单/双端口 MIPI CSI/DSI 转 HDMI 1.4 发射器,龙迅方案

1. 描述LT9611 MIPI DSI/CSI 至 HDMI1.4 桥接器具有双端口 MIPI D-PHY 接收器前端配置&#xff0c;每个端口有 4 个数据通道&#xff0c;每个数据通道以 2Gbps 的速度工作&#xff0c;最大输入带宽为 16Gbps。该桥接器提供一个 HDMI 数据输出&#xff0c;具有可选的 SPDIF 或 8…

【CGALDotNet】CGAL的C#封装(C#调用编译好的CGAL的dll)

介绍 开源项目出处&#xff08;两个模块&#xff09;&#xff1a; 链接1&#xff1a;https://github.com/Scrawk/CGALDotNet/tree/master?tabreadme-ov-file 链接2&#xff1a;https://github.com/Scrawk/CGALDotNetGeometry 该项目提供了编译的、封装相关接口后的CGAL库&am…

Java将文件目录转成树结构

在实际开发中经常会遇到返回树形结构的场景&#xff0c;特别是在处理文件系统或者是文件管理系统中。下面就介绍一下怎么将文件路径转成需要的树形结构。 在Java中&#xff0c;将List<String>转换成树状结构&#xff0c;需要定义一个树节点类&#xff08;TreeNode&#…

【前端】表格合并如何实现?

简言 介绍实现表格合并的一种方法。 表格合并 表格合并操作是一个比较复杂的操作&#xff0c;它主要分为以下步骤&#xff1a; 获取选中区域选择合并显示的单元格实现合并操作。 我们就逐一实现这三步&#xff0c;最后实现一个较完整的合并操作。&#xff08;不考虑边界情…

《ElementPlus 与 ElementUI 差异集合》el-dialog 显示属性有差异

ElementPlus 用属性 v-model ElementUI 用属性 visible 其实也是 Vue2/Vue3 的差异&#xff1a;v-model 指令在组件上的使用已经被重新设计&#xff0c;替换掉了 v-bind.sync

【酱浦菌-爬虫项目】爬取学术堂论文信息

1. 首先&#xff0c;代码定义了一个名为 url 的变量&#xff0c;它是一个包含三个网址的集合&#xff08;或者说是一个集合的字典&#xff09;。这些网址分别是&#xff1a; - ‘http://www.xueshut.com/lwtimu/127966.html’ - ‘http://www.xueshut.com/lwtimu/12…

【百度Apollo】探索自动驾驶:Apollo 新版本 Beta 全新的Dreamview+,便捷灵活更丰富

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、Dreamview介绍二、Dreamview 新特性2.1、基于模式的多场景——流程更简洁地图视角调节&#xff1a;调试流…

【AIGC调研系列】LLaVA++整合Phi-3和Llama-3能够实现什么

LLaVA能够为Phi-3和Llama-3带来的主要好处包括&#xff1a; 视觉处理能力的增强&#xff1a;通过整合Phi-3和Llama-3模型&#xff0c;创建了具备视觉处理能力的Phi-3-V和Llama-3-V版本&#xff0c;这意味着这些模型现在能够理解和生成与图像相关的内容[1]。这种能力的增加&…

天冕科技亮相第十七届深圳国际金融博览会!

第十七届深圳国际金融博览会在深圳会展中心正式开幕&#xff0c;天冕科技跟随南山区组团集体亮相&#xff0c;充分展现金融活力。此次金博会&#xff0c;南山区政府共遴选了包括天冕科技在内的三家优秀金融科技企业组团参展&#xff0c;以特色与创新的案例展示了辖区金融业发展…

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\…

python数据可视化:雷达图

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python数据可视化&#xff1a; 雷达图 选择题 关于以下代码输出的雷达图中&#xff0c;以下说法正确的是&#xff1f; import numpy as np import matplotlib.pyplot as plt from pylab impor…