找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3824|回復(fù): 0
收起左側(cè)

基于arduino d1炫彩燈

[復(fù)制鏈接]
ID:300046 發(fā)表于 2018-8-3 09:00 | 顯示全部樓層 |閱讀模式
電路 電路.jpg

源代碼
#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

/* 主機(jī)軟熱點(diǎn)設(shè)置 */
IPAddress apIP(192, 168, 8, 1);
IPAddress gateway(192, 168, 8, 1);
IPAddress subnet(255, 255, 255, 0);

/* 軟復(fù)位 */
void(* resetFunc) (void) = 0;   //定義端口0為軟復(fù)位IO,使用方法:resetFunc();

/* 字符串 轉(zhuǎn) 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);
  }
}

/* 根據(jù)文件后綴獲取html協(xié)議的返回內(nèi)容類型 */
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";
}

/* 靜態(tài)輸出 */
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,從高到底傳輸二進(jìn)制位,74HC595會(huì)從第一塊開始,從Q0一直位移數(shù)據(jù)到Q7,如果還有數(shù)據(jù),則繼續(xù)把壓到第二塊的Q0到Q7,如果還有數(shù)據(jù),則繼續(xù)把壓到第三塊的Q0到Q7
  //MSBFIRST的方式,這里才是第四塊的數(shù)據(jù)
  shiftOut(Pin_DS, Pin_SHCP, LSBFIRST , 0) ;
  //MSBFIRST的方式,這里才是第三塊的數(shù)據(jù)
  shiftOut(Pin_DS, Pin_SHCP, LSBFIRST , EF) ;
  //MSBFIRST的方式,這里才是第二塊的數(shù)據(jù)
  shiftOut(Pin_DS, Pin_SHCP, LSBFIRST , CD) ;
  //MSBFIRST的方式,這里才是第一塊的數(shù)據(jù)
  shiftOut(Pin_DS, Pin_SHCP, LSBFIRST , AB) ;
  digitalWrite(Pin_STCP, HIGH);

  Serial.println("LED 燈設(shè)置成功!"); Serial.println(EF, BIN);

  long tmp = (tmp << 8) | AB;
  tmp = (tmp << 8) | CD;
  tmp = (tmp << 8) | EF;
  Serial.print("LED 設(shè)置值:"); 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() {
  //返回信息給瀏覽器(狀態(tài)碼,Content-type, 內(nèi)容)
  //這里是訪問當(dāng)前設(shè)備ip直接返回一個(gè)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("設(shè)置IO引腳");
  if (webServer.hasArg("a")) { // 請求中是否包含有a的參數(shù)
    String action = webServer.arg("a"); // 獲得a參數(shù)的值
    if (action == "on") { // a=on
      digitalWrite(2, LOW); // 點(diǎn)亮8266上的藍(lán)色led,led是低電平驅(qū)動(dòng),需要拉低才能亮
      Serial.println("Pin 2 has turn on");
      webServer.send (200, "text/html", "Pin 2 has turn on"); return; // 返回?cái)?shù)據(jù)
    } 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("設(shè)置LED燈");
  short outAB = 0b00000000;  //用于輸出結(jié)果的二進(jìn)制
  short outCD = 0b00000000;  //用于輸出結(jié)果的二進(jìn)制
  short outEF = 0b00000000;  //用于輸出結(jié)果的二進(jìn)制

  //A區(qū)域燈數(shù)據(jù)獲取
  if (webServer.hasArg("A")) { // 請求中是否包含有A的參數(shù)
    String valueA = webServer.arg("A"); // 獲得A參數(shù)的值
    outAB = (outAB << 4) | chkValue(valueA);
  } else {
    outAB = (outAB << 4) | 0;
    webServer.send (200, "text/html", "unknown action A");
  }

  //B區(qū)域燈數(shù)據(jù)獲取
  if (webServer.hasArg("B")) { // 請求中是否包含有B的參數(shù)
    String valueB = webServer.arg("B"); // 獲得B參數(shù)的值
    outAB = (outAB << 4) | chkValue(valueB);
  } else {
    outAB = (outAB << 4) | 0;
    webServer.send (200, "text/html", "unknown action B");
  }

  //C區(qū)域燈數(shù)據(jù)獲取
  if (webServer.hasArg("C")) { // 請求中是否包含有C的參數(shù)
    String valueC = webServer.arg("C"); // 獲得C參數(shù)的值
    outCD = (outCD << 4) | chkValue(valueC);
  } else {
    outCD = (outCD << 4) | 0;
    webServer.send (200, "text/html", "unknown action C");
  }

  //D區(qū)域燈數(shù)據(jù)獲取
  if (webServer.hasArg("D")) { // 請求中是否包含有D的參數(shù)
    String valueD = webServer.arg("D"); // 獲得D參數(shù)的值
    outCD = (outCD << 4) | chkValue(valueD);
  } else {
    outCD = (outCD << 4) | 0;
    webServer.send (200, "text/html", "unknown action D");
  }

  //E區(qū)域燈數(shù)據(jù)獲取
  if (webServer.hasArg("E")) { // 請求中是否包含有E的參數(shù)
    String valueE = webServer.arg("E"); // 獲得E參數(shù)的值
    outEF = (outEF << 4) | chkValue(valueE);
  } else {
    outEF = (outEF << 4) | 0;
    webServer.send (200, "text/html", "unknown action E");
  }

  //F區(qū)域燈數(shù)據(jù)獲取
  if (webServer.hasArg("F")) { // 請求中是否包含有F的參數(shù)
    String valueF = webServer.arg("F"); // 獲得F參數(shù)的值
    outEF = (outEF << 4) | chkValue(valueF);
  } else {
    outEF = (outEF << 4) | 0;
    webServer.send (200, "text/html", "unknown action F");
  }

  led_Display(outAB, outCD, outEF);
  return;
}

/* 設(shè)置 */
void handle_Set() {
  Serial.println("打開設(shè)置");

}

/* 設(shè)置 -> 恢復(fù)出廠設(shè)置 */
void handle_Reset() {
  Serial.println("設(shè)置 -> 恢復(fù)出廠設(shè)置");

  Serial.println("開始重新啟動(dòng)...");
  Serial.println("倒計(jì)時(shí) 3 ...");
  delay(1000);
  Serial.println("倒計(jì)時(shí) 2 ...");
  delay(1000);
  Serial.println("倒計(jì)時(shí) 1 ...");
  delay(1000);
  Serial.println("重新啟動(dòng)中...");
  resetFunc();
}

/* 設(shè)置 -> 重新啟動(dòng)(軟復(fù)位) */
void handle_Restart() {
  Serial.println("設(shè)置 -> 重新啟動(dòng)(軟復(fù)位)");

  Serial.println("開始重新啟動(dòng)...");
  Serial.println("倒計(jì)時(shí) 3 ...");
  delay(1000);
  Serial.println("倒計(jì)時(shí) 2 ...");
  delay(1000);
  Serial.println("倒計(jì)時(shí) 1 ...");
  delay(1000);
  Serial.println("重新啟動(dòng)中...");
  resetFunc();
}



void setup() {
  //開啟串口
  Serial.begin(9600);
  while (!Serial) {}

  //設(shè)置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);

  //文件系統(tǒng)
  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();
}


回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表