news 2026/6/12 21:19:57

用掌控板OLED做个桌面天气站:从驱动SH1106到显示动态数据(Arduino IDE)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用掌控板OLED做个桌面天气站:从驱动SH1106到显示动态数据(Arduino IDE)

用掌控板OLED打造智能桌面天气站:从SH1106驱动到动态数据可视化实战

最近在工作室捣鼓掌控板时,突然想到能否用那块小巧的OLED屏幕做个实用又酷炫的桌面天气站?既能显示实时天气,又能监控室内温湿度,还能玩点动态效果。经过两周的折腾,终于实现了这个想法,过程中踩了不少坑,也积累了些实战经验,现在把完整方案分享给大家。

这个项目最有趣的地方在于,它不只是简单的数据显示,而是融合了硬件驱动、网络请求、数据解析和界面设计的综合实践。下面我会从OLED驱动基础开始,逐步带你完成这个既实用又有成就感的创客项目。

1. 硬件准备与环境搭建

1.1 认识掌控板的OLED显示屏

掌控板搭载的是一块0.96英寸的SH1106驱动OLED屏,分辨率128x64。与常见的SSD1306相比,SH1106有几个关键区别:

特性SH1106SSD1306
显存管理支持132x64支持128x64
功耗更低相对较高
兼容性需要特定库支持广泛兼容
刷新方式支持局部刷新通常全屏刷新

提示:虽然官方文档可能标注为SSD1106(疑似笔误),实际硬件确认使用的是SH1106控制器。

1.2 Arduino IDE环境配置

首先确保你的开发环境准备就绪:

  1. 安装最新版Arduino IDE(建议1.8.x以上版本)
  2. 添加ESP32开发板支持:
    • 文件 > 首选项 > 附加开发板管理器网址中添加:https://dl.espressif.com/dl/package_esp32_index.json
    • 工具 > 开发板 > 开发板管理器,搜索安装"esp32"
  3. 安装必要的库:
    # 通过库管理器安装 ESP8266 and ESP32 OLED driver for SSD1306 displays Adafruit Unified Sensor DHT sensor library

1.3 硬件连接检查

根据掌控板原理图,关键引脚连接如下:

SH1106: SDA -> GPIO23 SCL -> GPIO22 DHT11: DATA -> GPIO17

用万用表检查线路通断是个好习惯,特别是自己焊接连接线时。我就曾因为一个虚焊的接头调试了半天。

2. SH1106驱动基础与显示优化

2.1 正确初始化SH1106显示屏

很多教程直接使用SSD1306的示例代码,这会导致显示异常。以下是正确的初始化方式:

#include <Wire.h> #include "SH1106Wire.h" SH1106Wire display(0x3c, 23, 22); // I2C地址, SDA引脚, SCL引脚 void setup() { display.init(); display.flipScreenVertically(); // 根据安装方向调整 display.setContrast(255); // 设置对比度(0-255) }

2.2 显示基础元素实战

掌握几种基本显示方法后,就能组合出丰富的界面效果:

文本显示:

void showText() { display.clear(); display.setFont(ArialMT_Plain_16); display.setTextAlignment(TEXT_ALIGN_CENTER); display.drawString(64, 20, "Weather"); display.setFont(ArialMT_Plain_10); display.drawString(64, 40, "Station"); display.display(); }

图形绘制:

void drawWeatherIcon(int x, int y, int type) { switch(type) { case 0: // 晴天 display.drawCircle(x+8, y+8, 6); for(int i=0; i<8; i++) { display.drawLine(x+8, y+8, x+8+7*cos(i*PI/4), y+8+7*sin(i*PI/4)); } break; case 1: // 雨天 // 雨滴绘制代码 break; } }

2.3 显示性能优化技巧

OLED刷新时容易出现闪烁,这些技巧可以改善体验:

  • 使用局部刷新代替全屏刷新
  • 双缓冲技术:先在内存绘制,再一次性显示
  • 合理设置刷新频率(天气数据1-5分钟更新一次即可)
void smoothRefresh() { static bool bufferFlag = false; if(bufferFlag) { drawToBuffer1(); display.display(buffer1); } else { drawToBuffer2(); display.display(buffer2); } bufferFlag = !bufferFlag; }

3. 天气数据获取与处理

3.1 选择合适的天气API

经过对比测试,这几个API比较适合IoT项目:

  • OpenWeatherMap:免费版足够用,响应快
  • 和风天气:中文支持好,有免费额度
  • 彩云天气:分钟级预报精准

推荐使用OpenWeatherMap的免费方案:

  1. 注册账号获取API Key
  2. 调用接口示例:
    http://api.openweathermap.org/data/2.5/weather?q=Beijing&appid=你的API_KEY&units=metric

3.2 实现网络请求与JSON解析

在Arduino中处理HTTP请求和JSON:

#include <WiFi.h> #include <HTTPClient.h> #include <ArduinoJson.h> void fetchWeather() { HTTPClient http; String url = "http://api.openweathermap.org/data/2.5/weather?q=Beijing&appid=YOUR_API_KEY&units=metric"; http.begin(url); int httpCode = http.GET(); if(httpCode == HTTP_CODE_OK) { String payload = http.getString(); DynamicJsonDocument doc(1024); deserializeJson(doc, payload); float temp = doc["main"]["temp"]; int humidity = doc["main"]["humidity"]; String weather = doc["weather"][0]["main"]; updateDisplay(temp, humidity, weather); } http.end(); }

注意:实际项目中应该添加错误处理和超时机制,避免网络异常导致程序卡死。

3.3 数据缓存与离线显示

考虑到网络可能不稳定,实现本地数据缓存很有必要:

  1. 使用EEPROM存储最后一次成功获取的数据
  2. 显示时先展示缓存数据,同时尝试更新
  3. 更新成功后替换缓存并刷新显示
struct WeatherData { float temp; int humidity; char weather[20]; unsigned long timestamp; }; void saveToEEPROM(WeatherData data) { EEPROM.begin(sizeof(WeatherData)); EEPROM.put(0, data); EEPROM.commit(); }

4. 系统集成与界面设计

4.1 整合DHT11温湿度传感器

室内环境监测使用DHT11性价比很高:

#include <DHT.h> #define DHTPIN 17 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void readDHT() { float h = dht.readHumidity(); float t = dht.readTemperature(); if(!isnan(h) && !isnan(t)) { display.setFont(ArialMT_Plain_10); display.drawString(10, 50, "室内: "+String(t,1)+"°C "+String(h,0)+"%"); } }

4.2 设计多页面显示系统

通过按钮切换不同信息页面:

void loop() { static int page = 0; if(digitalRead(BUTTON_PIN) == LOW) { delay(50); // 消抖 if(digitalRead(BUTTON_PIN) == LOW) { page = (page + 1) % 3; } } display.clear(); switch(page) { case 0: showWeather(); break; case 1: showForecast(); break; case 2: showIndoor(); break; } display.display(); delay(100); }

4.3 动态效果实现

增加些动画让显示更生动:

温度计动态效果:

void drawThermometer(float temp) { int height = map(temp, -10, 40, 10, 50); static int oldHeight = 0; // 平滑过渡 if(abs(height-oldHeight)>1) { height = oldHeight + (height>oldHeight?1:-1); } display.drawRect(5, 5, 10, 50); display.fillRect(7, 55-height, 6, height); oldHeight = height; }

天气图标动画:

void animateRain(int x, int y) { static int offset = 0; for(int i=0; i<4; i++) { display.drawLine(x+i*5, y+offset%10, x+i*5, y+3+offset%10); } offset++; }

5. 电源管理与项目优化

5.1 低功耗设计技巧

作为桌面设备,功耗优化可以延长使用寿命:

  • 设置ESP32进入轻量睡眠模式
  • 降低屏幕亮度(SH1106支持软件调节)
  • 合理设置数据更新频率
void lightSleep() { esp_sleep_enable_timer_wakeup(5 * 60 * 1000000); // 5分钟 esp_light_sleep_start(); }

5.2 外壳设计与安装建议

我用3D打印制作了一个倾斜15度的外壳,既方便观看又节省桌面空间。几个实用建议:

  • 留出足够的散热孔(ESP32工作时会产生热量)
  • 考虑屏幕防眩光处理(磨砂亚克力效果不错)
  • 预留复位按钮和USB接口的开口

5.3 扩展思路

这个基础框架可以扩展更多功能:

  • 增加空气质量监测(如SGP30传感器)
  • 添加日程提醒功能
  • 实现语音播报(搭配DFPlayer Mini)
  • 接入智能家居系统
// 扩展传感器示例 #include <Adafruit_SGP30.h> Adafruit_SGP30 sgp; void readAirQuality() { if(sgp.IAQmeasure()) { int tvoc = sgp.TVOC; int eco2 = sgp.eCO2; display.drawString(80, 50, "AQ:"+String(eco2)); } }

整个项目最耗时的部分是界面设计和动画效果调试,建议先用纸笔画出界面布局,再逐步实现。遇到显示异常时,先检查I2C地址是否正确(用扫描工具确认),再排查接线和库版本问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 21:17:52

Java毕业设计-基于 SpringBoot 的医疗机构就诊服务医院门诊管理系统的设计与实现 管理系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/12 21:16:57

Typora插件终极指南:解锁Markdown编辑器的无限潜力

Typora插件终极指南&#xff1a;解锁Markdown编辑器的无限潜力 【免费下载链接】typora_plugin Typora Plugin. Feature Enhancement Tool | Typora 插件&#xff0c;功能增强工具 项目地址: https://gitcode.com/gh_mirrors/ty/typora_plugin 还在为Typora的基础功能无…

作者头像 李华
网站建设 2026/6/12 21:15:52

如何用ChanlunX在3分钟内完成专业缠论分析:告别手工绘图的终极指南

如何用ChanlunX在3分钟内完成专业缠论分析&#xff1a;告别手工绘图的终极指南 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你知道吗&#xff1f;传统缠论分析需要数小时手工绘制K线图、标注笔段中枢&…

作者头像 李华
网站建设 2026/6/12 21:04:01

从无人机到机械臂:超螺旋滑模观测器在工程中的实战调参指南

超螺旋滑模观测器工程调参实战&#xff1a;从理论收敛到机械臂振动抑制当机械臂关节在高速运动中出现难以建模的高频振动时&#xff0c;当无人机在强风扰动下姿态角速度信号被噪声淹没时&#xff0c;控制工程师们常常面临一个两难选择——传统龙伯格观测器对扰动过于敏感&#…

作者头像 李华
网站建设 2026/6/12 21:04:00

安卓自动化终极指南:AutoJs6如何让JavaScript掌控你的手机

安卓自动化终极指南&#xff1a;AutoJs6如何让JavaScript掌控你的手机 【免费下载链接】AutoJs6 安卓平台 JavaScript 自动化工具 (Auto.js 二次开发项目) 项目地址: https://gitcode.com/gh_mirrors/au/AutoJs6 AutoJs6是一款基于JavaScript的安卓平台自动化工具&#…

作者头像 李华