如标题所言,因为年底工作繁忙,一直加班,没有空去打板验证,拿现有资源一晚上堆出了一个丐版的小车(车车,不是我不爱你,是我真的没空啊~)

源码

#define BLINKER_WIFI

  • #include <Blinker.h>
  • #include <string.h>
  • //#include "ESP32_CAM_SERVER.h"

  • bool setup_camera = false;

  • char auth[] = "08eec437a3de";     //设备秘钥
  • char ssid[] = "4G-UFI-7787";      //WIFI名称
  • char pswd[] = "1234567890";       //WIFI密码

  • String KeyName;
  • String KeyValue;

  • // //初始创建化按钮对象
  • // BlinkerButton Button_left("btn-left");
  • // BlinkerButton Button_right("btn-right");
  • // BlinkerButton Button_front("btn-front");
  • // BlinkerButton Button_back("btn-back");
  • // BlinkerButton Button_stop("btn-stop");

  • // //初始创建化数据对象
  • BlinkerNumber num_temp("num-temp");
  • BlinkerNumber num_electric("num-electric");

  • // 如果未绑定的组件被触发,则会执行其中内容
  • void dataRead(const String & data)
  • {
  •     // //获取自启动开发板以来经过的毫秒数
  •     // uint32_t BlinkerTime = millis();
  •     // //将时间发送到手机
  •     // Blinker.print(BlinkerTime);

  •     int startPos = data.indexOf(""") + 1;
  •     int endPos = data.indexOf(""", startPos);
  •     // 提取双引号内的内容
  •     KeyName = data.substring(startPos, endPos);
  •     Serial.println(KeyName);

  •     startPos = data.indexOf(""", endPos+1) + 1;
  •     endPos = data.indexOf(""", startPos);
  •     // 提取双引号内的内容
  •     KeyValue = data.substring(startPos, endPos);
  •     Serial.println(KeyValue);   

  •     //板载LED状态翻转
  •     digitalWrite(48, !digitalRead(48));

  •     //上传测试:将温度值上传到数据对象
  •     num_temp.print(12);
  • }

  • void motor_init()
  • {
  •     //设置电机的PWM
  •     ledcSetup(0, 10000, 8); // 设置通道0的频率为10000,分辨率8位
  •     ledcAttachPin(1, 0);          // 将通道0与引脚1连接
  •      //设置电机的PWM
  •     ledcSetup(1, 10000, 8); // 设置通道1的频率为10000,分辨率8位
  •     ledcAttachPin(2, 1);          // 将通道1与引脚2连接
  •      //设置电机的PWM
  •     ledcSetup(2, 10000, 8); // 设置通道2的频率为10000,分辨率8位
  •     ledcAttachPin(3, 2);          // 将通道2与引脚3连接
  •      //设置电机的PWM
  •     ledcSetup(3, 10000, 8); // 设置通道3的频率为10000,分辨率8位
  •     ledcAttachPin(4, 3);          // 将通道3与引脚4连接
  • }

  • void motor_left(int speed)
  • {
  •   ledcWrite(0, 0); // 输出PWM
  •   ledcWrite(1, speed); // 输出PWM

  •   ledcWrite(2, speed); // 输出PWM
  •   ledcWrite(3, 0); // 输出PWM
  • }
  • void motor_right(int speed)
  • {
  •   ledcWrite(0, speed); // 输出PWM
  •   ledcWrite(1, 0); // 输出PWM

  •   ledcWrite(2, 0); // 输出PWM
  •   ledcWrite(3, speed); // 输出PWM
  • }

  • //前进,速度最大256
  • void motor_forward(int speed)
  • {
  •   ledcWrite(0, speed); // 输出PWM
  •   ledcWrite(1, 0); // 输出PWM

  •   ledcWrite(2, speed); // 输出PWM
  •   ledcWrite(3, 0); // 输出PWM
  • }
  • void motor_back(int speed)
  • {
  •   ledcWrite(0, 0); // 输出PWM
  •   ledcWrite(1, speed); // 输出PWM

  •   ledcWrite(2, 0); // 输出PWM
  •   ledcWrite(3, speed); // 输出PWM
  • }
  • void motor_stop()
  • {
  •   ledcWrite(0, 256); // 输出PWM
  •   ledcWrite(1, 256); // 输出PWM
  •   ledcWrite(2, 256); // 输出PWM
  •   ledcWrite(3, 256); // 输出PWM
  • }

  • /*
  • 小车控制
  •   轻击 tap
  •   长按 press
  •   松开 pressup
  • */
  • void car_control(void)
  • {
  •   // 如果按下前进
  •   if(KeyName.equals("btn-front"))
  •   {
  •     // 如果是长按
  •     if(KeyValue.equals("press"))
  •     {
  •       //小车前进
  •       motor_forward(100);
  •     }   
  •     // 如果长按松开
  •     if(KeyValue.equals("pressup"))
  •     {
  •       //小车停止
  •       motor_stop();
  •     }
  •   }

  •   // 如果按下左转
  •   if(KeyName.equals("btn-left"))
  •   {
  •     if(KeyValue.equals("press"))
  •     {
  •       motor_left(100);

  •     }   
  •     if(KeyValue.equals("pressup"))
  •     {
  •       motor_stop();
  •     }
  •   }  
  •   //如果是按下右转
  •   if(KeyName.equals("btn-right"))
  •   {
  •     if(KeyValue.equals("press"))
  •     {
  •       motor_right(100);

  •     }   
  •     if(KeyValue.equals("pressup"))
  •     {
  •       motor_stop();
  •     }
  •   }  
  •   // 如果是按下后退
  •   if(KeyName.equals("btn-back"))
  •   {
  •     if(KeyValue.equals("press"))
  •     {
  •       motor_back(100);
  •     }   
  •     if(KeyValue.equals("pressup"))
  •     {
  •       motor_stop();
  •     }
  •   }  
  •   // 如果是按下停止
  •   if(KeyName.equals("btn-stop"))
  •   {
  •     if(KeyValue.equals("tap"))
  •     {
  •       motor_stop();
  •     }   
  •     if(KeyValue.equals("press"))
  •     {
  •       motor_stop();
  •     }   
  •     if(KeyValue.equals("pressup"))
  •     {
  •       motor_stop();
  •     }
  •   }  
  •   //清除字符串缓存
  •   KeyName.remove(0);
  •   KeyValue.remove(0);

  • }

  • void setup()
  • {
  •   // 初始化串口
  •   Serial.begin(115200);
  •   BLINKER_DEBUG.stream(Serial);

  •   // 初始化blinker
  •   Blinker.begin(auth, ssid, pswd);

  •   //注册回调函数,当有设备收到APP发来的数据时会调用对应的回调函数
  •   Blinker.attachData(dataRead);

  •   // 初始化有LED的IO
  •   pinMode(48, OUTPUT);
  •   // 点亮LED
  •   digitalWrite(48, LOW);
  •   //初始化电机
  •   motor_init();

  • }

  • void loop()
  • {
  •     // 运行MQTT
  •     Blinker.run();

  •     // 运行小车控制
  •     car_control();


  •     //  局域网摄像头设置
  •     //  if (Blinker.connected() && !setup_camera)
  •     //  {
  •     //      setupCamera();
  •     //      setup_camera = true;

  •     //      Blinker.printObject("video", "{"str":"mjpg","url":"http://"+ WiFi.localIP().toString() + ""}");
  •     //  }

  •     //设备延时
  •     //Blinker.delay(500);
  • }

  • 复制代码
    是不是觉得很乱?等我有空搞成固件开源吧,哈哈

    效果