最近因为项目要求,须要开发物联网云平台,而本人对硬件和通讯技术一窍不通,故而选择arduino这一简单单片机来实现学习掌握基础的硬件和通讯技术。git
下面就是本人经过查阅大佬资料作的一个整合版本的经过手机APP来控制LED开关的实验:编程
第一步:连线使用软串口方式,利用arduino来对ESP8266进行AT命令操做。缓存
连线参考图以下:markdown
连线完后,利用串口调试工具和Arduino IDE 软件进行编程,实现对ESP8266的软串口指令下达:网络
工具#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TXoop
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println("Goodnight moon!");学习
// set the data rate for the SoftwareSerial port
mySerial.begin(115200);
mySerial.println("Hello, world?");
}ui
void loop() // run over and over
{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}spa
==程序效果==
打开串口,设置波特率为115200,串口显示:
Goodnight moon!
Hello, world?
ERROR
表示已经进入AT模式,若是只有Goodnight moon!,说明没有进入AT模式。
发送AT,反馈OK。
第二步:利用AT命令来对ESP8266进行设置,使其链接到和手机在同一wifi网络中。
1:发送AT+RST(执行指令)
指令:AT+RST
反馈:OK
说明:刚上电能够不发送该指令,有些厂家生产的ESP8266模块,没法即时重启复位,致使串口无响应,如已发送,则从新开关串口按钮便可。
2:发送AT+CWMODE=3或AT+CWMODE=2(设置指令)
指令:AT+CWMODE=<MODE>
说明:<MODE>:1为Station模式,2为AP模式,3为Station兼AP模式
反馈:OK
3:发送AT+CWJAP=“long”,”12345678”(选择你所要加入的路由器名称和密码进入)
指令:AT+CWJAP=<ssid>,<pwd>
<ssid>:字符串参数,ESP8266WIFI名字
<pwd>:字符串参数,WIFI密码,最长64字节,ASCII
具体内容以下:
//设置WiFi应用模式为Station AT+CWMODE=3 //链接到WiFi路由器,请将SSID替换为路由器名称,Password替换为路由器WiFi密码 AT+CWJAP="SSID","Password" //链接单连模式 AT+CIPMUX=0 //设置为透传模式 AT+CIPMODE=1 //进入透传模式,并保存(进入后模块就一直为透传模式,须要退出则取消发送新行,发送+++) ,IP地址为远端设备地址,例:我用手机控制,那么个人手机在路由器WIFI上的IP地址为192.168.1.110 AT+SAVETRANSLINK=1,"192.168.1.110",8080,"TCP"
2018.04.24补充:此时若无USB转TTL工具,不要使用AT+SAVETRANSLINK指令,该指令会将当前设置存储到RAM中去,ESP8266通电后自动进入链接模式,除非使用USB转TTL进行烧写,不然将没法恢复到调试模式(没法使用AT指令)。本人掉坑,后USB转TTL烧写版本后,才恢复正常。
第三步,将LED的正极引脚插入9号数字口,负极接地,进行编程。
int led_pin = 9; //定义一个10字节的整型数据变量cmd做为命令,这里能够修改成不一样的数字。此处设置为10是为了有更好的兼容性。 char cmd[10]; //判断收到的cmd是否有内容 bool valid_cmd = false; void setup() { //定义链接led的引脚为输出信号 pinMode(led_pin, OUTPUT); Serial.begin(115200); } void loop() { /*如下部分是串口信息处理过程*/ //定义一个整数型变量i int i; //若是串口收到有数据 if (Serial.available() > 0) { //变量i最大为10 for (i = 0; i < 10; i++) { //清空缓存,存入cmd变量,并以\0做为结束符 cmd[i] = '\0'; } //此时i只能取前9位,第10位是结束符\0 for (i = 0; i < 9; i++) { //再次判断串口若是收到有数据,防止数据丢失 if (Serial.available() > 0) { //给变量cmd赋值,取串口收到的前9位字符 cmd[i] = Serial.read(); delay(1); } else { //若是串口数据超过9位,后面的字符直接忽略,跳到下一步 break; } } /*以上串口信息处理结束*/ //获得最终变量cmd的有效值 valid_cmd = true; } //判断变量cmd的值,开始处理 if (valid_cmd) { //若是变量cmd的前2位的值是on if (0 == strncmp(cmd, "on", 2)) { //则链接led的引脚电压被置高5V, digitalWrite(led_pin, HIGH); //串口打印返回值ON,表示ON的操做执行成功 Serial.println("ON"); } else if (0 == strncmp(cmd, "off", 3)) //不然若是变量cmd的前3位的值是off { //则链接继电器的引脚电压被置低0V,灯的电路被断开,灯灭 digitalWrite(led_pin, LOW); //串口打印返回值F,表示OFF的操做执行成功 Serial.println("OFF"); } else //若是以上两个条件都不成立,前2位不是ON,或者前3位不是OFF,即不正确的命令 { //仅串口打印返回值X,表示指令错误。 Serial.println("X"); } //到此,变量cmd的指令被处理完毕 valid_cmd = false; } //延迟10毫秒,返回loop主程序继续读取新的串口指令 delay(10); }
第四步,安装APP进行验证。
一、打开网络调试助手,点击TCP SERVER—-配置
二、当开启服务端后,ESP8266自动链接上了:
三、在发送框内发送”on”便可点亮Arduino板载LED灯。
四、在发送框内发送”off”便可熄灭Arduino板载LED灯。
总结:经过对网上资料的整理学习,实现了一种不经过USB转TTL烧写ESP8266的方式,对APP实现同一WiFi网络内LED开关。
本文主要参考了以下资料: