基于Raspberry Pi Pico与Nextion的桌面气象站:低代码嵌入式开发实践
1. 项目概述一个“可视化”的桌面气象站最近在工作室捣鼓一个桌面小玩意儿想实时看看温度、湿度最好还能有点历史趋势摆着也好看。市面上成品要么功能单一要么价格不菲索性自己动手。核心思路很明确用传感器采集数据找个微控制器处理再找个屏幕直观地显示出来。经过一番选型最终敲定了Raspberry Pi Pico、Nextion 触摸屏和Visuino这套组合拳。这不仅仅是一个简单的数据采集显示项目更是一次对“低代码”嵌入式开发与“高颜值”人机界面结合的深度探索。它非常适合电子爱好者、创客甚至是希望快速实现一个功能完整、界面专业的原型产品的开发者。如果你厌倦了在代码和硬件调试之间反复横跳想用一种更直观的方式构建嵌入式应用那么这个项目会给你带来全新的体验。2. 核心硬件选型与设计思路拆解2.1 为什么是 Raspberry Pi Pico选择 Raspberry Pi Pico以下简称 Pico作为主控是基于多方面的考量。首先它的性价比极高双核 ARM Cortex-M0 处理器运行频率可达 133MHz处理传感器数据和与屏幕通信绰绰有余。其次它拥有丰富的 GPIO 口和硬件接口包括 2 个 UART、2 个 I2C、2 个 SPI这为连接多种传感器和显示屏提供了极大的灵活性。最重要的是Pico 对 MicroPython 和 C/C 的官方支持都非常完善生态繁荣社区资源丰富。在这个项目中Pico 扮演着“大脑”和“桥梁”的角色。它需要读取来自温湿度传感器如 DHT22的数据进行必要的计算或滤波然后通过串口UART将格式化后的数据发送给 Nextion 屏幕。同时它还需要处理来自 Nextion 屏幕的触摸事件比如用户点击按钮切换显示页面或单位。Pico 的硬件资源足以轻松应对这些任务其小巧的尺寸也便于集成到最终成品中。2.2 Nextion 屏幕让界面开发变得简单Nextion 系列屏幕是该项目“颜值”和“易用性”的担当。它是一类集成了显示面板、触摸控制器和一颗协处理器的智能串口屏。其最大的优势在于开发模式开发者使用官方的 Nextion Editor 软件通过图形化界面设计 UI放置控件、设置属性、编写简单的指令脚本然后将编译好的界面文件.tft下载到屏幕的 Flash 中。之后主控制器如 Pico只需要通过简单的串口指令如page 1切换页面temp.txt25.5更新文本框内容即可与屏幕交互完全无需关心底层驱动、图形渲染和触摸检测等复杂问题。对于气象站项目我们可以设计多个页面一个主页面显示当前的温度、湿度、体感温度、图标一个历史趋势页面用曲线图展示过去一段时间的数据变化一个设置页面用于调整单位、屏幕亮度等。Nextion 的控件库如文本、进度条、波形图足以实现这些功能极大地简化了嵌入式 GUI 开发的门槛。2.3 Visuino图形化编程的利器Visuino 是一个基于图形化数据流的嵌入式开发环境支持包括 Pico 在内的多种 Arduino 兼容板。它的核心思想是用“组件”和“连线”代替手写代码。你从工具箱拖拽一个“串口”组件、一个“DHT 传感器”组件、一个“定时器”组件然后用线将它们按逻辑连接起来设置好属性Visuino 就会在后台生成对应的 C/C 代码并编译上传。选择 Visuino 是为了进一步降低开发难度特别是对于不熟悉 C/C 或 MicroPython 细节的开发者。它抽象了底层硬件操作和协议细节让我们可以更专注于业务逻辑如何定时读取传感器、如何格式化数据、如何触发串口发送。这对于快速原型验证和概念展示非常有效。当然它也有其局限性对于极其复杂或需要精细性能控制的项目手写代码仍是首选。但在这个气象站项目中Visuino 的便捷性优势非常明显。2.4 系统架构与数据流整个系统的架构非常清晰。物理层上DHT22 传感器连接到 Pico 的某个 GPIO 口用于数字信号读取Nextion 屏幕通过 TX/RX 引脚连接到 Pico 的某个 UART 串口。逻辑层上Pico 内部运行一个由 Visuino 生成或手写的固件程序该程序周期性例如每 5 秒执行以下流程数据采集通过单总线协议读取 DHT22 的温度和湿度原始数据。数据处理对原始数据进行校验、单位转换如需要并计算衍生数据如体感温度。数据格式化将处理后的数据按照 Nextion 串口指令协议格式化成字符串。例如要更新 ID 为tempText的文本框指令为tempText.txt23.5℃。指令发送通过硬件串口将格式化后的指令字符串发送给 Nextion 屏幕。事件监听同时Pico 的串口也在监听来自 Nextion 的触摸事件反馈如65 00 02 01 FF FF FF表示页面 1 上的组件 2 被按下并做出相应逻辑处理。这个数据流是单向为主Pico - Nextion双向交互为辅的典型模式结构清晰易于调试。3. 核心组件连接与 Visuino 配置详解3.1 硬件连接清单与示意图你需要准备以下组件Raspberry Pi Pico 一块Nextion 基础型号屏幕如 NX4024T032一块DHT22AM2302温湿度传感器一个杜邦线母对母、公对母若干USB 数据线用于给 Pico 供电和编程Nextion 屏幕所需的 5V 电源适配器通常屏幕功耗较大需独立供电连接示意图文字描述Pico 与 Nextion 屏幕Pico 的GPIO0 (UART0 TX)连接到 Nextion 的RX引脚。Pico 的GPIO1 (UART0 RX)连接到 Nextion 的TX引脚。Pico 的GND连接到 Nextion 的GND。注意Nextion 的VCC引脚务必连接独立的5V 电源切勿从 Pico 的 VBUS 或 3.3V 取电否则可能因电流不足导致屏幕工作不稳定或损坏 Pico。Pico 与 DHT22 传感器DHT22 的VCC连接到 Pico 的3.3V输出引脚。DHT22 的GND连接到 Pico 的GND。DHT22 的DATA引脚连接到 Pico 的某个 GPIO例如GPIO15。注意DHT22 的数据引脚通常需要一个 4.7K - 10K 的上拉电阻连接到 VCC以确保信号稳定。有些模块已经内置了这个电阻购买时需留意。供电Pico 通过 USB 线连接到电脑或手机充电器供电。Nextion 屏幕通过其 DC 接口或 VCC/GND 引脚由独立的 5V/2A 电源适配器供电。确保 Pico 的 GND 和 Nextion 的 GND 以及外部电源的 GND 连接在一起共地是通信的基础。3.2 Visuino 环境搭建与项目初始化首先确保你已经在电脑上安装了 Visuino 软件。启动 Visuino 后第一步是添加对 Raspberry Pi Pico 的支持。添加 Pico 支持点击菜单栏的Tools-Boards-Boards Manager...。在搜索框中输入 “Raspberry Pi Pico”找到并安装 “Raspberry Pi Pico by Arduino” 或类似的支持包。安装完成后在Tools-Boards下就能选择 “Raspberry Pi Pico” 了。创建新项目与选择板卡新建一个项目在右侧的Properties面板中将Board属性设置为 “Raspberry Pi Pico”。配置串口用于编程在Tools-Port中选择你的 Pico 所连接的 COM 端口Windows或 /dev/ttyACM0 等Linux/Mac。如果找不到可能需要先按住 Pico 上的BOOTSEL按钮再插入 USB使其进入 UF2 下载模式但 Visuino 通常支持直接通过串口上传。3.3 Visuino 组件拖拽与逻辑连接这是最核心的图形化编程步骤。我们将从左边的组件面板中拖拽所需的组件到设计区域。添加并配置 DHT22 组件在组件面板搜索 “DHT”将DHT22组件拖到设计区。点击该组件在右侧属性面板中找到Pin属性将其设置为之前连接 DATA 线的 GPIO 引脚例如15。默认情况下DHT22 组件会同时输出温度Temperature和湿度Humidity两个数据流。添加并配置串口组件用于 Nextion搜索 “Serial”将Serial组件拖到设计区。Pico 有多个硬件串口我们使用 UART0。在属性面板中将Serial属性设置为Serial0(UART0)。波特率Baud Rate设置为9600或115200这必须与你在 Nextion Editor 中为屏幕项目设置的波特率完全一致通常 Nextion 默认是 9600。这个串口组件就是我们与 Nextion 通信的通道。添加定时器实现周期性读取搜索 “Timer”将Timer组件拖到设计区。它的作用是每隔固定时间触发一次去读取传感器数据。点击定时器组件在属性面板中设置Enabled为True以启动定时器。设置Interval间隔属性例如5000单位毫秒即 5 秒。连接数据流现在开始“连线”。将Timer组件上的Out引脚输出时钟脉冲拖拽一根线连接到DHT22组件上的In引脚触发读取。接下来需要将读取到的数据发送到串口。但数据需要先格式化成 Nextion 能理解的指令。Visuino 提供了Format组件。搜索 “Format”将Format Text组件拖到设计区。我们需要格式化两条指令一条更新温度显示一条更新湿度显示。以温度为例双击Format Text组件打开格式编辑器。我们需要生成的指令类似temp.txt23.5。在编辑器中可以写入固定文本和插入变量。例如可以写成temp.txt[0]℃。这里的[0]是一个占位符表示输入的第一个值。连接DHT22组件的Temperature输出引脚到Format Text组件的In 0输入引脚。最后将Format Text组件的Out引脚连接到Serial组件的In引脚。对湿度进行同样的操作再拖一个Format Text组件格式设为humi.txt[0]%连接DHT22的Humidity输出到其In 0再将其输出连接到Serial的In。Visuino 会自动处理多个数据流向同一串口。添加调试串口可选但强烈推荐为了在电脑上看到程序运行状态和发送的原始指令便于调试可以添加另一个串口组件用于调试输出。再拖一个Serial组件属性设置为Serial1(UART1)波特率设为115200。将两个Format Text组件的输出也连接到这个Serial1的In引脚。这样在 Arduino IDE 的串口监视器或 Visuino 的串口终端中选择对应的 COM 口和波特率就能看到发送给 Nextion 的指令了。注意Visuino 的图形化连接虽然直观但背后生成的代码可能不是最优的。例如两个格式化组件会依次向串口发送数据可能导致短时间内发送两条指令。对于 Nextion 来说这通常可以接受但更严谨的做法是使用一个Merge组件将两条指令合并或者使用Sequence组件控制发送顺序。在简单应用中当前方式已足够。3.4 Nextion 界面设计与指令对接在 Visuino 配置的同时我们需要在 Nextion Editor 中设计界面。创建新项目打开 Nextion Editor选择与你屏幕型号匹配的工程如 3.2寸480x320。设计主页面从左侧工具箱拖拽两个Text控件到画布上分别用于显示温度和湿度。分别点击这两个控件在右侧属性面板中给它们设置唯一的Objname例如tempText和humiText。这个名称就是 Visuino 中格式化指令里引用的对象名。你可以调整它们的字体、颜色、位置使其美观。编译与下载设计完成后点击菜单栏的File-Build生成.tft文件。然后通过 TF 卡或 USB取决于屏幕型号将.tft文件下载到 Nextion 屏幕中。下载时屏幕会黑屏并显示进度条完成后自动重启加载新界面。指令验证在将 Pico 程序上传前可以先使用 PC 串口工具如串口助手连接 Nextion手动发送tempText.txt25.5℃指令注意结尾需要加三个字节的结束符0xFF 0xFF 0xFFNextion Editor 的“调试”功能可以自动添加观察屏幕上的文本是否更新。这一步能有效隔离硬件和软件问题。4. 系统集成、调试与功能增强4.1 代码生成、编译与上传当 Visuino 中的图形化逻辑设计完成后就可以生成代码并上传到 Pico 了。生成代码点击 Visuino 设计区域上方的Generate Code按钮或按 F9。Visuino 会在后台调用 Arduino CLI 或相关工具链将图形化设计转换为完整的 C/C 代码基于 Arduino 框架。编译与上传代码生成后Visuino 会自动进行编译。如果编译成功会开始上传程序到 Pico。此时确保 Pico 已通过 USB 连接且选择了正确的端口。上传过程中Pico 上的 LED 会闪烁。首次运行观察上传完成后Pico 会自动复位运行。观察 Nextion 屏幕理论上每隔 5 秒温度和湿度显示应该更新。同时打开串口监视器连接到你设置为调试的串口如 Serial1可以看到实际发送的指令字符串例如temp.txt23.5℃ humi.txt65%这证明 Pico 端的程序工作正常。4.2 系统联调与常见问题排查第一次集成往往不会一帆风顺。以下是几个常见的坑点和排查思路问题1Nextion 屏幕无任何显示或显示乱码。排查电源这是最常见的问题。确认 Nextion 使用的是独立的 5V/2A 电源并且 GND 已与 Pico 共地。用万用表测量屏幕 VCC 和 GND 之间的电压确保在 5V 左右。排查串口连接确认 Pico 的 TX 接 Nextion 的 RXRX 接 TX。接反了无法通信。排查波特率确认 Visuino 中 Serial 组件的波特率与 Nextion 工程中设置的波特率在 Nextion Editor 的工程属性里查看完全一致。常见的波特率有 9600, 115200 等。问题2屏幕有显示但数据不更新。检查调试串口输出首先看调试串口是否有指令输出。如果没有说明 Pico 程序可能没运行或传感器读取失败。检查传感器连接确认 DHT22 的 DATA 线连接正确且上拉电阻有效。尝试更换一个 GPIO 口测试。检查指令格式对比调试串口输出的指令与 Nextion 控件名是否完全匹配大小写敏感。例如控件名是tempText但指令里写成了temp.txt就无法更新。检查指令结束符Nextion 指令必须以0xFF 0xFF 0xFF三个字节结束。Visuino 的Serial组件发送字符串时默认会自动在末尾添加换行符\r\n但这并不是 Nextion 要求的结束符。需要在 Visuino 中配置。点击Serial组件在属性面板中找到Line Ending选项将其设置为None无结束符。然后在我们的Format Text组件中手动在指令末尾加上结束符。例如格式改为temp.txt23.5℃\xFF\xFF\xFF。注意在 Visuino 的格式编辑器中可能需要以某种转义形式输入。问题3数据更新慢或不稳定。调整读取间隔DHT22 两次读取之间需要至少 2 秒的间隔。Visuino 中的定时器间隔不要设置小于 2000 毫秒。添加读取失败处理DHT22 读取偶尔会失败。在 Visuino 中可以为 DHT22 组件添加错误处理引脚。将其Error输出引脚连接到一个Logic组件如Toggle或者另一个用于显示错误的Format Text组件当读取失败时在屏幕或调试串口显示错误信息而不是更新一个错误的数据。软件滤波传感器数据可能有微小跳动。可以在 Visuino 中通过Filter组件如移动平均滤波器对温度或湿度数据进行平滑处理使显示更稳定。4.3 功能增强与实践建议基础功能实现后可以考虑以下增强点让项目更完善多页面与触摸交互在 Nextion Editor 中设计第二个页面例如 “History”放置一个Waveform控件。在主页面添加一个按钮在其Touch Press Event中写入代码page History。在 Pico 端Visuino 需要监听串口输入。添加一个Serial组件用于接收连接其Out引脚到一个Logic组件来解析收到的数据。当收到页面切换指令时可以改变 Pico 的数据发送逻辑例如从发送文本改为发送波形数据。波形数据指令格式为add 1,0,25表示向 ID 为 1 的波形控件通道 0添加数据点 25。添加更多传感器例如连接一个 BMP280 气压传感器通过 I2C。在 Visuino 中拖入BMP280组件将其I2C引脚连接到 Pico 的I2C通道上。然后像处理 DHT22 一样将其数据格式化后发送给 Nextion。数据记录与导出为 Pico 添加一个 MicroSD 卡模块通过 SPI。在 Visuino 中使用SD Card组件。可以修改定时器逻辑每次读取传感器后除了发送到屏幕还将带时间戳的数据追加写入到 SD 卡的 CSV 文件中。这样就有了本地的历史数据记录。网络功能与远程查看使用 Raspberry Pi Pico W带 WiFi 版本。在 Visuino 中可以利用WiFi组件连接网络然后通过HTTP Client或MQTT组件将数据上传到云平台如 ThingSpeak, Blynk或者你自己的服务器实现远程监控。实操心得分步调试务必遵循“分而治之”的原则。先确保 Nextion 屏幕能通过 PC 串口工具手动控制再确保 Pico 能通过 USB 串口打印出正确的传感器读数最后再将两者连接并通过调试串口观察通信过程。Visuino 的局限性Visuino 非常适合逻辑清晰、流程线性的应用。一旦逻辑变得复杂如需要状态机、复杂的字符串处理图形化连线会变得非常混乱且难以维护。这时可以考虑使用 Visuino 生成基础框架代码然后导出到 Arduino IDE 中进行手动的代码级修改和增强。Visuino 支持将项目导出为 Arduino 工程。电源管理如果制作成常驻桌面的设备考虑电源的稳定性。一个可靠的 5V/2.5A 以上的 USB 电源适配器同时给 Pico 和 Nextion 供电是可行的方案但需确保线材质量够好压降小。更优方案是使用一个 5V/3A 以上的适配器通过一个 DC-DC 降压模块分出 5V 给屏幕再降压到 3.3V 给 Pico 和传感器。外壳与美观一个漂亮的外壳能让项目从“原型”升级为“产品”。可以使用 3D 打印设计一个外壳将 Pico、屏幕和传感器集成进去并留出散热孔和传感器气窗。这个基于 Raspberry Pi Pico、Nextion 和 Visuino 的天气站项目从想法到实现完整地展示了一个嵌入式产品从硬件选型、软件设计到调试部署的全过程。它巧妙地结合了硬件的灵活性、屏幕的易开发性以及图形化编程的便捷性为快速构建具有友好交互界面的物联网设备提供了一个极具参考价值的范本。无论你是想学习嵌入式开发还是需要为一个创意项目寻找技术实现方案这套技术栈都值得你深入尝试。