有一个通过串口控制的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;
}
}
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!