Arduino小项目1---esp8266 WiFi 签到机

2023-05-16

Arduino小项目1---ESP8266 WiFi 签到机

  • 前言
  • 0.使用的材料和软件
  • 1.准备一个HTML网页
    • A.搭建出适合手机的页面框架
    • B.在body中加入表单元素
      • form标签:它的常用属性是action,就是把表单提交给服务器哪个页面。
      • input标签:它的常用属性有
      • select和option标签:选择列表和选择选项
      • br标签:换行符
    • C.让网页打开时获取当前浏览器的时间
  • 2. esp8266端作为服务器准备
    • 包含头文件
    • 将index.html转换为一个c字符串
    • 初始化配置
    • 服务器获取手机页面发送过来的信息
    • 获取签到列表
    • loop循环中

前言

这个项目的使用需求是这样的,有一个管理员老师给我提了一个需求,学校里的所有教室每天都会安排专门的学生去打扫卫生,而值日需要打扫卫生的学生来管理员办公室签到,签到的时候需要有人在办公室值守,这就浪费了一个人的宝贵时间。他就问我可不可以做一个签到机,不用让人一直守在那里,我说当然可以,而且还很简单,下面我们说干就干。

0.使用的材料和软件

  1. VScode软件(VScode需要安装PlatformIO插件、liveServer插件)在这里插入图片描述
  2. 手机一台(只要能连接WiFi就都OK)
  3. ESP8266芯片一个(我使用的是nodemcu)

1.准备一个HTML网页

此HTML页面要适配手机,使用一些简单的JavaScript代码,和一些简单的css代码,因为要采集学生的数据,此处我们主要学习表单《form》《input》的具体使用,让我们现学现用。
此处编写html代码我们可以在vscode中进行,配合liveServer插件即时查看网页编写效果,非常方便。

A.搭建出适合手机的页面框架

如果不懂html编程,以下代码是固定的,可以适配所有型号的手机

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
    <title>值日签到表</title>
</head>
<body>
</body>
</html>

B.在body中加入表单元素

form标签:它的常用属性是action,就是把表单提交给服务器哪个页面。

input标签:它的常用属性有

  1. type:为text或者number(必须有)
  2. name和value:组成键值对(必须有),此处的value值会显示在浏览器上
  3. id:此标签的唯一标识符(最好有,方便后期用css写效果)
  4. readonly:从字面意思就知道是只读
  5. maxlength和minlength:验证输入框文字的最大长度和最小长度,若不在此区间,表单无法提交
  6. required:此输入框不填,表单无法提交

select和option标签:选择列表和选择选项

  1. option必须要放在select标签里面
  2. select要有name属性
  3. option可以有 selected属性,那个option设置为selected浏览器就显示哪个选项
  4. option可以有任意个数量

br标签:换行符

<form action="/ok" >
        <label for="" id="time1">签到时间:</label><br>
        <input type="text" name="time" id="time" value="" readonly>
        <br><br>
        <label for="">请选择 班级:</label><br>
        <select name="nianji">
            <option value="2016级">2016级</option>
            <option value="2017级">2017级</option>
            <option value="2018级">2018级</option>
            <option value="2019级">2019级</option>
            <option value="2020级">2020级</option>
        </select>
        <select name="zhuanye">
            <option value="财务管理">财务管理</option>
            <option value="酒店管理">酒店管理</option>
            <option value="计算机科学技术">计算机科学技术</option>
        </select>
        <select name="benzhuan">
            <option value="本科">本科</option>
            <option value="专科">专科</option>
            <option value="专升本">专升本</option>
        </select>
        <select name="banji">
            <option value="1班">1班</option>
            <option value="2班">2班</option>
            <option value="3班">3班</option>
            <option value="4班">4班</option>
        </select><br>
        <br>
        <label for="">请选择 打扫教室:</label><br>
        <select name="lou" id="lou" >
            <option value="自勉堂">自勉堂</option>
        </select>
        <select name="jiaoshihao" id="jiaoshihao" >
            <option value="501">501</option>
            <option value="502">502</option>
            <option value="503">503</option>
            <option value="504">504</option>
            <option value="505">505</option>
            <option value="506">506</option>
        </select>
        <br><br>
        <label for="">请输入 姓名:</label><br>
        <input id="xingming" type="text" name="xingming" minlength="2" maxlength="3" required >					  			
        <br><br>
        <label for="">请输入 电话:</label><br>
        <input id="dianhua" type="text" name="dianhua" minlength="11" maxlength="11" required >
        <br><br>
        <input id="tijiao" type="submit" value="签到">
    </form>

C.让网页打开时获取当前浏览器的时间

<script>
    var myDate = new Date();
    document.getElementById("time").value =myDate.toLocaleString();
</script>

2. esp8266端作为服务器准备

包含头文件

#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <FS.h>

将index.html转换为一个c字符串

这是最笨的方法, 也比较麻烦, 后期可以有更简单的方法处理这些html文件

const char responseHTML[] PROGMEM=  ""
									"<!DOCTYPE html>"
									"<html lang=\"zh\">"
									"<head>"
									"    <meta charset=\"UTF-8\">"
									"    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no\">"
									"    <title>自勉堂值日签到处</title>";

String responseHTMLOk = ""
                        "<!DOCTYPE html>"
                        "<html lang=\"zh\">"
                        "<head>"
                        "    <meta charset=\"UTF-8\">"
                        "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no\">"
                        "    <title>JavaScript</title>"
                        "</head>"
                        "<body>"
                        "    <h1>签到成功!</h1>"
                        "</body>"
                        "</html>";

初始化配置

void setup() {
  Serial.begin(115200);
  SPIFFS.begin();
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  WiFi.softAP("自勉堂值日签到表");

  // if DNSServer is started with "*" for domain name, it will reply with
  // provided IP to all DNS request
  dnsServer.start(DNS_PORT, "*", apIP); //强制门户认证
  
  // replay to all requests with same HTML
  webServer.on("/ok", handleOk);
  webServer.on("/list",handleList);

  webServer.onNotFound([](){
    webServer.send(200, "text/html", responseHTML);
  });
  webServer.begin();
}

服务器获取手机页面发送过来的信息

void handleOk(){
  String time,nianji,zhuanye,benzhuan,banji,lou,jiaoshihao,xingming,dianhua;//获取浏览器发来的formdata
  time = webServer.arg("time");
  nianji = webServer.arg("nianji");
  zhuanye = webServer.arg("zhuanye");
  benzhuan = webServer.arg("benzhuan");
  banji = webServer.arg("banji");
  lou = webServer.arg("lou");
  jiaoshihao = webServer.arg("jiaoshihao");
  xingming = webServer.arg("xingming");
  dianhua = webServer.arg("dianhua");

  if (xingming == "郭闪" && dianhua == "13513710972") { 
    handleList();
  } else {
    File list = SPIFFS.open("/list.txt","a+"); //将签到信息写入到list.txt文件中
    list.print(time);list.print("--");
    list.print(nianji);list.print("--");
    list.print(zhuanye);list.print("--");
    list.print(benzhuan);list.print("--");
    list.print(banji);list.print("--");
    list.print(lou);list.print("--");
    list.print(jiaoshihao);list.print("--");
    list.print(xingming);list.print("--");
    list.println(dianhua);
    list.close();
    webServer.send(200,"text/html",responseHTMLOk + time + "<br>" + nianji + zhuanye + benzhuan + banji + "<br>" + lou + jiaoshihao + "<br>" + xingming + "<br>" + dianhua);
    webServer.client().stop();
  }
}

获取签到列表

将list.txt文件发送到浏览器

void handleList(){
  File list = SPIFFS.open("/list.txt","r"); 
  webServer.streamFile(list,"text/plain");
  list.close();
}

loop循环中

void loop() {
  dnsServer.processNextRequest();
  webServer.handleClient();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arduino小项目1---esp8266 WiFi 签到机 的相关文章

随机推荐

  • apscheduler报错maximum number of running instances

    错误详情 span class token punctuation span WARNING span class token punctuation span span class token punctuation span apsch
  • 复杂KBQA问答方法分类

    复杂KBQA问答方法分类 复杂KBQA问答的主流方法有两类 xff0c 基于语义解析 xff08 SP based xff09 和基于信息检索 xff08 IR based xff09 两类 xff0c 顾名思义 xff0c 基于语义解析的
  • 对比损失的PyTorch实现详解

    对比损失的PyTorch实现详解 本文以SiT代码中对比损失的实现为例作介绍 论文 xff1a https arxiv org abs 2104 03602 代码 xff1a https github com Sara Ahmed SiT
  • ctags 基本使用方法

    ctags 基本使用方法 简介 ctags xff08 Generate tag files for source code xff09 是vim下方便代码阅读的工具 尽管ctags也可以支持其它编辑器 xff0c 但是它正式支持的只有 V
  • Java 生产者和消费者3种实现方式

    使用 Objcet 的 wait 和 notifyAll 实现 使用 BlockingQueue 实现 使用 Lock 的 Condition 的 await signal 实现 使用 Objcet 的 wait 和 notifyAll 实
  • 【python安全攻防】python简易端口扫描器

    文章目录 socket套接字optparse模块socket解析主机进行连接获取bannerthreading多线程端口扫描器python nmap端口扫描 对自己看python绝技的一次学习记录 socket套接字 与TCP端口进行交互
  • EsLint 常用规则

    ESLint 是一个代码规范和错误检查工具 xff0c 有以下几个特性 所有东西都是可以插拔的 你可以调用任意的 rule api 或者 formatter api 去打包或者定义 rule or formatter 任意的 rule 都是
  • qt 手动释放new出堆中的内存,如何释放什么时候释放,qt和c++中使用delete的不同

    http www 360doc com content 20 1019 10 65283686 941181306 shtml
  • C++:error C4996解决方法

    背景 使用fopen sprintf strcpy strstr 等函数 xff0c 在编译c 43 43 程序时报如下错 xff1a error C4996 strncat This function or variable may be
  • call(zoom)_如何解决您的Zoom Call问题

    call zoom A lot of people and businesses have turned to Zoom as their go to video conferencing application However Zoom
  • Nginx配置访问密码(在线|离线安装)

    Nginx配置访问密码 在线 xff5c 离线安装 实现效果 xff1a 1 通过nignx访问的站点或目录 xff0c 需要让用户输入用户名密码才能访问 2 在nginx下 xff0c 提供了ngx http auth basic mod
  • linux下docker安装rabbitmq无法打开控制台

    文章目录 一 安装rabbitmq xff0c 并启动二 访问三 解决问题 linux下使用docker安装rabbitmq后 xff0c 无法访问控制台 xff0c 已解决 一 安装rabbitmq xff0c 并启动 1 拉取镜像 do
  • Wake On Lan(WOL)失败的原因

    Wake On Lan xff0c 失败的原因 发送Magic Packet xff08 魔法数据包 xff09 xff0c 不多阐述 xff0c 如果是编程发包 xff0c 请使用UDP封包 在BIOS中开启 Wake On Lan 选项
  • spring的配置文件

    使用流程 添加spring依赖创建类创建spring配置文件 xff0c 并在配置文件中给要被spring创建和管理的类添加标识 在主程序中加载spring配置文件从容器中获取对象 bean的配置 在spring配置文件中 xff0c 通过
  • 解决vc++运行窗口一闪而过的方法

    1 可以在程序添加头文件 include lt Windows h gt 然后在main函数最后的 return 0 xff1b 前面加上system pause xff1b 2 不要手动按运行键 xff0c 而用快捷键ctrl 43 f5
  • centos 6升级内核小版本、更新yum源和升级gcc版本

    文章目录 前言一 升级内核小版本1 1 设置开机自启动网卡1 2 下载待升级内核小版本的rpm文件1 3 修改内核版本启动顺序 二 更换yum源三 升级g 43 43 版本参考链接 前言 将centos 6 8 2 6 32 642 el6
  • 【PX4_BUG】jMAVSim仿真找不到libawt_xawt.so和libjawt.so文件或jdk版本不匹配的解决方法

    在使用make px4 sitl jmavsim命令进行仿真时出现错误 java lang UnsatisfiedLinkError Can 39 t load library usr lib jvm java 11 openjdk amd
  • Windows Server 2016域控服务器如何取消密码复杂性规则

    图 1 报错截图 具体解决办法 第一步 打开服务器管理 如图直接在 放大镜搜索框里面 直接输入搜索服务器管理或者打开箭头3所示的图标 第二步 点击工具 打开组策略管理 第三步 找到 Default Domain Policy 然后鼠标右击编
  • noVNC搭建

    noVNC搭建 1 环境准备 Os centos7 5准备两台设备 192 168 17 176 和 192 168 17 177 2 安装python环境 安装python3 在192 168 17 176操作如下 查看之前是否存在环境
  • Arduino小项目1---esp8266 WiFi 签到机

    Arduino小项目1 ESP8266 WiFi 签到机 前言0 使用的材料和软件1 准备一个HTML网页A 搭建出适合手机的页面框架B 在body中加入表单元素form标签 xff1a 它的常用属性是action xff0c 就是把表单提