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

源码

  1. #define BLINKER_WIFI

  2. #include <Blinker.h>
  3. #include <string.h>
  4. //#include "ESP32_CAM_SERVER.h"

  5. bool setup_camera = false;

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

  9. String KeyName;
  10. String KeyValue;

  11. // //初始创建化按钮对象
  12. // BlinkerButton Button_left("btn-left");
  13. // BlinkerButton Button_right("btn-right");
  14. // BlinkerButton Button_front("btn-front");
  15. // BlinkerButton Button_back("btn-back");
  16. // BlinkerButton Button_stop("btn-stop");

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

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

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

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

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

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

  42. void motor_init()
  43. {
  44.     //设置电机的PWM
  45.     ledcSetup(0, 10000, 8); // 设置通道0的频率为10000,分辨率8位
  46.     ledcAttachPin(1, 0);          // 将通道0与引脚1连接
  47.      //设置电机的PWM
  48.     ledcSetup(1, 10000, 8); // 设置通道1的频率为10000,分辨率8位
  49.     ledcAttachPin(2, 1);          // 将通道1与引脚2连接
  50.      //设置电机的PWM
  51.     ledcSetup(2, 10000, 8); // 设置通道2的频率为10000,分辨率8位
  52.     ledcAttachPin(3, 2);          // 将通道2与引脚3连接
  53.      //设置电机的PWM
  54.     ledcSetup(3, 10000, 8); // 设置通道3的频率为10000,分辨率8位
  55.     ledcAttachPin(4, 3);          // 将通道3与引脚4连接
  56. }

  57. void motor_left(int speed)
  58. {
  59.   ledcWrite(0, 0); // 输出PWM
  60.   ledcWrite(1, speed); // 输出PWM

  61.   ledcWrite(2, speed); // 输出PWM
  62.   ledcWrite(3, 0); // 输出PWM
  63. }
  64. void motor_right(int speed)
  65. {
  66.   ledcWrite(0, speed); // 输出PWM
  67.   ledcWrite(1, 0); // 输出PWM

  68.   ledcWrite(2, 0); // 输出PWM
  69.   ledcWrite(3, speed); // 输出PWM
  70. }

  71. //前进,速度最大256
  72. void motor_forward(int speed)
  73. {
  74.   ledcWrite(0, speed); // 输出PWM
  75.   ledcWrite(1, 0); // 输出PWM

  76.   ledcWrite(2, speed); // 输出PWM
  77.   ledcWrite(3, 0); // 输出PWM
  78. }
  79. void motor_back(int speed)
  80. {
  81.   ledcWrite(0, 0); // 输出PWM
  82.   ledcWrite(1, speed); // 输出PWM

  83.   ledcWrite(2, 0); // 输出PWM
  84.   ledcWrite(3, speed); // 输出PWM
  85. }
  86. void motor_stop()
  87. {
  88.   ledcWrite(0, 256); // 输出PWM
  89.   ledcWrite(1, 256); // 输出PWM
  90.   ledcWrite(2, 256); // 输出PWM
  91.   ledcWrite(3, 256); // 输出PWM
  92. }

  93. /*
  94. 小车控制
  95.   轻击 tap
  96.   长按 press
  97.   松开 pressup
  98. */
  99. void car_control(void)
  100. {
  101.   // 如果按下前进
  102.   if(KeyName.equals("btn-front"))
  103.   {
  104.     // 如果是长按
  105.     if(KeyValue.equals("press"))
  106.     {
  107.       //小车前进
  108.       motor_forward(100);
  109.     }   
  110.     // 如果长按松开
  111.     if(KeyValue.equals("pressup"))
  112.     {
  113.       //小车停止
  114.       motor_stop();
  115.     }
  116.   }

  117.   // 如果按下左转
  118.   if(KeyName.equals("btn-left"))
  119.   {
  120.     if(KeyValue.equals("press"))
  121.     {
  122.       motor_left(100);

  123.     }   
  124.     if(KeyValue.equals("pressup"))
  125.     {
  126.       motor_stop();
  127.     }
  128.   }  
  129.   //如果是按下右转
  130.   if(KeyName.equals("btn-right"))
  131.   {
  132.     if(KeyValue.equals("press"))
  133.     {
  134.       motor_right(100);

  135.     }   
  136.     if(KeyValue.equals("pressup"))
  137.     {
  138.       motor_stop();
  139.     }
  140.   }  
  141.   // 如果是按下后退
  142.   if(KeyName.equals("btn-back"))
  143.   {
  144.     if(KeyValue.equals("press"))
  145.     {
  146.       motor_back(100);
  147.     }   
  148.     if(KeyValue.equals("pressup"))
  149.     {
  150.       motor_stop();
  151.     }
  152.   }  
  153.   // 如果是按下停止
  154.   if(KeyName.equals("btn-stop"))
  155.   {
  156.     if(KeyValue.equals("tap"))
  157.     {
  158.       motor_stop();
  159.     }   
  160.     if(KeyValue.equals("press"))
  161.     {
  162.       motor_stop();
  163.     }   
  164.     if(KeyValue.equals("pressup"))
  165.     {
  166.       motor_stop();
  167.     }
  168.   }  
  169.   //清除字符串缓存
  170.   KeyName.remove(0);
  171.   KeyValue.remove(0);

  172. }

  173. void setup()
  174. {
  175.   // 初始化串口
  176.   Serial.begin(115200);
  177.   BLINKER_DEBUG.stream(Serial);

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

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

  182.   // 初始化有LED的IO
  183.   pinMode(48, OUTPUT);
  184.   // 点亮LED
  185.   digitalWrite(48, LOW);
  186.   //初始化电机
  187.   motor_init();

  188. }

  189. void loop()
  190. {
  191.     // 运行MQTT
  192.     Blinker.run();

  193.     // 运行小车控制
  194.     car_control();


  195.     //  局域网摄像头设置
  196.     //  if (Blinker.connected() && !setup_camera)
  197.     //  {
  198.     //      setupCamera();
  199.     //      setup_camera = true;

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

  202.     //设备延时
  203.     //Blinker.delay(500);
  204. }

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

效果