有一个通过串口控制的LED矩阵, 实验中需要独立控制每颗LED的亮度, 并且每隔几秒就需要点亮LED一下. 同时要做这实验的师姐还不会编程. 因此我需要一个可以不断给串口Rx写入控制信号的单片机, 还需要一个用于修改其中参数的前端.

我选择使用ESP8266作为这个单片机, 同时使用WiFi连接, 使用网页作为前端.

此处记录这个过程中会用到的一些函数.

网络连接

STA模式连入局域网

#include <ESP8266WiFi.h>

#ifndef STASSID
#define STASSID "HOMEWLAN"
#define STAPASSWD "********"
#endif

void setup(void){
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPASSWD);
  Serial.println("");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

AP模式构建局域网

#include <ESP8266WiFi.h>

#define APSSID "BlueLED"
#define APPASSWD ""

void setup(void) {
  Serial.begin(115200);
  WiFi.softAP(APSSID,APPASSWD);
  Serial.println("");
  Serial.println("");
  Serial.print("Connect to ");
  Serial.println(APSSID);
  Serial.print("IP address: ");
  Serial.println(WiFi.softAPIP());
}

mDNS用作网络发现

仅iOS以及Mac OS原生支持mDNS, 其余系统可能需要安装对应的系统服务先.

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>

void setup(void){
  ......
  WiFi.softAP(APSSID,APPASSWD);
  if(MDNS.begin("myesp")){
    Serial.println("Go to myesp.local to get IP");
  }
}

void loop(void) {
  MDNS.update();
}

网页服务

显示网页

#include <ESP8266WebServer.h>

ESP8266WebServer server(80);

void handleRoot(){
  String var="Your First Page";
  String content="<html>";
  content+="<title>";
  content+=var;
  content+="</title>";
  content+="<body>";
  content+=var;
  content+="</body>";
  content+="</html>";
  server.send(200, "text/html", content);
}

void handleNotFound() {
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

void setup(void){
  ......
  server.on("/", handleLED);
  server.onNotFound(handleNotFound);
  server.begin();
  // If you have mDNS services, use:
  // MDNS.addService("http","tcp",80);
}

void loop(void){
  // If you have mDNS services, use:
  // MDNS.update();
  server.handleClient();
}

传回网页数据

网页内容中若规定了文本框以及按钮:

<form action='/' method='POST'>
  <input type='number' name='文本框名1' placeholder='文本框中显示的内容'>
  <input type='text' name='文本框名2' placeholder='文本框中显示的内'>
  <input type='password' name='文本框名3' placeholder='文本框中显示的内'>
  <input type='submit' name='按钮名1' value='按钮显示的内容'>
</form>

则会在点击按钮时候回传文本框的内容给ESP8266.

int t1;
long t1l;
String t2,t3;
if(server.hasArg("文本框名1")){
  t1=atoi(server.arg("文本框名1").c_str());
  t1l=atol(server.arg("文本框名1").c_str());
}
if(server.hasArg("文本框名2")){
  t2=server.arg("文本框名2");
}
if(server.hasArg("文本框名3")){
  t3=server.arg("文本框名3");
}

定时器中断Ticker

#include <Ticker.h>

Ticker flipper;

bool fl=0;

void fliped(){
  fl=1;
}

void flip(){
  ......
}

void setup(void) {
  flipper.attach(1,fliped); // 每秒产生一个中断, 注意中断函数fliped应尽量简单, 如果fliped处理耗时太长, 程序会无法正常工作.
}

void loop(void){
  if(fl==1){
    flip();
    fl=0;
  }
}


Arduino 单片机 hardware ESP

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!