5900|4

9716

帖子

24

TA的资源

版主

楼主
 

给PSoC6开发板添加一颗温湿度传感器 [复制链接]


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


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

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

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


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


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模块有关的函数都修改后总算能把温湿度数据读出



下一步再看看怎么能让温湿度传感器和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. }

复制代码

此帖出自单片机论坛

最新回复

楼主你好,请问一下这个从地址不变吗?我看有些I2C器件是要给每个寄存器一个值,你这地址一直是一个是为什么呢   详情 回复 发表于 2023-8-17 10:39
点赞 关注
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 

回复
举报

664

帖子

104

TA的资源

纯净的硅(中级)

沙发
 
楼主节日快乐!祝广大坛友们工作顺利,事业有成,身体健康,家庭幸福,来年涨工资!

看到屏碎了,心里也不得劲,碎碎平安吧!感谢楼主分享
此帖出自单片机论坛

点评

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

回复

9716

帖子

24

TA的资源

版主

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

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

谢谢,也祝你节日快乐
此帖出自单片机论坛
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

203

帖子

0

TA的资源

一粒金砂(高级)

4
 
来学习下
此帖出自单片机论坛
 
个人签名北京长信物联科技有限公司
专业的USB温湿度传感器、485温湿度传感器、气体传感器、64路DS18B20温度采集模块厂商。
www.lct2000.cn
QQ:1930227091
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

5
 

楼主你好,请问一下这个从地址不变吗?我看有些I2C器件是要给每个寄存器一个值,你这地址一直是一个是为什么呢

此帖出自单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表