远程查看干电池电压演示:

开机检测A0电压自动切换模式:
1.0V → 强制热点配置模式
0.2~0.3V → 电压表模式
0.4~0.5V → 电流表模式
0.6~0.7V → 电阻测试模式
0.8~0.9V → 温度计模式
用法:
GND ----- A0 -------------------- 3V
| | |
电阻 _______|______电阻(可调)_______|
就是A0和3V接可调电阻,A0和GND也接电阻(10K/20K/100K)都可以,重启设备
破解页面升级了:

这次破解添加了5个动态密码:
case 0: return ssid + "12345";
case 1: return ssid + "123456";
case 2: return ssid + "12345678";
case 3: return "123" + ssid + "123";
case 4: return ssid;
完整代码展示:
// === Password ===
String commonPasswords[] = {
"", "123456789abc", "qweasdzxc", "123456789", "password", "1234567890a",
"88888888", "999999999", "P@ssword", "qwertyuiop", "administrator",
"Administrator", "Password", "QAZWSXEDC", "00000000", "123456QWETRY", "qazwsxedcrfv",
"abc123456789", "password1", "123123123", "87654321", "qwerty123", "123456qwe",
"admin123", "qwertyuiop123", "abc123456abc", "12345678", "1234567890", "password123",
"123456abc", "abc123456", "mnbvcxz", "11111111", "12344321", "66666666",
"lkjhgfdsa", "1qaz2wsx", "aa123456", "qwe123456", "zxcvbnm", "asdfghjkl",
"password1234", "zvs142857", "987654321", "RASSWORD"
};
const int passwordCount = sizeof(commonPasswords) / sizeof(commonPasswords[0]);
const int STATIC_PASSWORD_COUNT = sizeof(commonPasswords) / sizeof(commonPasswords[0]);
const int DYNAMIC_PASSWORD_COUNT = 5;
const int TOTAL_PASSWORD_COUNT = STATIC_PASSWORD_COUNT + DYNAMIC_PASSWORD_COUNT;
String getPasswordForIndex(int idx, const String& ssid) {
if (idx < STATIC_PASSWORD_COUNT) {
return commonPasswords[idx];
} else {
int d = idx - STATIC_PASSWORD_COUNT;
switch (d) {
case 0: return ssid + "12345";
case 1: return ssid + "123456";
case 2: return ssid + "12345678";
case 3: return "123" + ssid + "123";
case 4: return ssid;
default: return "";
}
}
}
假如有个网络名是ESP8266-WiFi,那么最后5个会尝试这些密码:
ESP8266-WiFi12345
ESP8266-WiFi123456
123ESP8266-WiFi123
ESP8266-WiFi
头文件升级:
#include <ESP8266WiFi.h>
#include <U8g2lib.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>
#include <EEPROM.h>
#include <TimeLib.h>
#include <NtpClientLib.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h>
#include <SimpleTimer.h>
#include <Wire.h>
#include <FS.h>
#include <lwip/napt.h> // WiFi NAT
extern "C" {
#include <user_interface.h>
bool wifi_softap_deauth(uint8_t *mac);
}
#define BUTTON_PIN 14 // D5 GPIO14
bool lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;
这个 lwip/napt.h 是WiFi放大,已在V15.7以上包含(V16.4升级了)
这个“#include <user_interface.h>”是点击“挂起”后重定向127.0.0.1+ Deauth
接下来介绍下Deauth:
Deauth 是 Deauthentication(解除认证)的缩写。在无线网络(Wi-Fi)领域,它指的是一种管理帧,用于通知一个设备断开与无线接入点(如路由器)的连接。
简单来说,Deauth 就像一把“万能钥匙”,可以强制把任何 Wi-Fi 设备踢下线。
1. 它的正常用途
在 IEEE 802.11(无线局域网标准)协议中,Deauth 帧是标准功能,用于优雅地终止连接。例如:
当你手动点击“断开 Wi-Fi”时,手机会发送 Deauth 帧告诉路由器“这个设备需要强制断开连接”。
路由器在重启或踢开信号太弱的设备时,也会发送 Deauth 帧。
攻击原理:
攻击者使用无线网卡发送伪造的 Deauth 帧,假装自己是路由器发给你的手机,或者假装是你的手机发给路由器。收到这个帧后,你的设备就会断开连接。
这个应用到ESP8266 V16.4(目前只有16.4才有)
点击操作的"挂起"按钮
点击之后,会重定向127.0.0.1,还会发送Deauth,这是为了增加安全性,阻止其他设备蹭网,这时点击"挂起"不要"断开"
对应代码:
} else if (action == "suspend") {
suspendedMAC = mac;
connectedClients[i].isSuspended = true;
redirectActive = true;
message = "已挂起设备: " + mac + ",设备将被重定向";
Serial.println("设备 " + mac + " 已被标记为挂起状态");
sendDeauthToClient(mac); // WiFi Deauth
dnsServer.start(DNS_PORT, "*", IPAddress(127,0,0,1));
} else if (action == "resume") {
if (suspendedMAC == mac) {
suspendedMAC = "";
redirectActive = false;
}
其中,
sendDeauthToClient(mac); // WiFi Deauth
dnsServer.start(DNS_PORT, "*", IPAddress(127,0,0,1));
就包含了重定向127.0.0.1+Deauth
当检查时发现陌生设备连接时,就找到陌生设备的MAC地址,点击"挂起"
所有功能展示:
1. 时钟模式
NTP 网络自动校时(time.windows.com)
日期显示(年-月-日)
时间显示(时:分:秒,含秒)
温度显示(LM35DZ 或 NTC 热敏电阻)
天气推断(根据温度显示:❄️雪天 / ☁️阴天 / 🌧️雨天 / ☀️晴天 / 🔥Very Hot!)
自动识别 OLED(I2C 地址 0x3C / 0x3D)
⚡ 2. 万用表模式(A0 模拟测量,一键切换)
电压表:0–3.3V,自动切换 mV / V
电流表:uA / mA / A 自适应(需外接采样电阻)
电阻计:Ω / kΩ / MΩ 自动换挡(分压法)
温度计:NTC 热敏电阻,Steinhart-Hart 方程,精度 ±1°C
📡 3. WiFi 功能
扫描周边网络(按信号强度排序)
密码字典测试(50+ 静态弱密码 + 动态生成如“SSID+123456”)
开放网络自动连接
优先连接预设网络(3 个固定 + 自动扫描开放网络)
自动保存成功连接的 WiFi 凭证(EEPROM,最多 10 组)
断线重连
WiFi仅供学习使用,这里只演示效果
🔥 4. 热点模式 + 设备管理
开放热点 ESP8266(可配置密码)
Web 管理界面(http://192.168.4.1)
查看连接设备(IP、MAC、设备类型识别)
设备操作:
断开设备(发送 Deauth 帧,强制踢出)
挂起设备(DNS 劫持到 127.0.0.1,能连 WiFi 但无法上网)
恢复设备(取消劫持)
热点状态监控(断开后 60 秒自动恢复)
📶 5. NAT 信号放大
启用/禁用 NAT(网络地址转换)
让连接热点的设备通过 ESP8266 的上级 WiFi 上网,实现简易 WiFi 中继/信号放大
6. OTA 更新
自动检查云端更新(解析论坛页面版本号)
本地文件系统版本检查(预定义版本数组)
通过 HTTP 下载并更新固件(ESPhttpUpdate)
支持网页手动上传 .bin 固件
更新失败自动回滚(不变砖)
7. 蓝屏保护机制
触发条件:
NTP 时间同步失败(年份 < 2000 且重试 5 次)
内存不足(< 10KB)
所有 WiFi 连接失败
模拟 Windows 蓝屏样式(:( + 进度条)
进度条随机增长(1%~10% 增量),制造“收集错误信息”的视觉效果
结束后自动重启
8. 硬件交互
按键(D5 GPIO14):单击强制切换到热点模式
A0 电压检测启动模式(上电时):
1.0V → 强制热点配置模式
0.2~0.3V → 电压表模式
0.4~0.5V → 电流表模式
0.6~0.7V → 电阻测试模式
0.8~0.9V → 温度计模式
🧠 9. 系统管理
实时内存(RAM)监控(低于 10KB 触发蓝屏)
看门狗定时器防死机
EEPROM 存储多组 WiFi 凭证
串口调试输出
10. Web 管理页面(全功能)
主页:设备信息 + 设备管理表格
WiFi 配置:扫描并连接网络
密码管理:查看/删除已保存的 WiFi 密码
高级设置:手动同步 NTP、启用/禁用 NAT、查看内存/Flash
万用表模式切换(电压/电流/电阻/温度页面)
OTA 更新上传
蓝屏测试触发
11. 设备类型识别
根据 MAC 地址前缀识别品牌(Apple/HUAWEI/XIAOMI/VMware/Windows)
12. 其他
支持 SPIFFS 文件系统
SimpleTimer 独立刷新 OLED
多模式状态机:时钟 / 破解 / 热点 无缝切换
V12.8古老蓝屏:
好像从V15就把":("放到了左上角,这样猜像Windows蓝屏
V15.7以上就随机百分比+清理内存
常见问题解决(必读):
1:不会写代码怎么办?不会写代码也能复刻!zvs142857 WiFi OLED V16.4.txt这个文件是源码,zvs142857 ESP8266 V16.4.zip里面有.bin(固件)还有.mix(Mixly文件)不必担心无法复刻
2:编译器报错,上传失败:如果用Mixly上传,不要把.cpp和.mix文件搞一起,不要在压缩包直接打开.mix文件,可以把.mix文件复制桌面再上传
3:连不上网络:代码不能直接复制粘贴,先找到这里(Ctrl+F是查找):
// === 加载优先连接网络模块 ===
void initPriorityNetworks() {
strcpy(priorityNetworks[0].ssid, "1");// WiFi名称需要修改
strcpy(priorityNetworks[0].password, "输入密码");
strcpy(priorityNetworks[1].ssid, "2");// WiFi名称需要修改
strcpy(priorityNetworks[1].password, "输入密码");
strcpy(priorityNetworks[2].ssid, "3");// WiFi名称需要修改
strcpy(priorityNetworks[2].password, "输入密码");
把1、2、3换成网络名,把"输入密码"换成密码
还有这里:
// === 检查并更新配置 ===
void checkAndUpdateConfig() {
Serial.println("=== Update SSID and Passwords ===");
if (strcmp(priorityNetworks[0].ssid, "输入WiFi名称") == 0) {
strcpy(priorityNetworks[0].ssid, "1");// WiFi名称需要修改
strcpy(priorityNetworks[0].password, "密码");
configUpdated = true;
}
if (strcmp(priorityNetworks[1].ssid, "输入备用WiFi名称") == 0) {
strcpy(priorityNetworks[1].ssid, "2");// WiFi名称需要修改
strcpy(priorityNetworks[1].password, "密码");
configUpdated = true;
}
if (strcmp(priorityNetworks[2].ssid, "输入备用WiFi名称2") == 0) {
strcpy(priorityNetworks[2].ssid, "3");// WiFi名称需要修改
strcpy(priorityNetworks[2].password, "密码");
configUpdated = true;
}
if (strcmp(priorityNetworks[3].ssid, "输入备用WiFi名称3") == 0) {
strcpy(priorityNetworks[3].ssid, "");
strcpy(priorityNetworks[3].password, "");
configUpdated = true;
}
if (strcmp(priorityNetworks[4].ssid, "输入备用WiFi名称4") == 0) {
strcpy(priorityNetworks[4].ssid, "");
strcpy(priorityNetworks[4].password, "");
configUpdated = true;
}
if (configUpdated) {
Serial.println("配置更新完成!");
}
}
替换成自己的即可。
4:没有Mixly怎么办?其实用其他的也可以,但是Mixly支持积木和代码(MIXLY可以下载)
5:写不进去代码怎么办?检查COM端口,像以下情况,说明系统无法识别,需要换成数据线+串口驱动.rar

还是上次一样:此电脑+管理……
COM1是Windows的端口,要切换成ESP8266的
上次说的不准确,COM3~COM10,准确来说打开设备管理器点击"端口"查看是否有相似设备:
USB-SERIAL CH340
USB-SERIAL CH210
Silicon Labs CP210x USB to UART Bridge
Silicon Labs CP340x USB to UART Bridge
CH340 USB
CH343 USB SERIAL
CH341G ESP8266
ESP8266 USB CH340
CH210 USB ESP-12E
CH340 ESP12F
WCH USB CH340
WCH
ESP8266
……
如果没有,显示"其他设备"就要安装驱动
后面一般带(COM3)(COM4)(COM5)(COM6)(COM7)(COM8)……(只要不是COM1 COM2就对)
废话不多说直接复刻!
Update界面一样
“高级”页面就新增了
从

到

只需10秒左右,直接完成了更新,连接服务器等
以后只发更新了
最后,你觉得它还能干什么?
评论区交给你来“定义”下一版功能 [doge]

全部评论