ESP8266制作天气预报海藻球微景观生态缸记录(五)-增加网页控制亮度并保存进EEPROM

加上了一个亮度控制的滑块,滑动滑块,改变亮度变量的值,达到控制灯光亮度的目的。

在改变亮度值的同时,将亮度值写入EEPROM,这样下次开机,会依然保持上次设定的亮度值。

 

代码如下:

#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <EEPROM.h>//引入eeprom库文件
const char* PARAM_INPUT_LIGHTVALUE = "lightValue";//设定从网页发送来的灯光亮度请求名
String light = "150";//彩灯缺省亮度
//设置这个异步网页服务器的端口为80
AsyncWebServer server(80);
//要打印的首页
//标记在%之间的LIGHTVALUE,是要向网页处理器发出名为LIGHTVALUE的请求,然后获得值[对于本例,就是灯光亮度]
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>ESP 网页服务器</title>
</head>
<body>
    <h2>彩灯控制</h2>
    <p>当前灯光亮度:<span id="textLightValue">%LIGHTVALUE%</span>/255</p>
    <p>设置灯光亮度:<input type="range" min="0" max="255" value="%LIGHTVALUE%" step="1" onchange="changeLightValue(this.value)"></p>
    <script>
        function changeLightValue(value) {
            var sliderValue = value;
            document.getElementById("textLightValue").innerHTML = sliderValue;
            console.log(sliderValue);
            var xhr = new XMLHttpRequest();
            xhr.open("GET", "/sliderLight?lightValue=" + sliderValue, true);
            xhr.send();
        }
    </script>
</body>
</html>
)rawliteral";
//网页处理器
String processor(const String& var){
  if (var == "LIGHTVALUE"){//如果收到的是名为LIGHTVALUE的请求,则返回当前light变量里的值.
    return light;
  }
  return String();
}
void setup() {
//启用EEPROM
EEPROM.begin(1024);
if(get_String(EEPROM.read(0),1)!=0)//设定灯光初始亮度,如果从EEPROM中找到数据【不为0】,则输出EEPROM中的数据。
  {
    light=get_String(EEPROM.read(0),1);
  }
// 开始设置web服务器——首页设置
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);//把index_html变量的内容,打印出去
  });
// 开始设置web服务器——彩灯亮度控制设置
  server.on("/sliderLight", HTTP_GET, [] (AsyncWebServerRequest *request) {
    String inputMessage;
    if (request->hasParam(PARAM_INPUT_LIGHTVALUE)) {
      inputMessage = request->getParam(PARAM_INPUT_LIGHTVALUE)->value();//get传递过来的value参数
      light = inputMessage;//设置灯光亮度为网页滑块控制的亮度
      set_String(0,1,light);//保存进EEPROM
    }
    Serial.println(inputMessage);
    request->send(200, "text/plain", "OK");
  });
  // 启动网页服务
  server.begin();
}
void loop() {
strip.setBrightness(atoi(light.c_str()));//达到一旦light变量变化,则灯光亮度也变
}
//字符串写入EEPROM
//以light亮度变量为例。a=0;b=1;代表第0位存储亮度字符串的长度,从第1位开始逐字存储。
//如果以后再存入下一个变量,则a的值应为light的长度+1,b的值应为a的长度+1
//如果以后再存入下一个变量,则a的值应为light的长度+1+上一个变量的长度+1;b的值为a的长度+1
//以此类推
//但实际上,如果不怕浪费EEPROM,不必这样计算下一个变量的存储起始位置,直接从假设的上一个变量长度的最大值开始即可。
void set_String(int a,int b,String str){
  EEPROM.write(a, str.length());//EEPROM第a位,写入str字符串的长度
  //把str所有数据逐个保存在EEPROM
  for (int i = 0; i < str.length(); i++){
    EEPROM.write(b + i, str[i]);
  }
  EEPROM.commit();
}

//从EEPROM读取字符串
//对于light来讲,a=EEPROM.read(x);b=1;此时的a为从eeprom中取得的字符串长度
//对于下一个变量来讲,则a=EEPROM.read(a的长度+1);b=a的长度+1
//对于下一个变量来讲,则a=EEPROM.read(a的长度+1+上一个变量的长度+1);b=a的长度+1
//以此类推
//但实际上,如果不怕浪费EEPROM,不必这样计算下一个变量的存储起始位置,直接从假设的上一个变量的最长度大值开始即可。
String get_String(int a, int b){ 
  String data = "";
  //从EEPROM中逐个取出每一位的值,并链接
  for (int i = 0; i < a; i++){
    data += char(EEPROM.read(b + i));
  }
  return data;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玩编程的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值