手机连入NODEMCU控制单片机上的一盏灯

2019-04-15 17:07发布

最近开始学习wifi8266这个模组,首先想到能不能与单片机连接使用,参考了一些网上的资料后便开始做了这个点亮单片机上的一盏灯实验。

硬件:nodemcu,单片机开发板,杜邦线;

软件:keil4,isp下载软件,AiThinker Serial Tool ,网络调试助手


思路  1.nodemcu建立成AP模式

    2.手机连入nodemcu并发送数据,nodemcu发送回单片机,单片机识别数据后执行点亮或灭的操作



硬件介绍: nodemcu: nodemcu引脚图 模块图:
模块图 单片机开发板(普中):
单片机开发板 AP(建立TCP服务器)模式的运用 nodemcuTCP服务器设置: 1)nodemcu支持AP模式、Station模式和AP+Station模式。AP模式称为无线接入点,是一个无线网络的中心节点,类似于我们生活中使用的路由器,Station模式称为无线终端,是一个无线网络的终端,相当于我们生活中能够加入网络的东西。 2)AT指令的设置
  步骤一:发送“AT+CWMODE=2”设置为AP模式。表示作为路由器,其他手机、计算机可以作为station连入到nodemcu,“1"为station模式,“3”为staion+AP模式。
  步骤二:发送"AT+RST”,表示重启模块AT+CWMODE=2模式生效。你可以在终端的wifi连接页面看到nodemcu的wifi信号,让终端连接上nodemcu。
  步骤三:发送“AT+CIPMUX=1”启动多连接。多连接可以有多个客户端连入,最多可以连5个客户,(每个客户都有对应ID号,0~4)。AT+CIPMUX=0为单路连接。
  步骤四:发送“AT+CIPSERVER=1,8989”启动服务器,端口号8989,要想关闭则发送“AT+CIPSERVER=0” 3)如图操作便可建立IP为192.168.4.1,服务端口为8989的服务器
操作图 我们可以使用手机或电脑连接上nodemcu的wifi信号,使用软件(我自己手机和pc都是使用网络调试助手这个软件)连接上服务器后便可向服务器发送数据,客户端向服务器发字符没有个数限制!
在这里插入图片描述 可以看到我的手机向服务器发送数据后会有如上图字句出现。其意思是“+IPD,,<收到的字符长度>:收到的字符“,0是我的手机编号,3代表收到的字符长度,111是收到的字符。 但是我们使用服务器发数据却不这么方便了,每发送一次都要先发送“AT+CIPSEND=×,× ”(第一个×是对应的ID号,第二个×是对应的字符个数),
在这里插入图片描述 经过上述步骤了解了AT的TCP的相关知识后开始我们的单片机编程:
esp8266在收到数据并转发给单片机时的数据格式也是:+IPD,,<收到的字符长度>:
我们把接收到的字符串缓存到字符数组中,所以在处理收到的数据逻辑中,首先判断是否是以’+'开始的,找到我们想要的数据后,然后判断数组中的第十个数据,因为第十个数据才是上位机发送过来的数据。 #include "stc12c5a60s2.h" #define uchar unsigned char #define uint unsigned int sbit led1=P2^2; uchar receiveTable[15]; //接收缓冲,最大20个字节 uchar i; char code str1[]="AT+CWMODE=2 "; //设置在AP模式下,/r/n在串口通信表示换新行 char code str2[]="AT+RST "; //重启 char code str3[]="AT+UART=4800,8,1,0,0 "; //设置波特率为4800 char code str4[]="AT+CIPMUX=1 "; //允许多连接 char code str5[]="AT+CIPSERVER=1,5000 "; //建立服务器 void serialinit() { TMOD =0x20; //定时器1操作模式2,8位自动重载定时器 PCON=0X80; //SMOD置1,使波特率加倍 TH1=0xf3; //定时时间,波特率是4800 TL1=0xf3; TR1=1; //打开定时器 SM0=0; //设置串行通信模式 SM1=1; REN=1; //串行接受允许位,要先设置sm0,sm1再开串行允许位 EA=1; //开总中断 ES=1; //开串行中断 } void OneChar(uchar val) { SBUF=val; //将收到的数据放入到发送寄存器 while(TI==0); //等待发送数据(TI=0)完成 TI=0; //清除发送完成标志位 } void sendString(uchar *str) { while( (*str)!='