查看: 2885|回复: 0

[原创] 【赚周年币】Fireduino A5.IIC读取SHT20温湿度及显示

[复制链接]
  • TA的每日心情
    开心
    2024-10-14 08:33
  • 签到天数: 2451 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2016-12-27 21:39:35 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 limale 于 2017-1-17 20:19 编辑

    上一篇帖子https://www.cirmall.com/bbs/thread-59211-1-1.html实现了一个触摸按键来控制GPIO口还是相对简单的。今天来使用IIC接口来驱动温湿度传感器SHT20。Fireduino的IIC使用可以参考官方的维基页面:http://wiki.t-firefly.com/index.php/Fireduino/wire
    主要是几个API的说明,而且官方都有例子可以参考用起来还是蛮容易的。
    Fireduino Wire
    Fireduino I2C / TWI 设备库允许Fireduino通过I2C 接口与外设备通信,Fireduino 有2个 I2C 接口,且 只支持Master 模式。

    Fireduino Wire API
    begin()
       说明  对库进行初始化,加入I2C总线作为主机,通常只被调用一次。
       语法  Wire.begin()
       参数  无
       返回值 无
    requestFrom(...)
       说明 向从机请求数据。这些字节可以通过以下两个函数进行检索available()和 read()  
       语法 Wire.requestFrom(addr,number);
       参数 address :7比特地址,向该地址发送请求
               quantity:请求的字节个数
        返回值 返回的字节个数
    beginTransmission(address)
       说明 根据已给地址,开始向I2C的从机进行传输。随后,调用函数 write() 对传输的字节进行排列,调用函数 endTransmission() 进行传输 。
       语法 Wire.beginTransmission(addr);
       参数 address:传输指向的设备的7位比特地址
       返回值 无
    endTransmission()
       说明 停止对从机的传输,传输开始时调用 beginTransmission(),传输的字节由 write() 排列。
       函数 Wire.endTransmission()
       参数 无
       返回值 无
    write()
       说明 由从机中写入数据,回应主机的请求,或排列将要从主机传输给从机的字节(在beginTransimission()和endTransmission()中调用)。
       语法 Wire.write(value)
               Wire.write(string)
               Wire.write(data,length)
       参数
           val: 以单个字节形式发送的值
           str: 以一串字节的形式发送的字符串
           data:以字节形式发送的数组
           length:传输的字节数
       返回值byte:write()将返回写入的字节数,但是否读取这个返回值可判断是否写入buf
    available()
       说明  返回可被调用的字节数 。调用函数 requestFrom()后,可在主机中调用此函数。
       语法 Wire.available();
       参数 无
       返回值 可读取的字节数。
    read()
       说明 读取一个由从机发送给主机的字节,在调用 requestFrom() 函数后。
       语法 Wire.read()
       参数 无
       返回值 返回下一个接收到的字节

    今天要操作的器件就是如图的这个东西,很简单的IIC接口的器件写状态寄存器、读状态寄存器、读取温湿度数据等。
    QQ截图20161227195925.jpg
    QQ截图20161227195945.jpg
    有一点需要注意的是,Fireduino的IIC是使用的器件的七位地址,所以要转换一下。
    QQ截图20161227212913.jpg
    主要的代码:
    1. #include <Arduino.h>
    2. #include "Wire.h"
    3. #include "oled.h"
    4. #include "oledfont.h"

    5. //板载led
    6. #define LED_GREEN   13
    7. #define LED_BLUE    3

    8. #define Trigger_T_measuremnet_hold_master         0xe3
    9. #define Trigger_RH_measuremnet_hold_master        0xe5
    10. extern int16_t SHT20_Read_value(uint8_t value);
    11. uint16_t SHT20_val;
    12. float SHT20_val_temp;
    13. float SHT20_val_humi;
    14. char str[15] = {};

    15. void Sys_Init(void)
    16. {
    17.   Serial.begin(115200);
    18.   pinMode(OLED_GND, OUTPUT);
    19.   pinMode(OLED_VCC, OUTPUT);
    20.   pinMode(OLED_CLK, OUTPUT);
    21.   pinMode(OLED_DIN, OUTPUT);
    22.   pinMode(OLED_RES, OUTPUT);
    23.   pinMode(OLED_DC, OUTPUT);
    24.   pinMode(OLED_CS, OUTPUT);
    25.   digitalWrite(OLED_GND,LOW);
    26.   digitalWrite(OLED_VCC,HIGH);
    27.   
    28.   pinMode(LED_GREEN, OUTPUT);
    29.   digitalWrite(LED_GREEN,HIGH);
    30.   Wire.begin();
    31. }

    32. void Main(void)
    33. {
    34.   char str1[] = {"eeboard"};
    35.   char str2[] = {"www.eeboard.com"};  
    36.   uint8_t i = 4;
    37.   OLED_Init();
    38.   OLED_Clear();
    39.   
    40.   OLED_ShowCHinese(i, 0, 0);
    41.   OLED_ShowCHinese(i+16, 0, 1);
    42.   OLED_ShowString(i+32, 0, str1, 16);
    43.   OLED_ShowCHinese(i+88,0, 2);
    44.   OLED_ShowCHinese(i+104,0, 3);
    45.   OLED_ShowString(4,2,str2,16);
    46.   while(1)
    47.   {
    48.       SHT20_val = SHT20_Read_value(Trigger_RH_measuremnet_hold_master);
    49.       SHT20_val &= ~0x0003;
    50.       SHT20_val_humi = -6.0 + 125.0 / 65536 * (float)SHT20_val;
    51.       sprintf(str, "= %5.2f RH ", SHT20_val_humi);
    52.       OLED_ShowCHinese(0, 4, 4);
    53.       OLED_ShowCHinese(16, 4, 5);
    54.       OLED_ShowString(32, 4, str, 16);
    55.       
    56.       SHT20_val = SHT20_Read_value(Trigger_T_measuremnet_hold_master);
    57.       SHT20_val &= ~0x0003;
    58.       SHT20_val_temp = -46.85 + 175.72 / 65536 * (float)SHT20_val;
    59.       sprintf(str, "= %5.2f C ", SHT20_val_temp);
    60.       OLED_ShowCHinese(0, 6, 6);
    61.       OLED_ShowCHinese(16, 6, 7);
    62.       OLED_ShowString(32, 6, str, 16);   
    63.     }  
    64. }
    复制代码
    然后在OLED上显示出来,室温不到20度晚上公司没有空调还是有点儿冷的。
    IMG_20161227_213539.jpg
    程序源码: SHT20.rar (7.58 KB, 下载次数: 2)

    评分

    参与人数 1 +30 收起 理由
    loveeeboard + 30

    查看全部评分

    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-23 08:56 , Processed in 0.132087 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.