社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 603|回复: 3

[讨论] 给PSoC6开发板添加一颗温湿度传感器

[复制链接]

4955

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-12-20 17:53:09 | 显示全部楼层 |阅读模式

CY8CKIT-062-BLE PSoC 6 BLE Pioneer Kit是一块强大的开发板
PSoC6双核“处理器”,6轴力学传感器,数字麦克风,FLASH,FRAME(预留接口),E-INK电子墨水屏应有尽有
尤其E-INK电子墨水屏大尺寸、功耗低,能用它开发很多低功耗的东西,比如环境监测等等
原先手里有一个SENSIRION的开发板,家里一直用它来测温湿度
体积小,电池供电,放哪都很方便
前段时间不小收把屏幕给摔坏了,现在只能看到温度,挺不方便
QQ图片20171220171750.png

一直想再做一个温湿度传感器,问题都出在屏幕上了
手里有很多带屏幕的开发板,可惜都是TFT屏,比较耗电,必需接电源才能工作,用起来比较麻烦
用数码管显示数据也存在供电的问题,都不是很理想
现在用CY8CKIT-062-BLE PSoC 6 BLE Pioneer Kit用来做温湿度传感器感觉还是非常不错的,除了体积大点
264*176的分辨率可以用来显示很多内容
比如时间、日期、温湿度、气压和历史曲线等等

今天第一步先把温湿度传感器加进去
传感器使用silicon labs的si7020,接口和通信协议和sensirion 的sht20通用
为了省事参考了Cypress太阳能开发板Solar-Powered IoT Device Kit的EH_Motherboard工程
毕竟以前用过它测温湿度
http://bbs.eeworld.com.cn/thread-485570-1-1.html

本以为分分钟可以搞定的事实际还是花了很多时间
好像每次做东西都会有很多困难需要解决
还好这次都解决了
开发板预留了很多接口,可惜电源接口比较少,尤其将E-LINK插在开发板上的时候基本是没有电源可以用的
另外I2C接口基本不是被E-LINK占用就是被E-LINK遮挡住,没法使用,除非飞线解决
唯一没被遮挡的是P8.0和P8.1,开始的时候使用P8.0和P8.1,调了一会儿没调通
后来发现这两个引脚被其它功能占用了,实际没并有连接
QQ图片20171220173406.png

最后不得不先把E-LINK拆下来,准备先把温湿度传感器跑通再说
QQ图片20171220171027.png

Arduion接口包含了I2C引脚,接口对应SCL,SDO,VREF,GND
我的传感器评估板也是这么设计的,一搬的开发板直接插上就可以工作
因为通常VREF都会和模拟电连接,所以VREF可以用作电源输出
可惜CY8CKIT-062-BLE PSoC 6 BLE Pioneer Kit的VREF只连接到PSoC6的VREF引脚,并没有和开发板上的电源连接
最后不得不再从别处飞一根电源线过来

传感器使用了Solar-Powered IoT Device Kit的EH_Motherboard工程中的代码
编译时出现很多错误,原因是EH_Motherboard的I2C模块和PSoC6有很大区别
把所有和I2C模块有关的函数都修改后总算能把温湿度数据读出

QQ图片20171220171000.png

下一步再看看怎么能让温湿度传感器和E-INK并存,这样就不用在电脑上用DEBUG的方式看环境温湿度了

附上修改后的si7020代码
  1. /******************************************************************************
  2. littleshrimp [email]1440507229@qq.com[/email]
  3. ******************************************************************************/

  4. #include <project.h>

  5. #ifndef __SI7020_H_
  6. #define __SI7020_H_

  7. /******************************************************************************
  8. * Macros and Constants
  9. ******************************************************************************/
  10. #define SI7020_SLAVE_ADDR     (0x40)    /* Sensor's I2C slave address */

  11. #define SI7020_WRITE_USER_REG (0xE6)    /* I2C command for Writing RH/T User Register */
  12. #define SI7020_READ_USER_REG  (0xE7)    /* I2C command for Reading RH/T User Register */
  13. #define SI7020_MEASURE_RH     (0xE5)    /* I2C command for Measuring Relative Humidity */
  14. #define SI7020_READ_TEMP      (0xE0)    /* I2C command for Reading Temperature Value from Previous RH Measurement */

  15. /******************************************************************************
  16. * External Function Prototypes
  17. ******************************************************************************/
  18. uint32 Si7020_Init(void);
  19. uint32 Si7020_WriteRead(uint8 * data, uint32 sCnt, uint32 rCnt);

  20. float Si7020_GetTemperature(void);
  21. float Si7020_GetHhumidity(void);
  22. #endif /* __SI7020_H_ */

复制代码
  1. /******************************************************************************
  2. littleshrimp [email]1440507229@qq.com[/email]
  3. ******************************************************************************/

  4. #include "Si7020.h"

  5. #define I2C_TIMEOUT           (100UL)

  6. const uint16_t POLYNOMIAL = 0x131; //P(x)=x^8+x^5+x^4+1 = 100110001

  7. #define ERROR       1
  8. #define SUCCESS     0

  9. uint32 Si7020_Init(void)
  10. {
  11.     cy_en_scb_i2c_status_t status;

  12.     /* Write User Register */
  13.    
  14.     status = Cy_SCB_I2C_MasterSendStart(mI2C_HW, SI7020_SLAVE_ADDR, CY_SCB_I2C_WRITE_XFER, I2C_TIMEOUT, &mI2C_context);
  15.     /* If error occurs in I2C communication, reset I2C status and return. */
  16.     if(status != CY_SCB_I2C_SUCCESS) return ERROR;
  17.     status = Cy_SCB_I2C_MasterWriteByte(mI2C_HW, SI7020_WRITE_USER_REG, I2C_TIMEOUT, &mI2C_context);
  18.     /* If error occurs in I2C communication, reset I2C status and return. */
  19.     if(status != CY_SCB_I2C_SUCCESS) return ERROR ;

  20.     status = Cy_SCB_I2C_MasterWriteByte(mI2C_HW, 0x3A | 0x01, I2C_TIMEOUT, &mI2C_context);
  21.     /* If error occurs in I2C communication, reset I2C status and return. */
  22.     if(status != CY_SCB_I2C_SUCCESS) return ERROR;
  23.     /* Send Stop condition on the bus */
  24.     if (Cy_SCB_I2C_MasterSendStop(mI2C_HW, I2C_TIMEOUT, &mI2C_context) != CY_SCB_I2C_SUCCESS)
  25.     {
  26.        return ERROR;
  27.     }
  28.     return SUCCESS;
  29. }

  30. uint32 Si7020_WriteRead(uint8 * data, uint32 sCnt, uint32 rCnt)
  31. {
  32.     cy_en_scb_i2c_status_t status;
  33.     uint32 i;
  34.     status = Cy_SCB_I2C_MasterSendStart(mI2C_HW, SI7020_SLAVE_ADDR, CY_SCB_I2C_WRITE_XFER, I2C_TIMEOUT, &mI2C_context);
  35.     /* If error occurs in I2C communication, reset I2C status and return. */
  36.     if(status != CY_SCB_I2C_SUCCESS) return ERROR;
  37.     for(i=0; i<sCnt; i++)
  38.     {
  39.         status = Cy_SCB_I2C_MasterWriteByte(mI2C_HW, data[i], I2C_TIMEOUT, &mI2C_context);
  40.         /* If error occurs in I2C communication, reset I2C status and return. */
  41.         if(status != CY_SCB_I2C_SUCCESS) return ERROR ;
  42.     }

  43.     // Conversion Time(us) of Si7020 sensor
  44.     CyDelayUs(40);
  45.    
  46.     status = Cy_SCB_I2C_MasterSendReStart(mI2C_HW, SI7020_SLAVE_ADDR, CY_SCB_I2C_READ_XFER, I2C_TIMEOUT, &mI2C_context); // read direction
  47.     /* If error occurs in I2C communication, reset I2C status and return. */
  48.     if(status != CY_SCB_I2C_SUCCESS) return ERROR ;

  49.     for(i=0; i<(rCnt-1); i++)
  50.     {
  51.         status = Cy_SCB_I2C_MasterReadByte(mI2C_HW, CY_SCB_I2C_ACK, &data[i], I2C_TIMEOUT, &mI2C_context);
  52.         /* If error occurs in I2C communication, reset I2C status and return. */
  53.         if(status != CY_SCB_I2C_SUCCESS) return ERROR ;
  54.     }
  55.     status = Cy_SCB_I2C_MasterReadByte(mI2C_HW, CY_SCB_I2C_NAK, &data[rCnt-1], I2C_TIMEOUT, &mI2C_context);
  56.     /* If error occurs in I2C communication, reset I2C status and return. */
  57.     if(status != CY_SCB_I2C_SUCCESS) return ERROR ;

  58.     /* Send Stop condition on the bus */
  59.     if (Cy_SCB_I2C_MasterSendStop(mI2C_HW, I2C_TIMEOUT, &mI2C_context) != CY_SCB_I2C_SUCCESS)
  60.     {
  61.        return ERROR;
  62.     }
  63.     return SUCCESS;
  64. }

  65. uint8_t Si7020_CheckCrc(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum)
  66. {
  67.    uint8_t crc = 0;
  68.    uint8_t byteCtr;
  69.    //calculates 8-Bit checksum with given polynomial
  70.    for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
  71.    {
  72.        crc ^= (data[byteCtr]);      
  73.      
  74.       for (uint8_t bit = 8; bit > 0; --bit)
  75.       {
  76.         if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;
  77.         else crc = (crc << 1);
  78.       }
  79.    }
  80.    if (crc != checksum) return 0;
  81.    else return 1;
  82. }
  83. float Si7020_GetTemperature(void)
  84. {
  85.     uint8_t crc;
  86.     uint8_t buf[3];
  87.     uint16_t temp_code;
  88.     float temperature;
  89.     /* Read Temperature data from I2C Sensor */
  90.     buf[0] = SI7020_READ_TEMP;
  91.     Si7020_WriteRead(buf, 1, 3);
  92.     temp_code = buf[0] << 8;
  93.     temp_code |= buf[1];
  94.     temperature = ((175.72 * temp_code) / 65536.00) - 46.85;
  95.     return temperature;
  96. }
  97. float Si7020_GetHhumidity(void)
  98. {
  99.     uint8_t crc;
  100.     uint8_t buf[3];
  101.     uint16_t temp_code;
  102.     float humidity;
  103.     buf[0] = SI7020_MEASURE_RH;
  104.     Si7020_WriteRead(buf, 1, 3);
  105.     temp_code = buf[0] << 8;
  106.     temp_code |= buf[1];
  107.     temp_code &= ~0x0003; // clear bits [1..0] (status bits)
  108.     humidity = -6.0 + 125.0/65536 * (float)temp_code; // RH= -6 + 125 * SRH/2^16
  109.     return humidity;
  110. }

复制代码

此帖出自单片机论坛


回复

使用道具 举报

550

TA的帖子

103

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2017-12-22 14:11:03 | 显示全部楼层
楼主节日快乐!祝广大坛友们工作顺利,事业有成,身体健康,家庭幸福,来年涨工资!

看到屏碎了,心里也不得劲,碎碎平安吧!感谢楼主分享

点评

谢谢,也祝你节日快乐  详情 回复 发表于 2017-12-22 22:54


回复

使用道具 举报

4955

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-12-22 22:54:37 | 显示全部楼层
gs001588 发表于 2017-12-22 14:11
楼主节日快乐!祝广大坛友们工作顺利,事业有成,身体健康,家庭幸福,来年涨工资!

看到屏碎了,心里也 ...

谢谢,也祝你节日快乐


回复

使用道具 举报

41

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-1-9 15:02:15 | 显示全部楼层
来学习下
北京长信物联科技有限公司
专业的USB温湿度传感器、485温湿度传感器、气体传感器、64路DS18B20温度采集模块厂商。
www.lct2000.cn
QQ:1930227091


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-4-26 02:07 , Processed in 0.132456 second(s), 19 queries , Redis On.

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