🔥《你的飞牛nas加一块监控小屏》🔥 —— DIY家庭服务器状态一目了然!

发表于:6 天前 硬件折腾 627

🚀你的飞牛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秒刷新一次
}

收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

发表回复

评论列表(7)

佩服楼主的折腾能力,不过nas在角落里,我看app....
4 天前 回复
秀儿啊,干的漂亮
4 天前 回复
佩服楼主的硬核操作,然,吾等小白实属“臣妾做不到啊”。
3 天前 回复
以前玩树莓派的时候也折腾过,屏跟楼主的一毛一样还在,不过现在懒得折腾了,给你的动手能力点赞!
3 天前 回复
挺好,但是我不弄。哈哈,
3 天前 回复
太深奥了,有点难度。
14 小时前 回复
可以,动手能力
半小时前 回复

作者推荐

话题