基于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

相关推荐

  1. ESP-01S + STM32联网

    2024-04-30 05:58:06       21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-30 05:58:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-30 05:58:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-30 05:58:06       82 阅读
  4. Python语言-面向对象

    2024-04-30 05:58:06       91 阅读

热门阅读

  1. 设计模式(四)、策略模式

    2024-04-30 05:58:06       33 阅读
  2. Python:将数组从一个范围等效到另一个范围

    2024-04-30 05:58:06       34 阅读
  3. github fork项目不带tag解决

    2024-04-30 05:58:06       29 阅读
  4. el-row中元素如何上下居中对齐?

    2024-04-30 05:58:06       35 阅读
  5. python基础知识

    2024-04-30 05:58:06       32 阅读
  6. leetcode15-3Sum

    2024-04-30 05:58:06       156 阅读
  7. 烟雾识别图像处理方法详解---豌豆云

    2024-04-30 05:58:06       34 阅读
  8. C++中的STL——queue类的基本使用

    2024-04-30 05:58:06       32 阅读