[第3期 空气质量分析仪]第二周作业

发表在 实战入门学习营2019-10-23 21:24 [复制链接] 5 223

目标:1.完成温湿度应用给模块;2。完成PM2.5驱动
! A4 @9 z7 G4 @+ ~1 R: D% \( i
0 v9 W; H$ `' O2 A% z2 n2 H1. SHT31! c6 C/ h& D$ W2 S2 B
    创建线程定时采集温湿度,同时每隔1秒钟左右打印到串口。
2 d7 w- A" u6 e/ }: ?* |! r" t    temp_humi_th.c:这里包含了标准输入输出库的头文件“stdio.h”,因为用到了格式化浮点输出,rtt自带的sprintf函数没有添加格式化浮点输出的支持。) \& Q' O6 }  ?
  1. #include "temp_humi_th.h"
    8 J- z- a( J+ o! ^6 a
  2. #include <stdio.h>
    ( U" I6 ]( o; `' R5 y2 D8 y
  3. 7 h: |+ M/ Y  W9 h3 q5 }" o5 E
  4. sht3x_device_t sht31_dev ;; [; ]" @# t' b% j" S0 {$ A& S
  5. rt_thread_t thread_sht31 ;" q. w- W: e. L! [
  6. float temperature, humidity ;
    + J/ B3 _; z( t4 R' ~6 i4 p
  7. 6 T$ H, t8 f2 L
  8. void temp_humi_entry(void * parameter)' v2 }/ i# D0 ^5 ~8 E
  9. {9 V5 o# m+ D2 }: U( b; ~: Q$ g
  10.     1 F% s* H; V, q5 r1 d# s+ V
  11.     char buffer[128] ;2 I* i2 m7 |# g; ]) B4 r
  12.     while(1)
    ' i7 `, I; b  W1 W9 ^1 X
  13.     {4 x1 N* Z$ u: t! F: T
  14.         sht3x_read_singleshot_temperature_and_humidity(sht31_dev, &temperature, &humidity);
    0 o) [- Z' ?5 m, y* m
  15.         sprintf(buffer, "T:%0.2f H:%0.2f \n", temperature, humidity);
    ! I7 E- ^  I# t$ p8 w; B
  16.         // rt_snprintf(buffer, 128, "T:%0.2f H:%0.2f \n", temperature, humidity);. d" x2 n0 z" |+ ^' z5 K4 i* e
  17.         rt_kprintf(buffer);
    . |& Y4 t7 g) y( g. A  w7 g
  18.         rt_thread_mdelay(5000);& P, G5 p9 A, Q( b7 }* \
  19.     }$ A' D5 G# R. m# A0 |0 q1 u5 }
  20. }% {' r" X" N) q( D! q8 B: q

  21. ( Q" r, A' X: h, f- m, D& G
  22. void temp_humi_init(void)
    - L3 @0 w- \; d
  23. {
    8 t0 t; a! {* l3 `0 q, w9 a
  24.     sht31_dev = sht3x_init("i2c1", SHT3X_ADDR_PD, SHT3X_REPETABILITY_MEDIUM);( c/ Q4 d3 |# R' v. a
  25.     thread_sht31 = rt_thread_create("SHT31", temp_humi_entry, RT_NULL, 1024, RT_THREAD_PRIORITY_MAX/2 - 2, 100);
    3 v' K+ n8 h; G
  26.     if(sht31_dev != RT_NULL && thread_sht31 != RT_NULL){2 h- S& Z' e" K% V1 q4 F( W( Z% z: ?
  27.         rt_thread_startup(thread_sht31);/ G" Y5 X* P8 E) O. P
  28.     }+ b6 E) |9 y" f  {$ z
  29. }
复制代码
   temp_humi_th.h:包含了sht3x驱动,基于sht20的代码修改。" l- u9 f2 ^5 n  V- `! D8 z
  1. #ifndef TEMP_HUMI_TH_H/ E/ z: v: X' K7 Q
  2. #define TEMP_HUMI_TH_H
    2 w9 t0 ]3 w& O" @' R5 @
  3. & j: m( ?* l) k; v
  4. #include "sht3x.h"
    2 B0 q4 J1 r2 Z

  5. ! T: k! z& O9 |8 }, F% B5 z+ p3 w( j
  6. void temp_humi_entry(void * parameter);
    2 j; M: V3 ?+ T2 F; d+ c- U
  7. void temp_humi_init(void);- E1 |% i. c. C+ g! W) }
  8. + n& y# V! I: P" o0 e+ C
  9. #endif
复制代码
2. PM25 颗粒传感器
) f* F0 a4 G( F4 o( n    严格来说,GP2Y这个模块不能算是PM2.5传感器,但是就这么用吧。这里需要提一下线程优先级,温湿度采集线程要比PM25采集线程优先级要高一点,不然会发生温湿度线程无法启动的问题。* w8 p% q* @6 Q, q6 w
    我这边接线和标准的接线方式差了一个三极管,我这边寝室没有三极管,输出电压只有0.5V上下波动,也不知道是不是GP2Y传感器被我烧坏了,明天淘宝买点小电子零件包再试试看。
/ n6 Q/ k  \4 D' l
' G% `9 O7 s. q9 H  pm25_th.c
, g; Y4 q& |% N2 J3 v
  1. #include "pm25_th.h"
    # O0 a/ {5 W0 }+ ~) j3 q# D
  2. #include "stdio.h"
    3 u  T0 j" e4 L# L3 A( b! n
  3. * |+ R$ R! u% \, s" M! f3 v
  4. rt_thread_t thread_pm25 ;7 e8 y4 A0 d- ~4 P
  5. float pm25_voltage = 0.0f ;
    ( o. s! A! e0 Y6 W$ N2 c* V% ~6 W
  6. float pm25_density =0.0f ;
    " o$ F; Y8 S/ O" `2 t

  7. ( w+ y; T" d* j1 H- n, z
  8. void pm25_entry(void * parameters)
    $ [& t6 G  _: k/ k, G5 L
  9. {$ b; o5 J+ H( n9 \3 {
  10.     char buffer[128] ;1 D# P" `! v) v5 G4 K
  11.     rt_uint16_t pm25_cnt ;; K  G$ f# P; z. N$ F1 e
  12.     while(1)' N( K+ Z5 t5 j+ h) o  z  S
  13.     {
    , Y: h+ Q3 X- p3 D2 }: p
  14.         pm25_density = gp2y_read_pm25(&pm25_voltage);
    7 W' E! ^: M2 p) v/ V
  15.         pm25_cnt ++ ;
    % u% J8 w/ w5 }3 Y6 B
  16.         if(pm25_cnt >= 5000){
    ' A" Y9 k+ ?/ M8 h5 k# {* b
  17.             pm25_cnt = 0 ;
      [4 Z- p/ O' F2 d* C& B; Y; E
  18.             sprintf(buffer, "PM2.5:\t%0.2f mg/m3 \t voltage: %0.5f V \n", pm25_density, pm25_voltage);
    , x; O9 S! V* p
  19.             rt_kprintf(buffer);- F- g  i( ^4 W' i
  20.         }5 w0 n1 J4 o/ F" I
  21.     }
    / Q# Y* |7 O, H! M7 l/ w5 J; C
  22. }2 I$ X4 ~3 T) {
  23. 5 g! e7 Z# U+ l! j- y
  24. void pm25_init(void)
    , k0 m7 Q, g2 {# v7 s& v5 j/ g
  25. {$ z: R% O: ]- I, f* E
  26.     if( gp2y_hw_init() == RT_EOK){
    0 A. S. K* U/ Z* U- W2 Y8 K3 E* ~
  27.         thread_pm25 = rt_thread_create("PM2-5", pm25_entry, RT_NULL, 1024, RT_THREAD_PRIORITY_MAX/2 - 1, 1) ;
    9 w( Z: P# c  b2 Q- G; D$ A3 U" q7 W  K
  28.         if(thread_pm25 != RT_NULL){
    1 P4 c( |4 ]* `# ]: ^) p' x. B2 h
  29.             rt_thread_startup( thread_pm25) ;
    4 g9 d  Z& h  n. v% B
  30.         }" z; t$ I8 p9 a9 v
  31.     }
    ) q$ g7 U, \5 h, T$ U4 h* X% h
  32. }
复制代码
等零件到了,再看看SHT31的数据手册看能不能解决湿度100%的问题,目前(2019.10.23)实现效果如下。等搞定了再来更新。
% w4 S, I7 a2 u9 h! V% P1 K 微信图片_20191023212406.png
0 d  B5 F( b* g% n. `- j2 y; _# V- ^. a* j  B' G

) g7 h; ]7 K2 L# G, h, t
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-10-24 10:02:20 | 显示全部楼层
这里需要提一下线程优先级,温湿度采集线程要比PM25采集线程优先级要高一点,不然会发生温湿度线程无法启动的问题。

1 [/ b. e" p5 [8 V. g6 g3 B: @8 l: k4 ~) ]. m. S
这个不应该哦
使用道具 举报 回复
发表于 2019-10-25 19:46:29 | 显示全部楼层
yangjie 发表于 2019-10-24 10:02& s& r- Y5 G2 a( c! v! e+ j, r
这个不应该哦
- \& d, _- \% x; S
实际上是因为rt_hw_us_delay函数实际上是一直在干等着,并没有让出CPU,导致如果PM25线程优先级更高的话,那么温湿度线程就没办法执行了
使用道具 举报 回复
发表于 2019-10-26 09:15:34 | 显示全部楼层
韧明 发表于 2019-10-25 19:467 b6 A) I: M( L$ T- [8 p: ^
实际上是因为rt_hw_us_delay函数实际上是一直在干等着,并没有让出CPU,导致如果PM25线程优先级更高的话 ...

8 H+ J, h+ H$ L" |! [获取完一次数据不应该让出一次吗
使用道具 举报 回复
发表于 2019-10-26 09:52:08 | 显示全部楼层
yangjie 发表于 2019-10-26 09:150 ~+ x/ q6 y, A: e% t& V# i/ Y
获取完一次数据不应该让出一次吗
/ f2 d, U% ^7 j5 m
我没有让出,所以会有这种问题,应该再加入延时让出的
使用道具 举报 回复
发表于 2019-10-26 11:35:09 | 显示全部楼层
韧明 发表于 2019-10-26 09:52
4 A6 _% s* Z6 |- t" E/ B1 w& `我没有让出,所以会有这种问题,应该再加入延时让出的

; N5 b) |" D# m# P对的对的
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  1. 4 主题
  2. 88 帖子
  3. 88 积分

Ta的主页 发消息

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表