模块的信息:
使用某宝上购买的2块ESP8266-12E NODEMCU模块,外围电路已经焊接好,USB转串口是340G。
基本思路:
一个模块作为AP,另一个模块作station,利用arduino发送命令,通过station,控制AP模块上LED的闪烁。
实现步骤:
1.服务器部分:
由于买来的模块是lua脚本模式,所以先刷新固件,以便输入AT指令。
固件和烧录固件的工具均可在安信可官网下载 https://docs.ai-thinker.com/esp8266
奇葩的是2个模块中的1个,即使刷新了固件也无论如何无法输入指令。
具体表现为,打开安信可串口调试软件,输入AT后发送,正常的会反馈OK,而该模块无反应。检查了外围电路也没有找到原因,只能改用arduino IDE编程烧录,使该模块作为AP。
程序如下:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#define APSSID "ESPap"
#define APPSK "12345678"
/* Set these to your desired credentials. */
const char *ssid = APSSID;
const char *password = APPSK;
#define MAX_SRV_CLIENTS 1
WiFiServer server(8266);
WiFiClient serverClients[1];
/* Just a little test message. Go to http://192.168.4.1 in a web browser
connected to this access point to see it.
*/
String comdata;
void setup(){
pinMode(LED_BUILTIN, OUTPUT);
delay(1000);
Serial.begin(115200);
Serial.println();
Serial.print("Configuring access point...");
/* You can remove the password parameter if you want the AP to be open. */
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
server.begin();
server.setNoDelay(true);
Serial.println("Server started");
digitalWrite(LED_BUILTIN,HIGH);
}
以上程序设置了AP的名字和密码,设置端口8266,并且让它运行。
void loop(){
uint8_t i;
//检测服务器端是否有活动的客户端连接
if (server.hasClient()){
for(i = 0; i < MAX_SRV_CLIENTS; i++){
//查找空闲或者断开连接的客户端,并置为可用
if (!serverClients[i] || !serverClients[i].connected()){
if(serverClients[i]) serverClients[i].stop();
serverClients[i] = server.available();
Serial.print("New client: "); Serial.println(i);
continue;
}
}
//若没有可用客户端,则停止连接
WiFiClient serverClient = server.available();
serverClient.stop();
}
//检查客户端的数据
for(i = 0; i < MAX_SRV_CLIENTS; i++){
if (serverClients[i] && serverClients[i].connected()){
if(serverClients[i].available()){
//从Telnet客户端获取数据,并推送到URAT端口
while(serverClients[i].available()){
comdata += char(serverClients[i].read());
delay(2);
}
}
}
}
if(comdata.length() > 0){
comdata.trim();
Serial.println(comdata);
if (comdata.endsWith("A")){
digitalWrite(LED_BUILTIN,HIGH);
Serial.println("LIGHT OFF");
}
if (comdata.endsWith("a")){
digitalWrite(LED_BUILTIN,LOW);
Serial.println("LIGHT ON");
}
comdata = "";
}
}
以上程序检查是否有客户端连接,从客户端获取数据,如果是A,则LED灭,如果是a,则LED亮。
2.客户端部分:
这里我用另一块8266进行连接。
- 首先输入AT+CWMODE=1,配置为连接模式。注意:此处AT+CWMODE=3的话是连不上的。
- 重启 AT+RST
- 连接另一块8266,AT+CWJAP="ESPap","12345678"
- 成功后,可以输入查询指令:AT+CIFSR查看本设备的IP地址 如图:
主机是192.168.4.1,客户端是192.168.4.2,这样可以连接,输入 AT+CIPSTART="TCP","192.168.4.1",8266
- 连接成功后设置成透传模式,AT+CIPMODE=1,再输入AT+CIPSEND,就可以发送命令了。
以上是手动配置,接下来通过arduino,自动配置并控制LED。
3.arduino控制部分
接线:
VIN ---------- 5V
G ---------- GND
TX ---------- 11
RX ---------- 12 (使用arduino的软串口)
代码如下:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(11, 12); //RX,TX
String comdata;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
delay(2000);
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Hello World");
mySerial.begin(115200);
mySerial.println("AT+CWMODE=1");
while (mySerial.read()!='K'){}
mySerial.println("AT+CWQAP");
delay(100);
mySerial.println("AT+CWJAP=\"ESPap\",\"12345678\"");
while (mySerial.read()!='K'){}
Serial.println("OK");
mySerial.println("AT+CIPSTART=\"TCP\",\"192.168.4.1\",8266");
while (mySerial.read()!='K'){}
Serial.println("started");
mySerial.println("AT+CIPMODE=1");
while (mySerial.read()!='K'){}
mySerial.println("AT+CIPSEND");
while (mySerial.read()!='K'){}
Serial.println("send ok");
}
void loop() {
mySerial.println("A");
delay(1000);
mySerial.println("a");
delay(1000);
}
这样,通过arduino发送命令,控制服务器模块上的LED亮灭。
补充说明:以上这是我两天调ESP8266的总结加上网上的一些教程,如有不对之处,欢迎指出。