Author:wuli丶汐
专业:电信

使用微信程序控制WIFI小车之ESP8266例程:

一、控制原理原理

     **简述**利用发布订阅模式,即:利用ESP8266 订阅了一个主题,再利用app inventor 编写的app往这个主题发布消息,由于ESP8266 订阅了这个消息,所以就可以收到app发布得消息,从而执行相应得动作,比如前进\后退\左转\右转。

二、智能车组装准备

     1、esp8266开发板+CP2102 扩展板(淘宝网上一大堆,自行购买这里不做推荐啦!)2、电机驱动模块:两块2路直流电机驱动模块正反转PWM调速 双H桥步进电机迷你驱动小板。(别问为什么选它,便宜就完事了。)3、自备充电宝方便供电。4、3d打印智能车底盘

三、开发板连接


有孔的一侧为车头
左前车轮由D1,D2控制
左后车轮由D3,D4控制
右前车轮由D5,D6控制
右后车轮由D7,D8控制
具体连接方式请看图片,怕白纸树脂打印的底盘太软支撑不了才用筷子固定了一下QAQ。

四、代码例程

这里需要用到巴法云: 巴法云.
注册账号,打开控制台。具体请看图片:
下面是代码,-----------表示需要修改的部分


#include <ESP8266WiFi.h>#define TCP_SERVER_ADDR "bemfa.com" //巴法云服务器地址默认即可
#define TCP_SERVER_PORT "8344" //服务器端口,tcp创客云端口8344//********************需要修改的部分*******************//#define DEFAULT_STASSID  "--------"     //WIFI名称,区分大小写,不要写错
#define DEFAULT_STAPSW   "------------"  //WIFI密码
String UID = "------------------------------";  //用户私钥,可在控制台获取,修改为自己的UID
String TOPIC = "------";         //主题名字,可在控制台新建//**************************************************//
//最大字节数
#define MAX_PACKETSIZE 512
//设置心跳值30s
#define KEEPALIVEATIME 30*1000
//tcp客户端相关初始化,默认即可
WiFiClient TCPclient;
String TcpClient_Buff = "";//初始化字符串,用于接收服务器发来的数据
unsigned int TcpClient_BuffIndex = 0;
unsigned long TcpClient_preTick = 0;
unsigned long preHeartTick = 0;//心跳
unsigned long preTCPStartTick = 0;//连接
bool preTCPConnected = false;
//相关函数初始化
//连接WIFI
void doWiFiTick();
void startSTA();//TCP初始化连接
void doTCPClientTick();
void startTCPClient();
void sendtoTCPServer(String p);//led控制函数,具体函数内容见下方
void turnOnLed();
void turnOffLed();/**发送数据到TCP服务器*/
void sendtoTCPServer(String p){if (!TCPclient.connected()) {Serial.println("Client is not readly");return;}TCPclient.print(p);
}/**初始化和服务器建立连接
*/
void startTCPClient(){if(TCPclient.connect(TCP_SERVER_ADDR, atoi(TCP_SERVER_PORT))){Serial.print("\nConnected to server:");Serial.printf("%s:%d\r\n",TCP_SERVER_ADDR,atoi(TCP_SERVER_PORT));String tcpTemp="";  //初始化字符串tcpTemp = "cmd=1&uid="+UID+"&topic="+TOPIC+"\r\n"; //构建订阅指令sendtoTCPServer(tcpTemp); //发送订阅指令tcpTemp="";//清空/*//如果需要订阅多个主题,可再次发送订阅指令tcpTemp = "cmd=1&uid="+UID+"&topic="+主题2+"\r\n"; //构建订阅指令sendtoTCPServer(tcpTemp); //发送订阅指令tcpTemp="";//清空*/preTCPConnected = true;preHeartTick = millis();TCPclient.setNoDelay(true);}else{Serial.print("Failed connected to server:");Serial.println(TCP_SERVER_ADDR);TCPclient.stop();preTCPConnected = false;}preTCPStartTick = millis();
}/**检查数据,发送心跳
*/
void doTCPClientTick(){//检查是否断开,断开后重连if(WiFi.status() != WL_CONNECTED) return;if (!TCPclient.connected()) {//断开重连if(preTCPConnected == true){preTCPConnected = false;preTCPStartTick = millis();Serial.println();Serial.println("TCP Client disconnected.");TCPclient.stop();}else if(millis() - preTCPStartTick > 1*1000)//重新连接startTCPClient();}else{if (TCPclient.available()) {//收数据char c =TCPclient.read();TcpClient_Buff +=c;TcpClient_BuffIndex++;TcpClient_preTick = millis();if(TcpClient_BuffIndex>=MAX_PACKETSIZE - 1){TcpClient_BuffIndex = MAX_PACKETSIZE-2;TcpClient_preTick = TcpClient_preTick - 200;}preHeartTick = millis();}if(millis() - preHeartTick >= KEEPALIVEATIME){//保持心跳preHeartTick = millis();Serial.println("--Keep alive:");sendtoTCPServer("ping\r\n"); //发送心跳,指令需\r\n结尾,详见接入文档介绍}}if((TcpClient_Buff.length() >= 1) && (millis() - TcpClient_preTick>=200)){TCPclient.flush();Serial.print("Rev string: ");TcpClient_Buff.trim(); //去掉首位空格Serial.println(TcpClient_Buff); //打印接收到的消息String getTopic = "";String getMsg = "";if(TcpClient_Buff.length() > 15){//注意TcpClient_Buff只是个字符串,在上面开头做了初始化 String TcpClient_Buff = "";//此时会收到推送的指令,指令大概为 cmd=2&uid=xxx&topic=light002&msg=offint topicIndex = TcpClient_Buff.indexOf("&topic=")+7; //c语言字符串查找,查找&topic=位置,并移动7位,不懂的可百度c语言字符串查找int msgIndex = TcpClient_Buff.indexOf("&msg=");//c语言字符串查找,查找&msg=位置getTopic = TcpClient_Buff.substring(topicIndex,msgIndex);//c语言字符串截取,截取到topic,不懂的可百度c语言字符串截取getMsg = TcpClient_Buff.substring(msgIndex+5);//c语言字符串截取,截取到消息Serial.print("topic:------");Serial.println(getTopic); //打印截取到的主题值Serial.print("msg:--------");Serial.println(getMsg);   //打印截取到的消息值}if(getMsg  == "forward"){       //如果是消息==forward  forward();}else if(getMsg == "back"){ //如果是消息==back  back();}else if(getMsg == "left"){left();}else if(getMsg == "right"){right();}else if(getMsg == "stop"){Stop();}else if(getMsg == "left_loop"){left_loop();}else if(getMsg == "right_loop"){right_loop();}TcpClient_Buff="";TcpClient_BuffIndex = 0;}
}
/**初始化wifi连接
*/
void startSTA(){WiFi.disconnect();WiFi.mode(WIFI_STA);WiFi.begin(DEFAULT_STASSID, DEFAULT_STAPSW);
}/**************************************************************************WIFI
***************************************************************************/
void doWiFiTick(){static bool startSTAFlag = false;static bool taskStarted = false;static uint32_t lastWiFiCheckTick = 0;if (!startSTAFlag) {startSTAFlag = true;startSTA();}//未连接1s重连if ( WiFi.status() != WL_CONNECTED ) {if (millis() - lastWiFiCheckTick > 1000) {lastWiFiCheckTick = millis();}}//连接成功建立else {if (taskStarted == false) {taskStarted = true;Serial.print("\r\nGet IP Address: ");Serial.println(WiFi.localIP());startTCPClient();}}
}
/*设置电机初始化*/
void forward(){//小车前进Serial.println("Turn forward");digitalWrite(D1,HIGH); digitalWrite(D2,LOW); digitalWrite(D3,HIGH); digitalWrite(D4,LOW); digitalWrite(D5,HIGH); digitalWrite(D6,LOW); digitalWrite(D7,HIGH); digitalWrite(D8,LOW);
}
void back(){//小车后退Serial.println("Turn back");digitalWrite(D1,LOW); digitalWrite(D2,HIGH);digitalWrite(D3,LOW); digitalWrite(D4,HIGH); digitalWrite(D5,LOW); digitalWrite(D6,HIGH); digitalWrite(D7,LOW); digitalWrite(D8,HIGH);
}
void Stop(){Serial.println("Turn stop");digitalWrite(D1,LOW); digitalWrite(D2,LOW); digitalWrite(D3,LOW); digitalWrite(D4,LOW); digitalWrite(D5,LOW); digitalWrite(D6,LOW);digitalWrite(D7,LOW);digitalWrite(D8,LOW);
}
void left()
{    Serial.println("Turn left");digitalWrite(D1,LOW); digitalWrite(D2,HIGH); digitalWrite(D3,HIGH); digitalWrite(D4,LOW); digitalWrite(D5,HIGH);digitalWrite(D6,LOW);digitalWrite(D7,LOW); digitalWrite(D8,HIGH);
}
void right()
{Serial.println("Turn right");digitalWrite(D1,HIGH); digitalWrite(D2,LOW); digitalWrite(D3,LOW); digitalWrite(D4,HIGH);digitalWrite(D5,LOW); digitalWrite(D6,HIGH); digitalWrite(D7,HIGH);  digitalWrite(D8,LOW);
}
void right_loop()
{Serial.println("Turn right_loop");digitalWrite(D1,HIGH); digitalWrite(D2,LOW); digitalWrite(D3,HIGH); digitalWrite(D4,LOW); digitalWrite(D5,LOW); digitalWrite(D6,HIGH); digitalWrite(D7,LOW); digitalWrite(D8,HIGH);
}
void left_loop()
{Serial.println("Turn left_loop");digitalWrite(D1,LOW); digitalWrite(D2,HIGH);digitalWrite(D3,LOW); digitalWrite(D4,HIGH); digitalWrite(D5,HIGH); digitalWrite(D6,LOW); digitalWrite(D7,HIGH); digitalWrite(D8,LOW);
}
// 初始化,相当于main 函数
void setup() {Serial.begin(115200);pinMode(D1, OUTPUT);pinMode(D2, OUTPUT);pinMode(D3, OUTPUT);pinMode(D4, OUTPUT);pinMode(D5, OUTPUT);pinMode(D6, OUTPUT);pinMode(D7, OUTPUT);pinMode(D8, OUTPUT);Stop();Serial.println("start!");
}//循环
void loop() {doWiFiTick();doTCPClientTick();
}

五、微信小程序部分

首先需要拥有一个属于自己的微信小程序账号,用微信开发工具打开app.wxss文件修改数值

使用微信小程序控制ESP8266(麦克纳姆轮)智能车相关推荐

  1. arduino麦轮转弯程序_麦克纳姆轮智能小车接线方案

    折腾了好几天,实在搞不定了,决定上来社区求助. 现在的硬件情况是这样的: - HM-GM37-3429霍尔传感器大载重电机,每个电机六条线,其中电机输入两个,霍尔编码器电源两个,编码器AB相两个 - ...

  2. 麦克纳姆轮(麦轮)原理

    一.麦轮原理 麦克纳姆轮:简称麦轮,由轮毂和围绕轮毂的辊子组成. 辊子:没有动力的从动小滚轮. 麦克纳姆轮辊子轴线和轮毂轴线夹角是45度. A轮(左旋)与B轮(右旋)互为镜像关系 麦轮在车上的分布:( ...

  3. 麦克纳姆轮(万向轮)驱动和玩法

    麦克纳姆轮(万向轮)驱动和玩法 麦克纳姆轮介绍 麦克纳姆轮运动分析及方向确定 麦克纳姆轮安装组合及运动分析 分析错误例子[AAAA] 正确的麦轮分布应该是[ABBA] 麦克纳姆轮的安装位置 安装方法 ...

  4. 麦克纳姆轮小车matlab仿真,学习使用Python控制麦克纳姆轮底盘

    学习使用Python控制麦克纳姆轮底盘 这里小龟给大家分享如何使用Python控制麦克纳姆轮底盘的小龟小车. 首先小伙伴得参考小龟提供的改造手册进行先把小龟小车改造成麦克纳姆轮底盘,假如小伙伴在改造过 ...

  5. 【麦克纳姆轮(万向轮)驱动原理及安装方法】

    转载自:https://blog.csdn.net/qq_40374812/article/details/117337556 麦克纳姆轮(万向轮)驱动和玩法 麦克纳姆轮介绍 麦克纳姆轮运动分析及方向 ...

  6. 【微信小程序控制硬件③】 从软件到硬件搭建一个微信小程序控制esp8266的项目,自定义通讯协议,为面试职位和比赛项目加分!

    微信物联网生态主要分在微信硬件开发平台与腾讯物联开发平台,前者已经停止维护,但依然有着很大的学习价值,而后者作为主推的平台,集成很多功能,包括从微信小程序实现配网到控制: 为了兼顾更多的朋友和自己的学 ...

  7. (开源)微信小程序控制esp8266

    微信小程序控制esp8266 第一.远程App控制或手动控制 下载esp8266示例程序 第二.微信小程序开发 流程说明:首先要使esp8266能够联网,能联网就可以控制,使用示例程序,修改WIFI. ...

  8. 基于 RT-Thread的麦克纳姆轮小车循迹运动控制算法开发和研究

    学校:浙江工业大学 队伍名称:浙工大鸿泉全向 SOLO 队参赛队员:杨一帆.袁启恒.何志涛 带队教师:陈国定.褚衍清 简 介: 本文详细介绍了全向行进组智能车的制作方案.该方案以南京沁恒公司的 CH3 ...

  9. 麦克纳姆轮运动原理_麦克纳姆轮介绍

    先看个大号Mecanum轮的应用图 "第一部分:Mecanum轮是什么麦克纳姆轮最早是美国麦克纳姆公司为了在航母上移动物资的机器人而设计的全方位移动轮子,相对全向轮来说,麦轮可以通过其转速和 ...

  10. 麦克纳姆轮全向移动机器人运动模型规律分析

    关注同名微信公众号"混沌无形",有趣好文! 原文链接:https://mp.weixin.qq.com/s/GWhlXsuY6QYyoZydaSYpjQ(包含原文PDF百度云下载链 ...

最新文章

  1. 眼界大开 声临其境丨胡宜峰:视频深度伪造检测技术在内容安全领域的探索与实践
  2. linux根文件系统创建过程
  3. ROS获取KinectV2相机的彩色图和深度图并制作bundlefusion需要的数据集
  4. Springboot(十):邮件服务
  5. [设计模式] ------ 装饰模式
  6. 盘口的买一是卖股票还是买股票?
  7. shell 脚本执行报错/bin/bash^M: bad interpreter: No such file or directory
  8. cisco fabricpath 功能介绍
  9. idea git push 码云: Remote: [31mYou do not have permission to push to the repository via HTTPS
  10. 深度学习计算框架综述(一)行业内计算框架总览
  11. PymuPDF实现PDF文字和图片的修改
  12. 若依前后端分离密码修改成功,登录提示用户名或密码不正确。
  13. 运动用什么听歌好,推荐运动骨传导耳机
  14. python爬虫实战--爬取猫眼专业版-实时票房
  15. PHP开发基于Mirai的QQ机器人
  16. HTML及css疑问解答题前端面试题
  17. 2008服务器系统ie,windows server 2008 IE增强的安全配置关闭方法
  18. UILabel添加下划线
  19. 找到了腾讯云代金券两个领取入口(太值了)
  20. vue双向绑定经典案例

热门文章

  1. Learning to Detect A Salient Object (学习探测显著性物体)
  2. pmp-相关方权利/利益方格
  3. 高通WCD9370音频编解码器模块芯片介绍
  4. Dubbo Spring Cloud 逆向分析服务注册事件变化的处理过程
  5. html实现圈内特效
  6. php html5 播放器,html5实现完美兼容各大浏览器的播放器_html5教程技巧
  7. Unity高级知识点总结:性能优化与图形渲染进阶!
  8. 动态和静态查看一个进程的内存使用
  9. ​2 万字系统总结,带你实现 Linux 命令自由!
  10. JavaScript 实现汉字按拼音首字母分组拼序