久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3749|回復: 0
打印 上一主題 下一主題
收起左側

基于arduino d1炫彩燈

[復制鏈接]
跳轉到指定樓層
樓主
電路

源代碼
#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();
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲毛片在线观看 | 日本不卡一区 | 免费黄色大片 | 91综合在线观看 | 色偷偷噜噜噜亚洲男人 | 亚洲欧美在线一区 | 国产精品久久久久久久 | 欧美第一区 | 国产一区二区在线视频 | 99久久婷婷国产综合精品 | 国产精品美女久久久久aⅴ国产馆 | 九九导航| 亚洲精品片 | www.蜜桃av | 色偷偷噜噜噜亚洲男人 | 国产高清视频一区 | 精品国产一区二区在线 | 欧美精品一区二区三区在线播放 | 婷婷色成人 | 欧美www在线| 亚洲一区二区三区在线 | 中文字幕成人网 | 国产综合精品 | 九九九色| 男人天堂网址 | 992tv人人草| 国产日韩久久 | 亚洲国产一 | 伊色综合久久之综合久久 | 成人一区二区三区在线观看 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 国产精品成人一区二区三区夜夜夜 | 国产一级一级 | 黄色片在线观看网址 | 欧美在线一区二区三区四区 | 一区二区三区视频免费看 | 欧洲精品在线观看 | 日韩精品成人免费观看视频 | 国产精品亚洲第一区在线暖暖韩国 | 免费在线观看成年人视频 | 不卡视频一区二区三区 |