電路
電路.jpg (266.26 KB, 下載次數: 69)
下載附件
2018-8-3 08:55 上傳
源代碼
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <FS.h>
ESP8266WebServer webServer(80);
#define ssidAP "紅色帝國"
#define passwordAP "88888888"
/* 引腳定義 */
const byte Pin_DS = D6; //data Pin
const byte Pin_STCP = D7; //bitOrder Pin
const byte Pin_SHCP = D8; //clock Pin
/* 主機軟熱點設置 */
IPAddress apIP(192, 168, 8, 1);
IPAddress gateway(192, 168, 8, 1);
IPAddress subnet(255, 255, 255, 0);
/* 軟復位 */
void(* resetFunc) (void) = 0; //定義端口0為軟復位IO,使用方法:resetFunc();
/* 字符串 轉 short */
short chkValue(String val) {
return atoi(val.c_str());
}
//#include "wiring_private.h"
/*
uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
uint8_t value = 0;
uint8_t i;
for (i = 0; i < 8; ++i) {
digitalWrite(clockPin, HIGH);
if (bitOrder == LSBFIRST)
value |= digitalRead(dataPin) << i;
else
value |= digitalRead(dataPin) << (7 - i);
digitalWrite(clockPin, LOW);
}
return value;
}
void shiftOut1(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
uint8_t i;
for (i = 0; i < 8; i++) {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (7 - i))));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}
*/
void shiftOut1(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) {
uint8_t i;
for (i = 0; i < 4; i++) {
if (bitOrder == LSBFIRST)
digitalWrite(dataPin, !!(val & (1 << i)));
else
digitalWrite(dataPin, !!(val & (1 << (3 - i))));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}
/* 根據文件后綴獲取html協議的返回內容類型 */
String getContentType(String filename) {
if (webServer.hasArg("download")) return "application/octet-stream";
else if (filename.endsWith(".htm")) return "text/html";
else if (filename.endsWith(".html")) return "text/html";
else if (filename.endsWith(".css")) return "text/css";
else if (filename.endsWith(".js")) return "application/javascript";
else if (filename.endsWith(".png")) return "image/png";
else if (filename.endsWith(".gif")) return "image/gif";
else if (filename.endsWith(".jpg")) return "image/jpeg";
else if (filename.endsWith(".ico")) return "image/x-icon";
else if (filename.endsWith(".xml")) return "text/xml";
else if (filename.endsWith(".pdf")) return "application/x-pdf";
else if (filename.endsWith(".zip")) return "application/x-zip";
else if (filename.endsWith(".gz")) return "application/x-gzip";
return "text/plain";
}
/* 靜態輸出 */
void led_Display(short AB, short CD, short EF) {
//Serial.print("LED 值 AB:"); Serial.println(AB, BIN);
//Serial.print("LED 值 CD:"); Serial.println(CD, BIN);
//Serial.print("LED 值 EF:"); Serial.println(EF, BIN);
digitalWrite(Pin_STCP, LOW);
//MSBFIRST,從高到底傳輸二進制位,74HC595會從第一塊開始,從Q0一直位移數據到Q7,如果還有數據,則繼續把壓到第二塊的Q0到Q7,如果還有數據,則繼續把壓到第三塊的Q0到Q7
//MSBFIRST的方式,這里才是第四塊的數據
shiftOut(Pin_DS, Pin_SHCP, LSBFIRST , 0) ;
//MSBFIRST的方式,這里才是第三塊的數據
shiftOut(Pin_DS, Pin_SHCP, LSBFIRST , EF) ;
//MSBFIRST的方式,這里才是第二塊的數據
shiftOut(Pin_DS, Pin_SHCP, LSBFIRST , CD) ;
//MSBFIRST的方式,這里才是第一塊的數據
shiftOut(Pin_DS, Pin_SHCP, LSBFIRST , AB) ;
digitalWrite(Pin_STCP, HIGH);
Serial.println("LED 燈設置成功!"); Serial.println(EF, BIN);
long tmp = (tmp << 8) | AB;
tmp = (tmp << 8) | CD;
tmp = (tmp << 8) | EF;
Serial.print("LED 設置值:"); Serial.println(tmp, BIN);
}
/* 未找到文件處理(NotFound處理,用于處理沒有注冊的請求地址,一般是處理一些頁面請求) */
void handle_NotFound() {
String path = webServer.uri();
Serial.print("載入 URL: "); Serial.println(path);
String contentType = getContentType(path);
String pathWithGz = path + ".gz";
if (SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)) {
if (SPIFFS.exists(pathWithGz))
path += ".gz";
File file = SPIFFS.open(path, "r");
size_t sent = webServer.streamFile(file, contentType);
file.close();
return;
}
String message = "未找到文件\n\n";
message += "URI: ";
message += webServer.uri();
message += "\nMethod: ";
message += (webServer.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += webServer.args();
message += "\n";
for (uint8_t i = 0; i < webServer.args(); i++) {
message += " " + webServer.argName (i) + ": " + webServer.arg (i) + "\n";
}
webServer.send (404, "text/plain", message);
}
/* 首頁 */
void handle_Main() {
//返回信息給瀏覽器(狀態碼,Content-type, 內容)
//這里是訪問當前設備ip直接返回一個String
Serial.println("打開首頁");
File file = SPIFFS.open("/index.html", "r");
size_t sent = webServer.streamFile(file, "text/html");
file.close();
return;
}
/* IO引腳操作 */
void handle_Pin() {
Serial.println("設置IO引腳");
if (webServer.hasArg("a")) { // 請求中是否包含有a的參數
String action = webServer.arg("a"); // 獲得a參數的值
if (action == "on") { // a=on
digitalWrite(2, LOW); // 點亮8266上的藍色led,led是低電平驅動,需要拉低才能亮
Serial.println("Pin 2 has turn on");
webServer.send (200, "text/html", "Pin 2 has turn on"); return; // 返回數據
} else if (action == "off") { // a=off
digitalWrite(2, HIGH); // 熄滅板載led
Serial.println("Pin 2 has turn off");
webServer.send (200, "text/html", "Pin 2 has turn off"); return;
}
Serial.println("unknown action");
webServer.send (200, "text/html", "unknown action"); return;
}
}
/* LED燈操作 */
void handle_Led_Set() {
Serial.println("設置LED燈");
short outAB = 0b00000000; //用于輸出結果的二進制
short outCD = 0b00000000; //用于輸出結果的二進制
short outEF = 0b00000000; //用于輸出結果的二進制
//A區域燈數據獲取
if (webServer.hasArg("A")) { // 請求中是否包含有A的參數
String valueA = webServer.arg("A"); // 獲得A參數的值
outAB = (outAB << 4) | chkValue(valueA);
} else {
outAB = (outAB << 4) | 0;
webServer.send (200, "text/html", "unknown action A");
}
//B區域燈數據獲取
if (webServer.hasArg("B")) { // 請求中是否包含有B的參數
String valueB = webServer.arg("B"); // 獲得B參數的值
outAB = (outAB << 4) | chkValue(valueB);
} else {
outAB = (outAB << 4) | 0;
webServer.send (200, "text/html", "unknown action B");
}
//C區域燈數據獲取
if (webServer.hasArg("C")) { // 請求中是否包含有C的參數
String valueC = webServer.arg("C"); // 獲得C參數的值
outCD = (outCD << 4) | chkValue(valueC);
} else {
outCD = (outCD << 4) | 0;
webServer.send (200, "text/html", "unknown action C");
}
//D區域燈數據獲取
if (webServer.hasArg("D")) { // 請求中是否包含有D的參數
String valueD = webServer.arg("D"); // 獲得D參數的值
outCD = (outCD << 4) | chkValue(valueD);
} else {
outCD = (outCD << 4) | 0;
webServer.send (200, "text/html", "unknown action D");
}
//E區域燈數據獲取
if (webServer.hasArg("E")) { // 請求中是否包含有E的參數
String valueE = webServer.arg("E"); // 獲得E參數的值
outEF = (outEF << 4) | chkValue(valueE);
} else {
outEF = (outEF << 4) | 0;
webServer.send (200, "text/html", "unknown action E");
}
//F區域燈數據獲取
if (webServer.hasArg("F")) { // 請求中是否包含有F的參數
String valueF = webServer.arg("F"); // 獲得F參數的值
outEF = (outEF << 4) | chkValue(valueF);
} else {
outEF = (outEF << 4) | 0;
webServer.send (200, "text/html", "unknown action F");
}
led_Display(outAB, outCD, outEF);
return;
}
/* 設置 */
void handle_Set() {
Serial.println("打開設置");
}
/* 設置 -> 恢復出廠設置 */
void handle_Reset() {
Serial.println("設置 -> 恢復出廠設置");
Serial.println("開始重新啟動...");
Serial.println("倒計時 3 ...");
delay(1000);
Serial.println("倒計時 2 ...");
delay(1000);
Serial.println("倒計時 1 ...");
delay(1000);
Serial.println("重新啟動中...");
resetFunc();
}
/* 設置 -> 重新啟動(軟復位) */
void handle_Restart() {
Serial.println("設置 -> 重新啟動(軟復位)");
Serial.println("開始重新啟動...");
Serial.println("倒計時 3 ...");
delay(1000);
Serial.println("倒計時 2 ...");
delay(1000);
Serial.println("倒計時 1 ...");
delay(1000);
Serial.println("重新啟動中...");
resetFunc();
}
void setup() {
//開啟串口
Serial.begin(9600);
while (!Serial) {}
//設置IO引腳...
pinMode(2, OUTPUT);
//定義引腳
pinMode(Pin_DS, OUTPUT); //DS
pinMode(Pin_STCP, OUTPUT); //ST_CP
pinMode(Pin_SHCP, OUTPUT); //SH_CP
//初始化引腳
digitalWrite(Pin_DS, LOW); //DS
digitalWrite(Pin_STCP, LOW); //ST_CP
digitalWrite(Pin_SHCP, LOW); //SH_CP
//初始化LED燈
led_Display(0b11111111, 0b11111111, 0b11111111);
//文件系統
SPIFFS.begin();
//軟路由
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP, gateway, subnet);
WiFi.softAP(ssidAP, passwordAP);
//綁定 HTTP 地址
webServer.on("/", handle_Main); //綁定 ‘/’ 地址到 handle_Main 方法處理
webServer.on("/pin", HTTP_GET, handle_Pin); //綁定 ‘/pin’ 地址到 handle_Pin 方法處理
webServer.on("/led/set", HTTP_GET, handle_Led_Set); //綁定 ‘/led/set’ 地址到 handle_Led_Set 方法處理
webServer.on("/set", HTTP_GET, handle_Set); //綁定 ‘/set’ 地址到 handle_Set 方法處理
webServer.on("/set/reset", HTTP_GET, handle_Reset); //綁定 ‘/setd/reset’ 地址到 handle_Reset 方法處理
webServer.on("/set/restart", HTTP_GET, handle_Restart); //綁定 ‘/set/restart’ 地址到 handle_Restart 方法處理
webServer.onNotFound(handle_NotFound); //NotFound處理
webServer.begin();
}
void loop() {
webServer.handleClient();
}
|