整体思路ESP8266作为TCP服务器,,手机作为TCP客户端,自己使用Lua直接做到了芯片里面,省了单片机,,节约成本,其实本来就是个单片机(感觉Lua开发8266真的很好,甩AT指令好几条街,,而且很容易上手,),不过呢,等几天我也会做一个51用AT指令的.....强烈建议学习使用Lua开发8266,不要偷懒.....如果谁说难我是不信,,那是因为没有认真去学....下面我会讲的很详细,,,,,让亲们感受一下Lua到底难不难......

因为最近看到朋友遇到各种各样的问题,,我会把遇到的问题统统说一下,,,,,,,

手机界面上放置四个按钮,代表前进,后退,左转,和右转,,,另外呢利用手机的重力感应传感器通过手机的倾斜角度控制小车的速度

前进,后退,左转,右转分别控制ESP8266的一个引脚,,,,速度数据呢是控制ESP8266一个引脚的PWM的占空比

连接

关于板子的引脚

如果发现轮子转的方向不对自己可以调换一下线哈,,,,,,,,,,

现在做ESP8266部分

第一件事情是刷固件

固件的自己可以去下载

官网下载地址

https://nodemcu-build.com/

如果自己不想自己去下载或者说不愿意去尝试,那么可以下载我自己下载好的,,,,,每一次改变总需要一个开始......希望亲们自己去官网下载

链接:http://pan.baidu.com/s/1jICE1GM 密码:qn69

对了还有Lua开发的API文档

https://nodemcu.readthedocs.io/en/master/en/modules/gpio/

还有一个简洁版的API资料

链接:http://pan.baidu.com/s/1pL3FHgf 密码:l2nm

再者呢!有些时候需要写Lua语言自带的API函数

链接:http://pan.baidu.com/s/1pLjycR5 密码:qxk8

还有一个简洁版的

链接:http://pan.baidu.com/s/1o8T1nU6 密码:eglx

其实我也写了Lua的入门教程,,很多人都抱怨难难难,,现在自己用Lua开发却是得心应手,,正是之前所做过的那些努力,,当时也没人教自己,要知道自己花了1个多月才摸索到入门的,只感叹没有遇到引导者.....现在只想让别人不再走这么多的弯路,,,简直是煎熬......现在看来Lua开发8266真心不难....但是总需要经历一下过程........最起码最基本的语法还是要懂得吧.......其实只要知道语法,变量也就够了.....其余的就是调用调用

都不用选

然后就会出现下面的界面,,等着哈

选中地址下载就行

烧写固件的软件(一)

链接: http://pan.baidu.com/s/1cpnbVw 密码:2nha

烧写固件的软件(二)

链接:http://pan.baidu.com/s/1boBW4N1 密码:88my

无论哪一个软件,模块的接线都一样

GPIO0 默认是工作模式(不接线)。如果接了低电平就是下载模式(给模块刷固件!!)所以接低电平。CH_PD接高电平,其余除了TX,RX外可以不接线..

其实在模块上电的时候如果GPIO0是低电平那么模块就工作在等待刷固件模式,,,在模块上电的时候如果GPIO0是高电平那么模块就工作在正常工作模式,由于没有按键什么的,所以可以先接好线再上电

先用第一个软件刷固件

选中,,地址是0000

然后呢

然后,复位一下

看一下真实的连接

我的手机镜头晚上拍照感觉有一层东西...........

好了

现在看用第二个软件刷固件

选择固件

给大家各种模块的Flash大小的表

http://wiki.ai-thinker.com/_media/esp8266/esp8266_module_list.png

接上跳线帽,,然后,复位一下

好了

对了可能出现

这呢是串口模块和WIFI模块通信不稳定导致的,,,自己用ch340就出现过这种情况,,,,但是用pl2303就没有出现过,,,,对于这种情况,我感觉第一有条件可以换一个串口模块,比如pl2303,或者CP2102等等...再者呢可以选择好的杜邦线,,尽量短......

不过呢,,用pl2303下载好以后,,用ch340也可以了...............

对了也可以尝试

把这里改小一点

感觉只要不通信那么多数据,,也能减少出错的机会

现在用串口助手看一下

软件

链接:http://pan.baidu.com/s/1qYqh9O4 密码:ddva

如果出现--正在格式化文件系统就等着哈,,

大约不到一分钟

用Lua开发8622用这个软件

http://pan.baidu.com/s/1kVN09cr  密码:pfv7

如果点击的时候提示安装,,安装就行,,如果没有提示呢可以,按照下面链接的提示自己安装哈,,,,,或者自己百度

http://jingyan.baidu.com/article/3c343ff70bc6ea0d377963df.html

最新版本只有64位的

现在新建一个init.lua

如果出现

然后写上

gpio.write(8,0)
gpio.write(7,0)
gpio.write(6,0)
gpio.write(5,0)
gpio.mode(8,gpio.OUTPUT)--cs--
gpio.mode(7,gpio.OUTPUT)--mosi--
gpio.mode(6,gpio.OUTPUT)--miso--
gpio.mode(5,gpio.OUTPUT)--clk--pwm.setup(4, 1000, 500)
pwm.start(4)

一上电都是低电平保证不让小车动....

对了想控制GPIO15其实是写的

下面是对应关系

我是把8266的SPI引脚引出来了,不过呢,只是当普通引脚使用

想了解SPI可以看这篇文章

http://www.cnblogs.com/yangfengwu/p/7524297.html

现在看控制速度的PWM引脚

感觉初始化的时候,占空比应该为0(一直是低电平),这样的话小车保证不会动

大家看后面注释一定能看明白..........而且还有例子..........

如果出现

可以先复位一下然后再执行操

对了要是经常出现编译或者下载到模块出问题.........一定是串口模块和WIFI模块通信之间有问题.....尽量使用好的杜邦线,,,尽量短,,,,,再者可以考虑换成pl2303或者CP2102等.......因为自己测试的这两种模块比较可靠

因为GPIO2是WIFI模块上面的灯,,由于执行了PWM所以会看到这个这个灯微弱的发光

现在再新建一个wifi.lua

把下面的代码复制粘贴过去

详细可以参考我的这几篇(由于有些朋友说还是不够详细,,,,后期这几篇我会再在里面详细添加内容)

看完这几篇开发8266一定会让您感觉有了新的突破

一   http://www.cnblogs.com/yangfengwu/p/7514336.html      下载自己选择功能的固件,刷固件,写LUA的软件

二    http://www.cnblogs.com/yangfengwu/p/7520260.html     GPIO,串口,注意事项,空闲中断

三    http://www.cnblogs.com/yangfengwu/p/7524297.html      SPI通信介绍,,STM32 SPI 从机

四    http://www.cnblogs.com/yangfengwu/p/7524326.html      TCP服务器,单个连接

五    http://www.cnblogs.com/yangfengwu/p/7531730.html      TCP服务器,多个客户端连接,CRC校验

六    http://www.cnblogs.com/yangfengwu/p/7533302.html       TCP Client 断开自动重连,AD采集

七    http://www.cnblogs.com/yangfengwu/p/7533845.html      UDP支持一路默认,3路动态连接,ssid 与 pwd 的读取

八    http://www.cnblogs.com/yangfengwu/p/7534521.html       ESP8266 文件保存数据(基于Lua脚本语言)

wifi.setmode(wifi.STATIONAP)cfg={}
cfg.ssid="Hellow8266"
cfg.pwd="11223344"
wifi.ap.config(cfg)apcfg={}
apcfg.ssid="qqqqq"
apcfg.pwd="11223344"
wifi.sta.config(apcfg)
wifi.sta.connect()TCPSever=net.createServer(net.TCP,28800) TcpConnectCnt = 0
TcpSocketTable={}
NowSocket=nil
TCPSever:listen(8080,function(socket) if  TcpConnectCnt == 4 thenif  TcpSocketTable[0] ~= nil then TcpSocketTable[0]:close()TcpSocketTable[0] = nilend    elseif  TcpSocketTable[TcpConnectCnt+1] ~= nil then TcpSocketTable[TcpConnectCnt+1]:close()TcpSocketTable[TcpConnectCnt+1] = nilend endTcpSocketTable[TcpConnectCnt] = socketprint(TcpConnectCnt.."-Connect")TcpConnectCnt = TcpConnectCnt + 1if  TcpConnectCnt == 5 thenTcpConnectCnt = 0endsocket:on("receive",function(socket,data) NowSocket = socketuart.write(0,data) control(data)end) socket:on("disconnection",function(sck,c) for i=0,4 doif  TcpSocketTable[i] == sck thenTcpSocketTable[i] = nilprint(i.."-Disconnect")endendend)end)function control(data)  local RevLen = string.len (data)--[[local i; local datatable={};for  i=1,RevLen dodatatable[i] = data:byte(i);endprint(CRC16Flage(datatable,6))]]local crc = ow.crc16(string.sub(data,1,RevLen-2))local recrc = data:byte(RevLen)local recrc = recrc*256local recrc = recrc + data:byte(RevLen-1)if  crc == recrc thenif  RevLen == 6 thenif  data:byte(1) == 0xAA and data:byte(2) == 0x55 thenstopcar = 0;if  data:byte(3) == 0x01 then--forwardgpio.write(8,1)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,1)--you qiangpio.write(5,0)--you hou--print("forward")endif  data:byte(3) == 0x02 then--backgpio.write(8,0)--zuo qiangpio.write(7,1)--zuo hougpio.write(6,0)--you qiangpio.write(5,1)--you hou--print("back")endif  data:byte(3) == 0x03 then--rightgpio.write(8,1)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,0)--you qiangpio.write(5,1)--you hou--print("right")endif  data:byte(3) == 0x04 then--leftgpio.write(8,0)--zuo qiangpio.write(7,1)--zuo hougpio.write(6,1)--you qiangpio.write(5,0)--you hou--print("left")endif  data:byte(3) == 0x05 then--stopgpio.write(8,0)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,0)--you qiangpio.write(5,0)--you hou--print("stop")endpwm.setduty(4, data:byte(4)*10)endendelseif  NowSocket ~= nil then--NowSocket:send("CRC16 Faild")NowSocket = nilend   end
end  stopcar = 0;
tmr.alarm(1, 100, 1, function()stopcar = stopcar + 1;if  stopcar>3 thenstopcar = 3;gpio.write(8,0)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,0)--you qiangpio.write(5,0)--you houend
end)--计算CRC
function  CRC16(modbusdata,length)local i=0;local j=0;local crc=0;local k=1;local l=1;for k=1 ,length docrc = bit.bxor(crc,modbusdata[k])for l=1,8 doif  bit.band(crc,1) == 1 thencrc = bit.rshift(crc,1);crc = bit.bxor(crc,0xa001);elsecrc = bit.rshift(crc,1);endendendreturn crc;
endfunction CRC16Flage(modbusdata,length)local Receive_CRC = 0;local calculation = 1;Receive_CRC = CRC16(modbusdata,length-2)calculation = modbusdata[length];calculation = calculation * 256;calculation = calculation + modbusdata[length-1];if  Receive_CRC == calculation thenreturn 1;elsereturn 0;    end
enduart.on("data",0,function(data) for i=0,4 doif  TcpSocketTable[i] ~= nil thenTcpSocketTable[i]:send(data)endendend, 0)printip = 0
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)printip = 0
end)wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)if printip == 0 thenprint("+IP"..T.IP)endprintip = 1
end)

用uart.write(0,data),,和print(data)的区别在于uart就相当于咱们单片机常用的串口发送.....而print相当于printf

而且这个print呢默认是遇到'\0'就把这之前的数据发到串口,,所以呢有时候您定义的数据如果有'0',,,,那么这个'0'后面的数据就发不过去了........

有些人会问,为什么要这样做呢,,,函数为什么是这样....当然是看的API文档啦

API函数很多,,其实无论做什么东西您一定要知道自己想做什么东西,,需要什么功能,然后根据这些去找符合自己需求的API,自己心中一定要有数,,无论做什么东西都是这样...一定是自己先全方面的把握好整体,,然后再进行拆分成各个模块,然后再进行组合..............

所以自己做东西前一些天自己进度很慢很慢,我会考虑哪些模块自己并不会,但是一定会用到,我就会先攻克这块,一定是先把自己不懂或者不会的解决掉,因为如果不解决掉,这一块如果牵扯到别的模块就麻烦了....然后感觉可以了呢!就再花些时间整合一下系统,,,再考虑考虑整个系统所涉及的地方,,可能遇到的问题,尽量杀死在摇篮里面....然后呢就把整个系统做一下拆分,,,如何拆分就看自己的了,经验越多越拆分的合理......感觉可以了,,,开始干了,前期的投入就会发现大有成效,后期会节省很多时间........

很多人问我辞职原因:在我手里做的东西首先要让自己认可,解决当前的问题并不是我为了炫耀什么,这是我自己做东西的底线,我一直相信办法总比困难多,我要的是合作伙伴;我虽然都是自学的,但是我才会对整个系统把握的更好,因为我总是在做整个系统的东西;我从来不会拿公司项目开玩笑,我说在规定时间内能完成就绝对能完成;我要的是做好;解决一个技术难题我认为是自己应该做的,但绝对不会误期,因为如果我觉得会超过时间,我也就不会现在去解决了,我就会留到以后了;

解决的问题 :

http://www.cnblogs.com/yangfengwu/p/6870331.html

看看程序看一看哪里有不会的就赶紧去查资料哈......QQ号和群都在上面显示着呢

其实呢官方只是提供了这些API函数,,,具体里面实现什么具体功能就看自己的了......

现在看数据处理函数

function control(data)  local RevLen = string.len (data)--[[local i; local datatable={};for  i=1,RevLen dodatatable[i] = data:byte(i);endprint(CRC16Flage(datatable,6))]]local crc = ow.crc16(string.sub(data,1,RevLen-2))local recrc = data:byte(RevLen)recrc = recrc*256recrc = recrc + data:byte(RevLen-1)if  crc == recrc thenif  RevLen == 6 thenif  data:byte(1) == 0xAA and data:byte(2) == 0x55 thenstopcar = 0;if  data:byte(3) == 0x01 then--forwardgpio.write(8,1)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,1)--you qiangpio.write(5,0)--you hou--print("forward")endif  data:byte(3) == 0x02 then--backgpio.write(8,0)--zuo qiangpio.write(7,1)--zuo hougpio.write(6,0)--you qiangpio.write(5,1)--you hou--print("back")endif  data:byte(3) == 0x03 then--rightgpio.write(8,1)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,0)--you qiangpio.write(5,1)--you hou--print("right")endif  data:byte(3) == 0x04 then--leftgpio.write(8,0)--zuo qiangpio.write(7,1)--zuo hougpio.write(6,1)--you qiangpio.write(5,0)--you hou--print("left")endif  data:byte(3) == 0x05 then--stopgpio.write(8,0)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,0)--you qiangpio.write(5,0)--you hou--print("stop")endpwm.setduty(4, data:byte(4)*10)endendelseif  NowSocket ~= nil then--NowSocket:send("CRC16 Faild")NowSocket = nilend   end
end 

我规定的

前进  0xAA,0x55,0x01,((传过来的数0-100,根据手机倾斜角度)速度PWM),CRC16低位,CRC16高位

后退  0xAA,0x55,0x02,((传过来的数0-100,根据手机倾斜角度)速度PWM),CRC16低位,CRC16高位

右转  0xAA,0x55,0x03,((传过来的数0-100,根据手机倾斜角度)速度PWM),CRC16低位,CRC16高位

左转  0xAA,0x55,0x04,((传过来的数0-100根据手机倾斜角度)速度PWM),CRC16低位,CRC16高位

停止  0xAA,0x55,0x05,((0)速度PWM),CRC16低位,CRC16高位

所以现在看一下

下面是自己写的CRC16校验,,对于不是提供了CRC16校验了,为什么还要自己写,...看下面哈

--计算CRC
function  CRC16(modbusdata,length)local i=0;local j=0;local crc=0;local k=1;local l=1;for k=1 ,length docrc = bit.bxor(crc,modbusdata[k])for l=1,8 doif  bit.band(crc,1) == 1 thencrc = bit.rshift(crc,1);crc = bit.bxor(crc,0xa001);elsecrc = bit.rshift(crc,1);endendendreturn crc;
endfunction CRC16Flage(modbusdata,length)//这个呢为了检测数据方便直接把数据往里面一丢,直接判断返回的如果是1说明crc正确,,否则0错误local Receive_CRC = 0;local calculation = 1;Receive_CRC = CRC16(modbusdata,length-2)calculation = modbusdata[length];calculation = calculation * 256;calculation = calculation + modbusdata[length-1];if  Receive_CRC == calculation thenreturn 1;elsereturn 0;    end
end

下面还有android的呢!!算法都一样,,,只不过会告诉亲们注意的问题

我重新把wifi,lua贴一下

wifi.setmode(wifi.STATIONAP)cfg={}
cfg.ssid="Hellow8266"
cfg.pwd="11223344"
wifi.ap.config(cfg)apcfg={}
apcfg.ssid="qqqqq"
apcfg.pwd="11223344"
wifi.sta.config(apcfg)
wifi.sta.connect()TCPSever=net.createServer(net.TCP,28800) TcpConnectCnt = 0
TcpSocketTable={}
NowSocket=nil
TCPSever:listen(8080,function(socket) if  TcpConnectCnt == 4 thenif  TcpSocketTable[0] ~= nil then TcpSocketTable[0]:close()TcpSocketTable[0] = nilend    elseif  TcpSocketTable[TcpConnectCnt+1] ~= nil then TcpSocketTable[TcpConnectCnt+1]:close()TcpSocketTable[TcpConnectCnt+1] = nilend endTcpSocketTable[TcpConnectCnt] = socketprint(TcpConnectCnt.."-Connect")TcpConnectCnt = TcpConnectCnt + 1if  TcpConnectCnt == 5 thenTcpConnectCnt = 0endsocket:on("receive",function(socket,data) NowSocket = socketuart.write(0,data) control(data)end) socket:on("disconnection",function(sck,c) for i=0,4 doif  TcpSocketTable[i] == sck thenTcpSocketTable[i] = nilprint(i.."-Disconnect")endendend)end)function control(data)  local RevLen = string.len (data)--[[local i; local datatable={};for  i=1,RevLen dodatatable[i] = data:byte(i);endprint(CRC16Flage(datatable,6))]]local crc = ow.crc16(string.sub(data,1,RevLen-2))local recrc = data:byte(RevLen)recrc = recrc*256recrc = recrc + data:byte(RevLen-1)if  crc == recrc thenif  RevLen == 6 thenif  data:byte(1) == 0xAA and data:byte(2) == 0x55 thenstopcar = 0;if  data:byte(3) == 0x01 then--forwardgpio.write(8,1)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,1)--you qiangpio.write(5,0)--you hou--print("forward")endif  data:byte(3) == 0x02 then--backgpio.write(8,0)--zuo qiangpio.write(7,1)--zuo hougpio.write(6,0)--you qiangpio.write(5,1)--you hou--print("back")endif  data:byte(3) == 0x03 then--rightgpio.write(8,1)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,0)--you qiangpio.write(5,1)--you hou--print("right")endif  data:byte(3) == 0x04 then--leftgpio.write(8,0)--zuo qiangpio.write(7,1)--zuo hougpio.write(6,1)--you qiangpio.write(5,0)--you hou--print("left")endif  data:byte(3) == 0x05 then--stopgpio.write(8,0)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,0)--you qiangpio.write(5,0)--you hou--print("stop")endpwm.setduty(4, data:byte(4)*10)endendelseif  NowSocket ~= nil then--NowSocket:send("CRC16 Faild")NowSocket = nilend   end
end  stopcar = 0;
tmr.alarm(1, 100, 1, function()stopcar = stopcar + 1;if  stopcar>3 thenstopcar = 3;gpio.write(8,0)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,0)--you qiangpio.write(5,0)--you houend
end)--计算CRC
function  CRC16(modbusdata,length)local i=0;local j=0;local crc=0;local k=1;local l=1;for k=1 ,length docrc = bit.bxor(crc,modbusdata[k])for l=1,8 doif  bit.band(crc,1) == 1 thencrc = bit.rshift(crc,1);crc = bit.bxor(crc,0xa001);elsecrc = bit.rshift(crc,1);endendendreturn crc;
endfunction CRC16Flage(modbusdata,length)local Receive_CRC = 0;local calculation = 1;Receive_CRC = CRC16(modbusdata,length-2)calculation = modbusdata[length];calculation = calculation * 256;calculation = calculation + modbusdata[length-1];if  Receive_CRC == calculation thenreturn 1;elsereturn 0;    end
enduart.on("data",0,function(data) for i=0,4 doif  TcpSocketTable[i] ~= nil thenTcpSocketTable[i]:send(data)endendend, 0)printip = 0
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)printip = 0
end)wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)if printip == 0 thenprint("+IP"..T.IP)endprintip = 1
end)

如果出现

复位一下,然后再

如果出现

其实也是

对了要是经常出现编译或者下载到模块出问题.........一定是串口模块和WIFI模块通信之间有问题.....尽量使用好的杜邦线,,,尽量短,,,,,再者可以考虑换成pl2303或者CP2102等.......因为自己测试的这两种模块比较可靠

其实也可以复位一下再

对了开头就说模块默认上电是执行init.lua,所以呢需要在init.lua中调用wifi.lua

现在的init.lua变为

gpio.write(8,0)
gpio.write(7,0)
gpio.write(6,0)
gpio.write(5,0)
gpio.mode(8,gpio.OUTPUT)--cs--
gpio.mode(7,gpio.OUTPUT)--mosi--
gpio.mode(6,gpio.OUTPUT)--miso--
gpio.mode(5,gpio.OUTPUT)--clk--pwm.setup(4, 1000, 500)
pwm.start(4)tmr.alarm(0, 2000, 0, function()dofile("wifi.lua")
end)

复位一下

现在打开手机看一下已经有了WiFi的无线了....连接它,,密码是程序中设置的11223344

APP软件链接

链接:http://pan.baidu.com/s/1miBo3e4 密码:88lr

现在您就可以控制自己的小车了..........

不过这样连接会发现有问题......一上电轮子会转一下再停...........

原因是PWM的引脚接的是Wifi模块灯上的引脚,而且呢灯的负极是接到WiFi模块的......所以一上电PWM会是一个高点的电平...........

再看第二个原因,,,会发现为什么只有左轮转......右轮为什么不转呢.........

那是由于其实一开始都应该是高电平...但是CS引脚拉低了........造成了左前(低),左后(高),右前(高),右后(高)....所以左轮就倒转了............

知道了原因,,就好解决问题了.....

第一种方案,,,把PWM(GPIO2)换成左前CS(GPIO15)引脚,,,因为一上电是低电平所以由于没有PWM,,绝对不会转,,改一下程序,,换一下引脚

第二种方案自己再用一个10K的电阻也把左后(MOSI,GPIO13)拉低,,,,,最简单的方案

第三种方案,,自己板子上有一个继电器,,可以先把PWM(GPIO2)接到继电器的输出COM端,然后把继电器的常开触点接到L298N的PWM控制引脚,,在程序里呢先控制控制方向的引脚输出低电平,然后再设置好PWM,然后再控制继电器吸合,,,因为按下复位后,控制继电器的引脚没有那个能力驱动继电器了....就会断开PWM,,,所以轮子也不会转

我们采用第一种方案,修改的地方最多的方案,,,要不怕麻烦,这样才会学的更多,理解的更深刻,,这篇博客现在已经用了快2天的时间了,边写边测试,希望自己能够遇到所有的问题

换一下连接

好现在的init.lua

--gpio.write(8,0)
gpio.write(4,0)
gpio.write(7,0)
gpio.write(6,0)
gpio.write(5,0)
--gpio.mode(8,gpio.OUTPUT)--cs--
gpio.mode(4,gpio.OUTPUT)--cs--
gpio.mode(7,gpio.OUTPUT)--mosi--
gpio.mode(6,gpio.OUTPUT)--miso--
gpio.mode(5,gpio.OUTPUT)--clk--pwm.setup(8, 1000, 0)
pwm.start(8)tmr.alarm(0, 2000, 0, function()dofile("wifi.lua")
end)

wifi.lua

wifi.setmode(wifi.STATIONAP)cfg={}
cfg.ssid="Hellow8266"
cfg.pwd="11223344"
wifi.ap.config(cfg)apcfg={}
apcfg.ssid="qqqqq"
apcfg.pwd="11223344"
wifi.sta.config(apcfg)
wifi.sta.connect()TCPSever=net.createServer(net.TCP,28800) TcpConnectCnt = 0
TcpSocketTable={}
NowSocket=nil
TCPSever:listen(8080,function(socket) if  TcpConnectCnt == 4 thenif  TcpSocketTable[0] ~= nil then TcpSocketTable[0]:close()TcpSocketTable[0] = nilend    elseif  TcpSocketTable[TcpConnectCnt+1] ~= nil then TcpSocketTable[TcpConnectCnt+1]:close()TcpSocketTable[TcpConnectCnt+1] = nilend endTcpSocketTable[TcpConnectCnt] = socketprint(TcpConnectCnt.."-Connect")TcpConnectCnt = TcpConnectCnt + 1if  TcpConnectCnt == 5 thenTcpConnectCnt = 0endsocket:on("receive",function(socket,data) NowSocket = socketuart.write(0,data) control(data)end) socket:on("disconnection",function(sck,c) for i=0,4 doif  TcpSocketTable[i] == sck thenTcpSocketTable[i] = nilprint(i.."-Disconnect")endendend)end)function control(data)  local RevLen = string.len (data)--[[local i; local datatable={};for  i=1,RevLen dodatatable[i] = data:byte(i);endprint(CRC16Flage(datatable,6))]]local crc = ow.crc16(string.sub(data,1,RevLen-2))local recrc = data:byte(RevLen)recrc = recrc*256recrc = recrc + data:byte(RevLen-1)if  crc == recrc thenif  RevLen == 6 thenif  data:byte(1) == 0xAA and data:byte(2) == 0x55 thenstopcar = 0;if  data:byte(3) == 0x01 then--forwardgpio.write(4,1)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,1)--you qiangpio.write(5,0)--you hou--print("forward")endif  data:byte(3) == 0x02 then--backgpio.write(4,0)--zuo qiangpio.write(7,1)--zuo hougpio.write(6,0)--you qiangpio.write(5,1)--you hou--print("back")endif  data:byte(3) == 0x03 then--rightgpio.write(4,1)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,0)--you qiangpio.write(5,1)--you hou--print("right")endif  data:byte(3) == 0x04 then--leftgpio.write(4,0)--zuo qiangpio.write(7,1)--zuo hougpio.write(6,1)--you qiangpio.write(5,0)--you hou--print("left")endif  data:byte(3) == 0x05 then--stopgpio.write(4,0)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,0)--you qiangpio.write(5,0)--you hou--print("stop")endpwm.setduty(8, data:byte(4)*10)endendelseif  NowSocket ~= nil then--NowSocket:send("CRC16 Faild")NowSocket = nilend   end
end  stopcar = 0;
tmr.alarm(1, 100, 1, function()stopcar = stopcar + 1;if  stopcar>3 thenstopcar = 3;gpio.write(4,0)--zuo qiangpio.write(7,0)--zuo hougpio.write(6,0)--you qiangpio.write(5,0)--you houend
end)--计算CRC
function  CRC16(modbusdata,length)local i=0;local j=0;local crc=0;local k=1;local l=1;for k=1 ,length docrc = bit.bxor(crc,modbusdata[k])for l=1,8 doif  bit.band(crc,1) == 1 thencrc = bit.rshift(crc,1);crc = bit.bxor(crc,0xa001);elsecrc = bit.rshift(crc,1);endendendreturn crc;
endfunction CRC16Flage(modbusdata,length)local Receive_CRC = 0;local calculation = 1;Receive_CRC = CRC16(modbusdata,length-2)calculation = modbusdata[length];calculation = calculation * 256;calculation = calculation + modbusdata[length-1];if  Receive_CRC == calculation thenreturn 1;elsereturn 0;    end
enduart.on("data",0,function(data) for i=0,4 doif  TcpSocketTable[i] ~= nil thenTcpSocketTable[i]:send(data)endendend, 0)printip = 0
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)printip = 0
end)wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)if printip == 0 thenprint("+IP"..T.IP)endprintip = 1
end)

先下载wifi.lua哈,,,因为init.lua是调用wifi.lua,,,如果不先下载wifi.lua就会调用报错.....

如果出现

可以先把wifi模块里面的init.lua移除掉或者全部文件移除掉...再编译下载wifi.lua

方法是

先编译一个小的文件,,我们的init比较小

然后看右边

我们把init.lua移除,,,注意哈是事先准备好,然后复位一下模块然后再点击

然后再复位一下模块看看

现在重新下载wifi.lua把

我都是复位,,停1s左右编译,,,,然后复位,,停1s左右下载

如果还有问题可以考虑把所有文件移除掉

复位后再点击哈...因为一开始上电趁模块还没操作影响下载的程序时才可以哈......点击后需要等5~6秒哈......然后再复位一下模块,然后重新下载吧

好了底层做好了...现在做手机APP,我需要关一下电脑,,,工作时间太长,,有点卡.....这篇文章也写得够多的了,,我单独写一篇文章介绍APP

链接:http://www.cnblogs.com/yangfengwu/p/7633980.html

先奉上实物链接,APP源码链接

https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-15892851284.24.40c1a34cvT6L6W&id=559542734694

用ESP8266+android,制作自己的WIFI小车(ESP8266篇)相关推荐

  1. WIFI小车APP远程控制,无线智能小车之ESP8266例程

    WIFI小车无线远程控制,智能小车之ESP8266例程 第一.原理讲解 第二.小车改装 第三. ESP8266 例程代码 第四.WIFI配网 程序测试 第五.安卓app制作 第一.原理讲解 原理简述: ...

  2. android之WIFI小车编程详述

    有了前几篇wifi模块eps8266的使用,单片机设置eps8266程序,android TCP客户端,现在就做一个wifi小车 先上图 小车是四个轮子的,每个轮子上都有电机驱动,前进后退的时候四个轮 ...

  3. esp8266 蓝牙耳机_走进物联网智能家居-手把手带你制作wifi智能开关-ESP8266学习笔记(二)...

    走进物联网智能家居-手把手带你制作wifi智能开关-ESP8266学习笔记(二) 2020-05-09 13:44:11 9点赞 72收藏 6评论 小编注:此篇文章来自即可瓜分10万金币,周边好礼达标 ...

  4. (含代码)ESP8266+舵机 制作wifi灯控开关(arduino,点灯科技,小爱同学/天猫精灵实现)

    目录 项目涉及的主代码 前言 一.环境搭建 二.开发步骤 1.注册点灯科技平台 2.在点灯科技平台注册设备,获取Secret Key 3.在Arduino IDE中编写代码,写入ESP8266 4.编 ...

  5. Android KitKat 4.4 Wifi移植AP模式和网络共享的调试日志

    Tethering技术在移动平台上已经运用的越来越广泛了.它能够把移动设备当做一个接入点,其它的设备能够通过Wi-Fi.USB或是Bluetooth等方式连接到此移动设备.在Android中能够将Wi ...

  6. 物联网系列之WIFI模块ESP8266一介绍

    内容 Change history 内容 1        前言 1.1        目的 2        计划 2.1        测试环境 2.2        计划 3        行动 ...

  7. 基于Android studio设计的APP通过esp8266在AP模式下控制STM32单片机LED灯

    一.单片机硬件:mini板f103rct6. 显示屏TFT2.8寸.wifi模块esp8266(正点原子旗舰店购买) 关键代码: 模块AT指令配置进入ap模式: 相应的指令执行: 软件Android ...

  8. Android删除系统的WIFI功能

    1.要root手机 2.安装re管理器 3.进入手机内存/system/bin/wpa_supplicant(文件无后缀). 4.re管理器改成读写模式后,   修改wpa_supplicant文件, ...

  9. 玩转树莓派---详解树莓派的系统烧录,基础使用及基于树莓派制作手势控制的小车(附详细代码及演示效果)

    目录 一.写在前面 二.系统实现: Author:qyan.li Date:2022.6.10 Topic:详解树莓派的使用及基于树莓派制作手势控制的小车 Reference:如何给树莓派安装操作系统 ...

最新文章

  1. 华东师范大学计算机学院陈蕾,华东师范大学计算机科学与技术学院——幸福e+工作室揭牌仪式暨名家讲座圆满举办...
  2. 第01章_数据库概述
  3. 5、JavaScript进阶篇②——函数、事件、内置对象
  4. 结合不同的模型进行集成学习
  5. 皮一皮:成人世界的潜台词...
  6. WIN10安装scrapy/channels等不成功的解决方式
  7. c++学习笔记之构造函数
  8. ITK:创建矢量图像
  9. ftp服务器在linux中安装
  10. emlog和typecho文章采集插件-简数第三方数据采集
  11. 计算机网络,IP地址概念及IP地址详细分类介绍、及子网掩码详细介绍MAC地址介绍、网络位,主机位、网络地址、广播地址。
  12. 财务自由,一年赚500万,依然做社畜是什么感觉?
  13. fatal error: hb.h: 没有那个文件或目录
  14. 自由手写体字帖pdf_20款漂亮的手写字体,可供下载
  15. 计算机键盘正确指法操作方法,键盘指法,图文详解键盘指法练习方法
  16. G16C如何切换语言,怎样使用 WinCC (TIA 博途) 实现在 SIMATIC HMI 面板中语言切换功能?...
  17. JS 更合理的随机分组
  18. PDH性能测试之五--待续
  19. ORA-01438:value larger than specified precision allowed for this column
  20. 360路由器故障显示DNS服务器,360安全路由器dns异常解决方法

热门文章

  1. http://www.360doc.com/content/16/0711/13/2428535_574691930.shtml
  2. delph mysql结构体,Delphi中的结构体与类
  3. java文件路径中的两个反斜杠“\\“是什么意思
  4. Wi-Fi语音技术浅析
  5. 怎么将语音转为文字?不如试试这几个语音转文字软件app
  6. c语言画bmp五星红旗图片,VB画出来的五星红旗
  7. 硕士到博士一路走来的科研感悟
  8. 腾讯AI足球队夺冠Kaggle竞赛,绝悟强化学习方案迁移至足球队
  9. 根据航向角和距离计算平移后的经纬坐标
  10. 独立开发变现周刊(第28期):一个JavaScript组件做到了150万美金收入