社区导航

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

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

[复制链接]

4698

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代码
[C] 纯文本查看 复制代码
/******************************************************************************
littleshrimp [email]1440507229@qq.com[/email]
******************************************************************************/

#include <project.h>

#ifndef __SI7020_H_
#define __SI7020_H_

/******************************************************************************
* Macros and Constants
******************************************************************************/
#define SI7020_SLAVE_ADDR     (0x40)    /* Sensor's I2C slave address */

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

/******************************************************************************
* External Function Prototypes
******************************************************************************/
uint32 Si7020_Init(void);
uint32 Si7020_WriteRead(uint8 * data, uint32 sCnt, uint32 rCnt);

float Si7020_GetTemperature(void);
float Si7020_GetHhumidity(void);
#endif /* __SI7020_H_ */


[C] 纯文本查看 复制代码
/******************************************************************************
littleshrimp [email]1440507229@qq.com[/email]
******************************************************************************/

#include "Si7020.h"

#define I2C_TIMEOUT           (100UL)

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

#define ERROR       1
#define SUCCESS     0

uint32 Si7020_Init(void)
{
    cy_en_scb_i2c_status_t status;

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

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

uint32 Si7020_WriteRead(uint8 * data, uint32 sCnt, uint32 rCnt)
{
    cy_en_scb_i2c_status_t status;
    uint32 i;
    status = Cy_SCB_I2C_MasterSendStart(mI2C_HW, SI7020_SLAVE_ADDR, CY_SCB_I2C_WRITE_XFER, I2C_TIMEOUT, &mI2C_context);
    /* If error occurs in I2C communication, reset I2C status and return. */
    if(status != CY_SCB_I2C_SUCCESS) return ERROR;
    for(i=0; i<sCnt; i++)
    {
        status = Cy_SCB_I2C_MasterWriteByte(mI2C_HW, data[i], I2C_TIMEOUT, &mI2C_context);
        /* If error occurs in I2C communication, reset I2C status and return. */
        if(status != CY_SCB_I2C_SUCCESS) return ERROR ;
    }

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

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

    /* Send Stop condition on the bus */
    if (Cy_SCB_I2C_MasterSendStop(mI2C_HW, I2C_TIMEOUT, &mI2C_context) != CY_SCB_I2C_SUCCESS)
    {
       return ERROR;
    }
    return SUCCESS;
}

uint8_t Si7020_CheckCrc(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum)
{
   uint8_t crc = 0;
   uint8_t byteCtr;
   //calculates 8-Bit checksum with given polynomial
   for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
   { 
       crc ^= (data[byteCtr]);      
     
      for (uint8_t bit = 8; bit > 0; --bit)
      { 
        if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;
        else crc = (crc << 1);
      }
   }
   if (crc != checksum) return 0;
   else return 1;
}
float Si7020_GetTemperature(void)
{
    uint8_t crc; 
    uint8_t buf[3];
    uint16_t temp_code;
    float temperature;
    /* Read Temperature data from I2C Sensor */
    buf[0] = SI7020_READ_TEMP;
    Si7020_WriteRead(buf, 1, 3);
    temp_code = buf[0] << 8;
    temp_code |= buf[1];
    temperature = ((175.72 * temp_code) / 65536.00) - 46.85;
    return temperature;
}
float Si7020_GetHhumidity(void)
{
    uint8_t crc; 
    uint8_t buf[3];
    uint16_t temp_code;
    float humidity;
    buf[0] = SI7020_MEASURE_RH;
    Si7020_WriteRead(buf, 1, 3);
    temp_code = buf[0] << 8;
    temp_code |= buf[1];
    temp_code &= ~0x0003; // clear bits [1..0] (status bits)
    humidity = -6.0 + 125.0/65536 * (float)temp_code; // RH= -6 + 125 * SRH/2^16
    return humidity;
}


此帖出自单片机论坛
虾扯蛋


回复

使用道具 举报

505

TA的帖子

103

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

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

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

点评

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


回复

使用道具 举报

4698

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

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

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

谢谢,也祝你节日快乐
虾扯蛋


回复

使用道具 举报

37

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-1-20 21:08 , Processed in 0.122593 second(s), 17 queries , Redis On.

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