# 墨水屏 **Repository Path**: wenglei907/ink-screen ## Basic Information - **Project Name**: 墨水屏 - **Description**: 墨水屏esp32(arduino)代码,功能:日历、天气、GPS。 - **Primary Language**: Arduino - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-10-23 - **Last Updated**: 2025-10-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 墨水屏 #### 介绍 墨水屏esp32(arduino)代码,功能:日历、天气、GPS。 1.硬件架构设计 (1) 核心控制层:以ESP32-WROOM为主控,协调Wi-Fi、蓝牙、传感器及屏幕驱动; (2) 数据采集层:GPS模块(定位与活动参数);DS18B20(环境温度检测); (3) 显示层:4.2英寸电子纸墨水屏,支持局部刷新与低功耗显示; (4) 通信层:Wi-Fi(天气数据)、低功耗蓝牙(小程序交互)、串口(GPS通信); (5) 电源管理:小聚合物锂电池供电(3.7V/1500mAh) 2.软件架构设计 图3-2 软件架构图 (1)JS构架:采用微信小程序原生JavaScript框架。通过模块化开发,将小程序的页面逻辑、数据请求与业务处理分离,提升代码的可维护性与复用性。在页面交互方面,借助框架提供的事件机制,实现用户操作与界面响应的流畅衔接。 (2)蓝牙通信:码表硬件通过蓝牙低功耗(BLE)技术与小程序建立连接。小程序调用微信官方提供的蓝牙接口,实现设备搜索、配对及连接功能。在数据传输过程中,遵循自定义的数据协议,对码表采集的速度、里程等数据进行封装与解析,确保数据准确无误地传输至小程序端。 (3)云存储:选用腾讯云作为云存储服务提供商,采用对象存储(COS)方式。支持数据的实时同步,方便用户在不同设备上访问个人数据,保障数据的安全性与隐私性。 核心主控代码: void loop() { if (deviceConnected) { switch(receivedValue) { case 1: Serial.println("执行日历显示"); pageDate_init(); pageDate_run(); receivedValue = 0; // 重置为默认值 break; case 2: Serial.println("执行天气显示"); stopBLEMode(); wifi_init(); PageWeather_init(); PageWeather_run(); initBLE(); // 重新初始化 BLE receivedValue = 0; // 重置为默认值 break; case 3: Serial.println("执行GPS显示"); PageGPS_init(); gpsRunning = true; // 启动GPS运行 lastGPSRefresh = millis(); // 记录开始时间 receivedValue = 0; // 重置为默认值 break; case 4: Serial.println("停止GPS显示"); gpsRunning = false; if (deviceConnected && pCharacteristic) { StaticJsonDocument<200> doc; doc["distance"] = totalDistance; doc["time"] = elapsedTime; doc["speed"] = speed; String jsonString; serializeJson(doc, jsonString); jsonString += "\n"; // 添加结束符 // 分块发送逻辑 int totalLength = jsonString.length(); for (int i = 0; i < totalLength; i += BLE_MTU_SIZE) { String chunk = jsonString.substring(i, min(i + BLE_MTU_SIZE, totalLength)); // 转换为二进制数据 uint8_t* pData = (uint8_t*)chunk.c_str(); size_t length = chunk.length(); pCharacteristic->setValue(pData, length); pCharacteristic->notify(); // 直接调用,无需条件判断 Serial.printf("成功发送数据块[%d-%d]\n", i, i + length); delay(15); // 保证发送顺序 } Serial.print("完整数据包已发送:"); Serial.println(jsonString); } else { Serial.println("未连接或特征值未初始化"); } receivedValue = 0; break; default: if (receivedValue != 0) { Serial.print("未处理的值: "); Serial.println(receivedValue); receivedValue = 0; // 重置为默认值 } break; } } // 如果GPS正在运行,每30秒刷新一次 if (gpsRunning && (millis() - lastGPSRefresh >= GPS_REFRESH_INTERVAL)) { PageGPS_run(); lastGPSRefresh = millis(); // 更新上次刷新时间 } handleBLE(); // 处理蓝牙连接状态 delay(100); // 短暂延时以防止CPU过载 }