基于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  //超声波trig

const 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);//点灯科技串口的debug
    Blinker.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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

美国站群服务器上常见的操作系统选择指南

美国站群服务器上常见的操作系统选择指南 美国站群服务器的选择操作系统对于服务器的性能和功能至关重要。本文将为您介绍在美国站群服务器上常见的操作系统选择指南&#xff0c;以帮助您做出明智的决策。 在选择美国站群服务器时&#xff0c;选择合适的操作系统是至关重要的…

SMTP服务器搭建的注意事项?如何配置SMTP?

SMTP服务器搭建的步骤有哪些&#xff1f;SMTP服务器的搭建方法&#xff1f; SMTP服务器作为电子邮件传输的核心组件&#xff0c;其搭建过程中的每一个细节都至关重要。AokSend将详细探讨SMTP服务器搭建的注意事项&#xff0c;帮助您轻松搭建一个高效、安全的SMTP服务器。 SMT…

Flutter创建自定义的软键盘

参考代码&#xff1a; Flutter - Create Custom Keyboard Examples 本文贴出的代码实现了一个输入十六进制数据的键盘&#xff1a; &#xff08;1&#xff09;支持长按退格键连续删除字符&#xff1b; &#xff08;2&#xff09;可通过退格键删除选中的文字&#xff1b; &…

02 - 步骤 Kafka consumer

简介 Kafka consumer 步骤&#xff0c;用于连接和消费 Apache Kafka 中的数据,它可以作为数据管道的一部分&#xff0c;将 Kafka 中的数据提取到 Kettle 中进行进一步处理、转换和加载&#xff0c;或者将其直接传输到目标系统中。 使用 场景 我需要订阅一个Kafka的数据&…

网络安全之密码学技术

文章目录 网络信息安全的概念数据加密|解密概念密码学概论密码学分类古典密码学现代密码学 现代密码学的相关概念对称加密算法对称加密算法—DES对称加密算法—3DES对称加密算法—AES对称加密算法—IDEA 非对称加密算法非对称加密算法—RSA非对称加密算法—ElGamal非对称加密算…

Reactor Netty-响应式编程-010

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 为什么不…

Objective-C大爆炸:从零到单例模式

oc学习笔记&#xff08;一&#xff09; 文章目录 oc学习笔记&#xff08;一&#xff09;oc与c语言的区别#import的用法foundation框架NSLog函数NSString类型符号的作用oc中的数据类型 类与对象概念&#xff1a; 创建第一个类类的定义类的实现类加载对象的产生和使用 self语法id…

GaussDB数据库事务管理

一、引言 事务管理是数据库系统中至关重要的一部分&#xff0c;它确保了数据库的一致性和可靠性。在GaussDB数据库中&#xff0c;事务管理不仅遵循传统的ACID特性&#xff0c;还提供了一些高级功能。本文将深入探讨GaussDB数据库事务管理的各个方面。 二、事务的基本概念 2.1…

前端页面单元测试最佳策略:全面涵盖逻辑、组件、流程、UI及性能优化测试,全面保障软件应用的质量

页面级别的测试要求我们从更宏观的角度审视应用&#xff0c;不仅关注单个组件的正确性&#xff0c;还要确保组件间的协作无误&#xff0c;以及用户在应用中的完整体验。通过集成测试、E2E测试和场景测试&#xff0c;我们可以更全面地覆盖应用的各种使用情况&#xff0c;提高软件…

Educational Codeforces Round 165 (Rated for Div. 2) (C、D)

1969C - Minimizing the Sum 题意&#xff1a; 思路&#xff1a;观察到操作数很小&#xff0c;最值问题操作数很容易想到dp&#xff0c;用表示第个元素&#xff0c;操作了次的最小值总和&#xff0c;转移的时候枚举连续操作了几次即可&#xff0c;而连续操作了几次即将全部变成…

机器学习:基于Sklearn、XGBoost框架,使用逻辑回归、支持向量机和XGBClassifier来诊断并预测一个人是否患有自闭症

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

Linux硬盘挂载操作记录

文章目录 1.前置概念2.挂载步骤2.1查看盘信息2.2挂载整个盘到指定目录2.3将盘划分为多个分区并挂载到不同目录2.3.1创建分区2.3.2指定文件系统2.3.3挂载目录 3.删除分区 1.前置概念 分区&#xff1a;分区就是将硬盘划分为多个区域&#xff0c;每个区域都有自己的文件系统&…

AI智能名片商城小程序:引领企业迈向第三增长极

随着数字化浪潮的席卷&#xff0c;私域流量的重要性逐渐凸显&#xff0c;为企业增长提供了全新的动力。在这一背景下&#xff0c;AI智能名片商城系统崭露头角&#xff0c;以其独特的优势&#xff0c;引领企业迈向第三增长极。 私域流量的兴起&#xff0c;为企业打开了一扇新的销…

竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖&#xff0c;适合作为竞赛课…

迅为RK3568开发板瑞芯微人工智能AI鸿蒙Linux安卓开发学习

PU&#xff1a;iTOP-3568开发板采用瑞芯微RK3568处理器&#xff0c;内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz&#xff0c;RK809动态调频。集成了双核心架构GPU&#xff0c;ARM G52 2EE、支持OpenGL ES1.1/2.0/3.2、OpenCL2.0、Vulkan1.1、内嵌高性能2D加速硬件。 内…

Windows Server 评估版转换(升级)为完整版

临时方法 获取 Windows Server 的剩余宽限期 Slmgr /dliWindows Server免费试用期可以使用以下命令合法延长5次&#xff0c;共180天&#xff1a; slmgr /rearm这意味着所评估的 Windows Server 的最长可用时间为 3 年 ( 180 days * 6)。 试用期到期后&#xff0c;Windows S…

使用opencv改变图片大小

使用opencv改变图片大小 图片的宽度和高度效果代码 图片的宽度和高度 宽度&#xff1a;图片的宽度指的是图像从左边缘到右边缘的水平跨度。在数字图像中&#xff0c;宽度通常是以像素&#xff08;pixels&#xff09;为单位来度量的。高度&#xff1a;图片的高度指的是图像从上…

在远程服务器上安装anaconda以及配置pytorch虚拟环境

目录 第一步&#xff1a;官网或者清华源下载Anaconda。 第二步&#xff1a;创建虚拟环境。 第三步&#xff1a;在服务器终端输入nvidia-smi查看服务器信息。 第四步&#xff1a;在pytorch官网找到对应版本cuda的命令。 第一步&#xff1a;官网或者清华源下载Anaconda。 官网…

Hive 表定义主键约束

文章目录 1.建表语句2.主键约束3.主键约束的意义参考文献 1.建表语句 先看一下官方给的完整的见表语句&#xff1a; CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)[(col_name data…

谷歌浏览器查看http请求的请求标头和响应标头

http://t.weather.itboy.net/api/weather/city/101010100 记得刷新&#xff0c;才算请求了一次服务器 响应标头&#xff1a; HTTP/1.1 200 OK Content-Type: application/json; 请求标头&#xff1a; GET /api/weather/city/101010100 HTTP/1.1 Host: t.weather.itboy.n…