🚀你的飞牛NAS加一块监控小屏✨ —— ESP8266 & 12864联动Linux主机教程📚
Hey科技宅们!👋 是时候给你的飞牛NAS(或者任何Linux主机)添上一抹未来感了!🌟 今天,我们就来DIY一个超酷的UDP监控小屏,用ESP8266微控制器搭配12864图形液晶显示板,实时监控你的系统状态!📊
🔧 所需材料:
ESP8266开发板(NodeMCU、Wemos D1等均可)
12864图形液晶显示板
面包板及连接线
电脑一台(用于编程)
Linux主机(你的飞牛NAS或其他)
💻 步骤一:ESP8266编程
安装Arduino IDE:确保你的电脑上装有Arduino IDE,并添加ESP8266开发板支持。
编写UDP接收代码:使用WiFiUDP库,编写代码接收来自Linux主机的UDP数据包。
显示数据处理:解析接收到的数据,并在112864屏幕上显示,比如CPU使用率、内存占用等。
💻 步骤二:Linux主机配置
安装青龙面板或Python脚本:用于发送UDP数据包。
编写发送脚本:定期收集系统信息,并通过UDP发送到ESP8266的IP和端口。
🔌 硬件连接
ESP8266与12864接线:根据i2c协议,连接ESP8266的GPIO口到显示屏的引脚 scl-D1 SDA-D2 VCC-3.3V GND-GND。
供电:确保ESP8266和显示屏都能正确供电。
🔥 测试与调试
上传代码到ESP8266:通过USB连接电脑,上传编写好的Arduino代码。
运行Linux发送脚本:启动你的发送脚本,确保数据能够成功发送到ESP8266。
观察显示:如果一切设置正确,112864屏幕上应该会显示来自Linux主机的系统监控信息啦!🎉
💡 小贴士:
调整发送频率和显示内容,以适应你的具体需求。
在Arduino以及python代码修改wifi密码以及相对应的端口号.
现在,你的飞牛NAS不仅有强大的存储功能,还多了一个炫酷的实时监控系统!😎 无论是放在书架上还是工作台上,都能成为焦点!快来动手试试吧,让科技点亮你的日常生活!✨
别忘了,完成后在评论区晒出你的作品哦!📸 我们期待看到你的创意实现!
import socket
import time
import psutil # 用于获取系统信息
# ESP8266的IP地址和端口
ESP_IP = "192.168.10.245" # 替换为ESP8266的IP地址
ESP_PORT = 8888
# 创建一个UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def get_cpu_temperature():
"""获取CPU温度(需要根据系统适配)"""
try:
with open("/sys/class/thermal/thermal_zone0/temp", "r") as f:
temp = float(f.read().strip()) / 1000 # 转换为摄氏度
return temp
except FileNotFoundError:
return 0.0 # 如果无法获取温度,返回0.0
def get_cpu_usage():
"""获取CPU占用率"""
return psutil.cpu_percent(interval=1)
def get_memory_usage():
"""获取内存占用率"""
return psutil.virtual_memory().percent
def get_current_time():
"""获取当前时间并格式化为字符串(去掉秒)"""
return time.strftime("%Y-%m-%d %H:%M") # 格式:年-月-日 时:分
def send_system_info():
"""获取系统信息并发送到ESP8266"""
cpu_temp = get_cpu_temperature()
cpu_usage = get_cpu_usage()
memory_usage = get_memory_usage()
current_time = get_current_time()
# 格式化数据为字符串
data = f"Time: {current_time}, CPU Temp: {cpu_temp:.1f}, CPU Usage: {cpu_usage:.1f}, Memory Usage: {memory_usage:.1f}"
# 发送UDP数据包
udp_socket.sendto(data.encode("utf-8"), (ESP_IP, ESP_PORT))
print(f"Sent: {data}")
if __name__ == "__main__":
try:
while True:
send_system_info()
time.sleep(3) # 每3秒发送一次
except KeyboardInterrupt:
print("Program terminated.")
finally:
udp_socket.close()
#include <U8g2lib.h> // OLED 显示库
#include <ESP8266WiFi.h> // ESP8266 Wi-Fi库
#include <WiFiUdp.h> // UDP 库
// Wi-Fi配置
const char* ssid = "wifi名";
const char* password = "wifi密码";
// UDP 配置
WiFiUDP udp;
unsigned int localU**ort = 8888; // ESP8266 监听的 UDP 端口
char packetBuffer[512]; // 接收数据包缓冲区
// OLED 初始化
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
void setup() {
Serial.begin(115200);
// 初始化 OLED
u8g2.begin();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.drawStr(0, 10, "Connecting WiFi...");
u8g2.sendBuffer();
// 连接 Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// 显示 Wi-Fi 连接成功
u8g2.clearBuffer();
u8g2.drawStr(0, 10, "Wi-Fi Connected");
u8g2.drawStr(0, 25, "IP:");
u8g2.drawStr(20, 25, WiFi.localIP().toString().c_str());
u8g2.drawStr(0, 40, "RSSI:");
u8g2.setCursor(30, 40);
u8g2.print(WiFi.RSSI());
u8g2.drawStr(50, 40, "dBm");
u8g2.sendBuffer();
// 启动 UDP 监听
udp.begin(localU**ort);
Serial.print("UDP listening on port ");
Serial.println(localU**ort);
}
void loop() {
// 检查是否有 UDP 数据包
int packetSize = udp.parsePacket();
if (packetSize) {
// 读取 UDP 数据包
int len = udp.read(packetBuffer, sizeof(packetBuffer) - 1);
if (len > 0) {
packetBuffer[len] = '\0'; // 数据包末尾添加 null 终止符
// 解析数据包
char timeStr[20];
float c**mp, cpuUsage, memoryUsage;
sscanf(packetBuffer, "Time: %19[^,], CPU Temp: %f, CPU Usage: %f, Memory Usage: %f",
timeStr, &c**mp, &cpuUsage, &memoryUsage);
// 显示数据到 OLED
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr);
// 显示时间
u8g2.drawStr(0, 10, "Time:");
u8g2.drawStr(40, 10, timeStr);
// CPU 温度
u8g2.drawStr(0, 25, "CPU Temp:");
u8g2.setCursor(70, 25);
u8g2.print(c**mp);
u8g2.drawStr(100, 25, "C");
// CPU 占用率
u8g2.drawStr(0, 40, "CPU Usage:");
u8g2.setCursor(70, 40);
u8g2.print(cpuUsage);
u8g2.drawStr(100, 40, "%");
// 内存占用率
u8g2.drawStr(0, 55, "Mem Usage:");
u8g2.setCursor(70, 55);
u8g2.print(memoryUsage);
u8g2.drawStr(100, 55, "%");
u8g2.sendBuffer();
// 打印到串口监视器
Serial.println("Received Data:");
Serial.print(" ");
Serial.println(timeStr);
Serial.print("CPU Temp: ");
Serial.print(c**mp);
Serial.println(" C");
Serial.print("CPU Usage: ");
Serial.print(cpuUsage);
Serial.println(" %");
Serial.print("Memory Usage: ");
Serial.print(memoryUsage);
Serial.println(" %");
}
}
delay(3000); // 每3秒刷新一次
}
|