基于树莓派单片机RP2040的环境温湿度数据采集展示
基于树莓派单片机RP2040的环境温湿度数据采集展示系统。智能家居类应用,用于检测家居环境数据进行展示。
标签
KiCad
Arduino
智能家居
OLED
RP2040
SSD1306
温湿度
树莓派RP2040
DHT11
鲜de芒果
更新2023-06-29
1274

一、项目需求

  • 基于树莓派单片机芯片,使用 KiCAD 7.0 绘制原理图和PCB。
  • 完成PCB打样并焊接。
  • 编写单片机程序,实现读取环境温湿度数据,并通过OLED进行展示。

 

二、完成的功能及达到的性能

2.1 使用KiCAD7.0绘制原理图与PCB

      第一次使用 KiCAD 绘图,花了很长时间摸索和学习,只能说是把线路都走通了,至于线路要求什么的就别苛求了。
PCB尺寸是根据淘宝最便宜的 铝合金外壳 尺寸设计的,参考 树莓派Pico 的引脚引出。相当于一块开发板,在此基础上增加了一个 WS2812B 的LED灯,一个电源指示灯和一个普通LED灯。以及一个 DHT11传感器。最终完成的效果如下图所示:
   Fs9TX3LMiekmE1BD0RGznaf-_4K2FteqOsMCuWy_A3mHlVaVFE4_k8Cc

 

2.2 PCB焊接

      5月中旬的时候,第一块打样PCB就已经收到了,到手就开始焊接。没有热风枪,没有钢网,不得不说 QFN 封装对于业余人士来说太不友好了。
 
      第一次焊接 QFN 封装,一点点往焊盘上抹锡膏,慢工出细活,花了一下午时间抹好锡膏,把元器件摆好,上铁板进行加热焊接。第一次焊完还挺像那么回事,上电之后电源指示灯是亮的,用手触摸各芯片的温度(错误示范,后来才知道上电前应该使用万用表测试各芯片的对地短路情况再上电),发现没有温度异常情况。随即将USB接到电脑上,这时才是恶梦的开始,电脑不识别U盘,也没有串口出现。
 
      到这里对于小白来说已经完全不知所措了,赶紧到群里问大神。好在群里的小伙伴都很热心,在群友的指导下,逐步排除嫌疑。最终确定还是由于 RP2040 的焊接不好导致的,前前后后买了四次元器件,活动的 5 块芯片全焊接完,结果只有一个板子最终完成了调试。
 
      其余各块板子各有不同的问题,什么Flash识别不上啦,插上电脑U盘不显示等等,搞的我都有点怀疑人生了。最终调试成功的板子如下图所示:
      Fjq8ilnG6qUC-UuXy-sqBHuEnNdi
 

2.3 单片机软件

      本项目制作软件部分还算是最顺利的了,由于硬件部分耗费了太多精力,最终软件部分只实现了温湿度的采集和显示,以及点灯功能。
 
      软件部分使用的是 platformio 建立的 pico arduino 工程,代码使用的 Arduino 进行编写。温湿度数据使用的是 I2C 接口的0.91寸 OLED 屏幕模块进行展示,由于该模块购买的时间比较长了,之前也没有使用过。第一次编写完代码后,烧录完成后发现屏幕不亮。
 
      曾一度怀疑是屏幕问题,使用ESP32的开发板进行驱动没有问题。这个问题也困扰了比较长时间,最终使用 Adafruit_SSD1306 库完成了 OLED 的驱动,U8g2 库不知道是啥原因无法正常驱动 RP2040 的 I2C OLED 屏幕。最终效果如下图所示:
      Fqm0hteq6o5w7oHwDXW1nK5YeY0M

 

三、实现思路

      由于是以芯片为核心进行开发设计,因此需要先对芯片有所了解,例如最小系统的原理,芯片数据手册等等。
 
      然后在最小系统的基础上,根据最终需求以及参考树莓派官方推出的 Pico 模块 的原理图,进行外围电路的拓展设计,以满足最终需求的电路。 由于此次设计主要以学习为主,因此没有考虑成本、美观、电路设计的EMI、节能、环保等。
 

3.1 收集资料

  1. 首先查看 RP2040 数据手册,参考树莓派官方 硬件设计数据手册 绘制最小系统原理图。
  2. 根据需求进行芯片或传感器选型,如传感器用什么型号,电源芯片,FLASH芯片等。
  3. 各芯片数据手册:DHT11W25Q16JVSSIQUSBAMS1117-3.3 等数据手册与封闭规格书。

 

3.2 原理图绘制

      上一步确定好使用的芯片与模块之后,就可以参考芯片和模块、传感器的规格书进行原理图绘制了。这一步是确保选型的芯片和器件能满足需求的功能,为PCB制作打下基础。
 
      KiCAD 7.0 已经集成了很多常用的芯片与模块,可以直接使用。遇到没有的据说可以通过某网站进行下载,由于我是第一次使用 KiCAD 不知道哪里有原理图和封装下载。使用的是比较笨的办法,从自带的库里找引用和功能相近的进行修改。大部分原理图不需要修改,需要修改封装。
 
      完成原理图的绘制后,检查各器件的连接都正确,即可进行下一步PCB的绘制了。
 

3.3 PCB绘制

      完成原理图的绘制之后,可通过 工具 菜单中的 从原理图更新PCB 功能按钮,将原理图转换为PCB设计稿。这一步如果有些器的封装和购买的器件对不上,就需要进行修改。例如我买的按键开关,在KiCAD库中就没有,我是直接找了一个型号相近的按键器件,将封装修改了一下。
 
      这一步应先确定好 PCB板 的尺寸,及各接口的部局。例如,本项目中的 TYPE-C 接口的位置与按钮的位置、以及引出的IO口的位置等。
 
      然后根据电器特性、美观、连通性等要求对主要器件进行布局,连线。最终完成PCB布局设计,生成PCB打板所需的文件提供给PCB厂商进行PCB制作。
 

3.4 PCB焊接

      PCB板制作完成后就需要对PCB进行焊接操作,有条件最好是在上一步时就选择PCBA进行制作,直接到手就是焊接好的成品,只需要进行软件调试即可。或者也可以找SMT厂商进行贴片焊接。像我这种业余爱好者,还抱着学习的目的,就只好自己焊了。**RP2040** 的 **QFN封装** 对于手工焊接非常不友好,有热风枪的话稍微好点。
 

3.5 软件编写

      至此项目算是成功了一大半,PCB焊接比我预计的困难了许多。好在有一块是成功了的,才有了这一步的操作。
 
      软件的编写也是犹豫了很久,官方提供的 c++ SDK 对于我来说还是有点吃力的,最终找到了可以使用 Arduino 进行软件开发的方案。过程中由于 I2C 驱动 OLED 的问题,曾一度想要转投 MicroPython 的怀抱,耐何安装 MicroPython 环境的时候没能成功。好在最终通过曲线救国的形式完成了 OLED 的驱动。
 

四、实现过程

4.1 软件功能架构

      软件采用 Arduino 实现相应功能,任务比较简单,setup 函数中初始化各部分驱动,loop 函数中每次循环采集一次 DHT11 传感器数据,并调用 OLED 驱动API进行展示。
 

4.2 流程图

      Fq9-_QOY0beWvisUKFGUIgRkvEmB

 

 4.3 软件依赖库

软件基于 Arduino 进行编写,使用的库有:
  • adafruit/Adafruit SSD1306@2.5.1 OLED驱动库
  • adafruit/DHT sensor library@^1.4.4 DHT11传感器驱动库
  • fastled/FastLED@^3.6.0 WS2812B 驱动库


4.4 主要功能代码展示

4.4.1 点灯

// LED闪烁
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
delay(1000);
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
delay(1000);




...
// 每秒随机显示一种颜色
// WS2812B 随机显示一种颜色
leds[0] = CRGB(
static_cast<int8_t >(random(0, 255)),
static_cast<int8_t >(random(0, 255)),
static_cast<int8_t >(random(0, 255))
);
FastLED.show();
 
我买到的 WS2812B 灯珠是 GRB模式,因此 FastLED 初始化的时候需要使用 GRB 进行初始化。
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
 

4.4.2 温湿度采集

      温湿度采集由于使用的是 DHT11 模块,使用开源的 DHT sensor library 库 很容易的读取到传感器的温湿度数据。
DHT dht(DHTPIN, DHT11);
...
...
float h = dht.readHumidity();
float t = dht.readTemperature();

4.4.3 OLED显示

      原本打算使用 U8g2 库绘制一个折线图进行展示的,结果使用 U8g2 库死活点不亮手上的 0.91寸 I2C 接口 OLED 屏。故只能退而求其次,使用 Adafruit SSD1306 库,以文字的形式进行呈现。Adafruit SSD1306 库展示温度单位时,摄氏度的符号为乱码。使用 cp437 才比较好的展示了温度单位符号。
...

display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.println("DHT11");
display.setTextSize(1);
display.print("Humidity: ");
display.print(h);
display.println(" %");
display.print("Temperature: ");
display.print(t);
display.print(" ");
display.cp437(true); // 使用 cp437 展示温度符号 °
display.write(248); // 温度符号在 cp437 中的ASCII码十进制值为248, 167也是温度符号,不过167还有一条横线。
display.print("C");
display.setCursor(0,0);
display.display();

...
 
最终展示效果如下图所示:
      FoNliEqntZeXe8Ea3cL1JAaTW7SE

 

五、遇到的主要难题

      非常感谢电子森林推出的 《WeDesign》 系列活动,从第一期开始就想参加的,对于我这种小白爱好者来说,即可以学习到知识,也可以有机会进行实践,逼迫自己进行学习。第一期的题目对于我来说难度太高,第二期的 RP2040 题目相对容易点,果断报名参加。实践过程中发现理论和实践相差还是挺大的,虽然前期有了解过一些硬件相关的知识,但实践过程中还是批漏百出。
 
      从 KiCAD 的使用开始,就遇到各种问题。好在只是一些软件使用上的问题,通过度娘的耐心解答顺利完成。PCB打样完成后开始焊接,直到焊接完成后上电,才被现实狠狠毒打。业余爱好者没有完备的辅助设备,焊接过程中出现各种问题,虚焊、不牢固等问题层出不穷。TYPEC接口被我弄坏了 N 个。前后打了两次板,最终只有一块是焊接好并调试成功的。其中焊接好后电脑识别不到U盘、识别不到串口、无法进入 运行模式、上电卡在 BOOT模式 等问题都遇到了。在此感谢群友的耐心解答,谢谢!
 
      软件的开发过程也是一波三折,尤其是 U8g2 的 I2C 驱动 OLED 屏幕,到现在也未能解决。有高手知道解决方法的还请不吝赐教。
 

六、芯片的优势与局限

      通过这次制作,我对该芯片的优势与局限总结如下,仅代表个人观点。总的来说这款芯片我个人还是比较喜欢的。

优点:

  • 生态完整资料齐全。
  • 价格便宜且性能强劲还支持超频。
  • PIO引脚。
  • USB UF2模式烧录不需要额外的下 "崽" 器。

缺点或局限:

  • Arduino的支持库还有待进一步加强。
  • QFN封装让我又爱又恨,爱的是体积小巧,恨的是焊接难度较大。
  • 在一些物联网应用场景中需要增加wifi或蓝牙才行。
  • 缺少浮点运算单元。

 

七、未来的计划建议

      本次保守的选择了 DHT11 采集环境温湿度数据这个题目来进行实现,只是简单的进行了数据的采集和展示。其实基于现有的方案,还可以把 WS2812B 进行联动,例如:环境适宜时,显示绿色。温度或湿度偏高或偏低时显示橙色。环境恶劣时显示红色等。
 
      RP2040 这块芯片我还是挺喜欢的,价格低廉、性能强劲、貌似还能超频。未来可以更多的探索并解锁其它应用场景。
 
      最后感谢电子森林推出的《WeDesign》系列活动,对于我们这些新手是个很好的学习机会,理论结合实践。我们下期活动再见!
附件下载
eetree-rp2040.zip
KiCAD7工程
RP2040-Demo.zip
PlatformIO工程代码
团队介绍
业余爱好者
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号