Arduino ESP8266 网页控制ws2812示例

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino ESP8266 网页控制ws2812示例相关的知识,希望对你有一定的参考价值。

Arduino ESP8266 网页控制ws2812示例


实例代码

对接收数据还需要debug。

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Adafruit_NeoPixel.h>
#define PIN   4       //ws2812的控制脚
#define NUMPIXELS      7  //ws2812的灯珠数量,后面要通过循环遍历
#define ssid "ESP8266"//名称
#define pssd ""//密码为空
#define RANDOMTIME     5000  //随机变换颜色的间隔时间,毫秒
#define BREATHTIME     20    //呼吸效果的快慢频率,毫秒
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

ESP8266WebServer esp8266_server(80);
byte showRandom = 1;  //是否随机显示颜色
byte showFlash = 0;  //是否闪烁
byte showBreath = 1;  //是否呼吸
uint8_t rrr = 50;   //RGB的颜色
uint8_t ggg = 50;
uint8_t bbb = 50;
uint8_t bright = 60; //亮度
unsigned long lastRandomTime = 0;  //最后一次随机变换的时间
unsigned long lastBreathTime = 0;   //最后一次呼吸的时间
byte breathDirection=0;  //呼吸变换的方向,是变暗还变亮
void setup() {
  pixels.begin();
  Serial.begin(115200);
  pinMode(2, OUTPUT); //设置内置LED引脚为输出模式以便控制LED
  WiFi.mode(WIFI_AP); //设置成AP模式
  WiFi.softAP(ssid, pssd);
  delay(10);
  IPAddress ip = WiFi.softAPIP(); //获取ip地址
  Serial.println(ip);//打印出来ip地址
  esp8266_server.begin();                           // 启动网站服务
  esp8266_server.on("/", HTTP_GET, handleRoot);     // 设置服务器根目录即' / '的函数'handleRoot'
  esp8266_server.onNotFound(handleNotFound);        // 设置处理404情况的函数'handleNotFound'

  Serial.println("HTTP esp8266_server started");
}

void loop(void) {
  esp8266_server.handleClient();                     // 检查http服务器访问
  if (showRandom == 1) {
    doRandom();
  }
  if(showBreath==1){
    doBreath();
  }
  showLed();

}

void doBreath(){
  if(millis()-lastBreathTime > BREATHTIME){
    if(breathDirection == 0){//判断亮度是增加还是减少
      bright-=1;
      if(bright==0){
        breathDirection=1;
      }
    }
    if(breathDirection==1){
      bright+=1;
      if(bright==155){
        breathDirection=0;
      }
    }
    lastBreathTime=millis();
    //Serial.println(bright);
  }
}
void doRandom() {
  if (millis() - lastRandomTime > RANDOMTIME) {
    rrr = random(256);
    ggg = random(256);
    bbb = random(256);
    lastRandomTime = millis();
  }

}
void handleRoot() {

  //处理请求的参数,使用的是get方法,也许post会更好些,没有研究明白
  Serial.println("当前请求中请求体数量:"); 
  Serial.println(esp8266_server.args());
  if (esp8266_server.hasArg("random")) {
    esp8266_server.arg("random") == "true" ? showRandom = 1 : showRandom = 0;
  }
  if (esp8266_server.hasArg("flash")) {
    esp8266_server.arg("flash") == "true" ? showFlash = 1 : showFlash = 0;
  }
  if (esp8266_server.hasArg("breath")) {
    esp8266_server.arg("breath") == "true" ? showBreath = 1 : showBreath = 0;
  }
  if (esp8266_server.hasArg("bright")) {
    bright = String(esp8266_server.arg("bright")).toInt();
  }
  if (esp8266_server.hasArg("r")) {
    rrr = String(esp8266_server.arg("r")).toInt();
  }
  if (esp8266_server.hasArg("g")) {
    ggg = String(esp8266_server.arg("g")).toInt();
  }
  if (esp8266_server.hasArg("b")) {
    bbb = String(esp8266_server.arg("b")).toInt();
  }
  for (int i = 0; i < esp8266_server.args(); i++) {
    String t = esp8266_server.argName(i) + "=" + String(esp8266_server.arg(i));
    Serial.println(t);
  }
  //Serial.print("  bright=");
  //Serial.print(bright);
  //把当前的rgb数值更新到网页里
  String checkboxRandom = "";
  if (showRandom == 1) {
    checkboxRandom = "checked=\\'true\\'";
  }
  String checkboxFlash = "";
  showFlash ? checkboxFlash = "checked=\\'true\\'" : true;
  String checkboxBreath = "";
  showBreath ? checkboxBreath = "checked=\\'true\\'" : true;
  String myhtmlPage =
    String("") +
    "<!DOCTYPE html>" +
    "<html lang=\\'zh-CN\\'>" +
    "<head>" +
    "    <meta charset=\\'UTF-8\\'>" +
    "    <meta name=\\'viewport\\' content=\\'width=device-width, initial-scale=1.4,  user-scalable=yes\\' />" +
    "    <title>It\\'s a model of html</title>" +
    "    <script>" +
    "        function postLed() {" +
    "            let checkRandom = document.getElementById(\\'checkRandom\\').checked;" +
    "            let checkBreath = document.getElementById(\\'checkBreath\\').checked;" +
    "            let checkFlash = document.getElementById(\\'checkFlash\\').checked;" +
    "            let bright = document.getElementById(\\'rangeBright\\').value;" +
    "            let rrr = document.getElementById(\\'rangeR\\').value;" +
    "            let ggg = document.getElementById(\\'rangeG\\').value;" +
    "            let bbb = document.getElementById(\\'rangeB\\').value;" +
    "            let args = window.location.href.split(\\'?\\')[0];" +
    "            args += \\'random=\\' + checkRandom + \\'breath=\\' + checkBreath + \\'flash=\\' + checkFlash;" +
    "            args += \\'bright=\\' + bright +  \\'r=\\' + rrr + \\'g=\\' + ggg + \\'b=\\' + bbb;" +
    "            console.log(args);" +
    "            window.location.href=args;" +
    "        }" +
    "    </script>" +
    "</head>" +
    "<body>" +
    "    </br>" +
    "    <input type=\\'checkbox\\' id=\\'checkRandom\\' " +
    checkboxRandom +
    "    ><span>随机</span></br>" +
    "    <input type=\\'checkbox\\' id=\\'checkFlash\\'" +
    checkboxFlash +
    "><span>闪烁</span></br>" +
    "    <input type=\\'checkbox\\' id=\\'checkBreath\\'" +
    checkboxBreath +
    "><span>呼吸</span></br>" +
    "    <span>亮度</span><input id=\\'rangeBright\\' type=\\'range\\' value=\\'" +
    String(bright) +
    "\\' min=\\'0\\' max=\\'255\\'></br>" +
    "    <span>红色</span><input id=\\'rangeR\\' type=\\'range\\' value=\\'" +
    String(rrr) +
    "\\' min=\\'0\\' max=\\'255\\'></br>" +
    "    <span>绿色</span><input id=\\'rangeG\\' type=\\'range\\' value=\\'" +
    String(ggg) +
    "\\' min=\\'0\\' max=\\'255\\'></br>" +
    "    <span>蓝色</span><input id=\\'rangeB\\' type=\\'range\\' value=\\'" +
    String(bbb) +
    "\\' min=\\'0\\' max=\\'255\\'></br>" +
    "    </br>" +
    "    <input type=\\'button\\' id=\\'btn1\\' οnclick=\\'postLed()\\' value=\\'提交\\' />" +
    "</body>" +
    "</html>";

  esp8266_server.send(200, "text/html", myhtmlPage);

}

// 设置处理404情况的函数'handleNotFound'
void handleNotFound() {
  esp8266_server.send(404, "text/plain", "404: Not found"); // 发送 HTTP 状态 404 (未找到页面) 并向浏览器发送文字 "404: Not found"
}
//遍历更新每一个灯珠
void showLed() {
  pixels.setBrightness(bright);
  pixels.clear();
  for (int i = 0; i < NUMPIXELS; i++) {
    pixels.setPixelColor(i, rrr, ggg, bbb); // Moderately bright green color.
    pixels.show(); // This sends the updated pixel color to the hardware.
    delay(1);
  }
}


  • 串口编译信息
使用 1.0  版本的库 ESP8266WiFi 在文件夹: C:\\Users\\Administrator\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.7.4\\libraries\\ESP8266WiFi 
使用 1.0  版本的库 ESP8266WebServer 在文件夹: C:\\Users\\Administrator\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.7.4\\libraries\\ESP8266WebServer 
使用 1.9.0  版本的库 Adafruit_NeoPixel 在文件夹: C:\\Users\\Administrator\\Documents\\Arduino\\libraries\\Adafruit_NeoPixel 
"C:\\\\Users\\\\Administrator\\\\AppData\\\\Local\\\\Arduino15\\\\packages\\\\esp8266\\\\tools\\\\xtensa-lx106-elf-gcc\\\\2.5.0-4-b40a506/bin/xtensa-lx106-elf-size" -A "d:\\\\arduino\\\\MyHexDir/WebRandom.ino.elf"
项目使用了 294588 字节,占用了 (28%) 程序存储空间。最大为 1044464 字节。
全局变量使用了29112字节,(35%)的动态内存,余留52808字节局部变量。最大为81920字节。
  • 转载文章:https://blog.csdn.net/weixin_43833645/article/details/115128471

以上是关于Arduino ESP8266 网页控制ws2812示例的主要内容,如果未能解决你的问题,请参考以下文章

Arduino ESP8266/32 自定义IO组网页状态显示与控制

Arduino ESP8266 自定义IO组网页状态显示与控制-改版

Arduino ESP8266 使用Websoket协议通讯网页控制RGB灯

Arduino IDE for ESP8266教程网页控制灯 简单页面

Arduino ESP8266基于异步http网页定时器

esp8266网页控制RGB灯颜色