编辑导语:按钮设计是产品设计中的必要模块,合理的按钮设计可以让用户有更清晰的认知,一定程度上提升用户的产品使用体验。本篇文章里,作者便对按钮结构、按钮状态、按钮开发对接技巧等方面做了总结,一起来看一下。
按钮是每个产品设计当中必备的交互元素,可以说是整个Ixd设计当中最为重要的一环。
2024年12月26日
编辑导语:按钮设计是产品设计中的必要模块,合理的按钮设计可以让用户有更清晰的认知,一定程度上提升用户的产品使用体验。本篇文章里,作者便对按钮结构、按钮状态、按钮开发对接技巧等方面做了总结,一起来看一下。
按钮是每个产品设计当中必备的交互元素,可以说是整个Ixd设计当中最为重要的一环。
2024年12月26日
准备:
1、智能网络模块(WIFI模块ESP8266-12S/12F)见底图
2、Arduino IDE 最新版 (1.8.13)
目的:
1、通过固件访问内置网页可以进行重置WIFI密码 (见底图)
2、通过固件内嵌网页可以进行指令测试(通过网页模拟串口发送指令)
void HandleVal()
{
handlenum++;
if(handlenum>1)handlenum=-1;
if(handlenum==0||handlenum==2)return;
String wifis = server.arg("ssid"); //wifi名称
String wifip = server.arg("password"); //wifi密码
String testcmd=server.arg("cmd"); //命令测试
wifis.trim();
if(wifis!=""&&handlenum==1)
{
Serial.println("Received webServer Config info:");Serial.println(wifis); Serial.println(wifip);
WiFi.mode(WIFI_STA);
WiFi.begin(wifis,wifip);//连接成功自动保存
if((WiFi.status()== WL_CONNECTED))
{
strcpy(wifi_ssd,wifis.c_str());//名称复制 wifis WiFi.SSID().c_str()
strcpy(wifi_psw,wifip.c_str());//密码复制 wifip WiFi.psk().c_str()
rom_save();//保存wifi及模式参数 到EEPROM 断电记忆
//ESP.reset();//重启
}
}
testcmd.trim();//去掉前后空格
if(testcmd!=""&&handlenum==1)
{
Serial.print("Recv Web Commond:");Serial.println(testcmd);
doAction_local(testcmd);//与串口一致的执行函数(本地,网络,串口等统一到此中执行减少代码量)
testcmd="";
}
}
/*****************************************************
* 函数名称:handleNotFound()
* 函数说明:响应失败函数
* 参数说明:无
******************************************************/
void handleNotFound() {
digitalWrite(led_PIN, 0);//指示灯LED_BUILTIN
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
led2(500,8);//0.3s-3次循环-余1灭
}
/*****************************************************
* 函数名称:htmlConfig()
* 函数说明:web配置WiFi函数 (当智能配网失败时调用)
* 参数说明:无
* 调用方法 [b]setup[/b]()中进行初始化
******************************************************/
void htmlConfig()
{
WiFi.mode(WIFI_AP_STA);//设置模式为AP+STA双模式
digitalWrite(led_PIN, LOW);
//IPAddress softLocal(192,168,128,1);
//IPAddress softGateway(192,168,128,1);
//IPAddress softSubnet(255,255,255,0);
//WiFi.softAPConfig(softLocal, softGateway, softSubnet);
String apName = ("9I"+(String)ESP.getChipId()); // 2 设置WIFI名称
//const char *softAPName = apName.c_str();
apssid= apName.c_str();
WiFi.softAP(apssid, appassword);
IPAddress myIP = WiFi.softAPIP();
if (MDNS.begin("esp8266")) {//hostString=esp8266
Serial.println("web open url:esp8266.local or 192.168.4.1");
}
server.on("/", handleRoot); //回调 html,请求
server.on("/HandleVal", HTTP_GET, HandleVal); //连接
server.onNotFound(handleNotFound); //请求失败回调函数 (可选)
server.begin();//开启服务器
Serial.println("HTTP server started");
}
2024年12月26日
HTML 框架
框架的作用就是把浏览器窗口划分成多个子窗口。
每个子窗口可以载入各自的HTML文档。
框架(frameset)与页面主体body是同级的关系
1.框架的整体结构
<frameset rows="高度"> ~ </frameset>
<frameset cols="宽度"> ~ </frameset>
<frame src="http://www.haook.cn" name="框架名称">