RTduino+sht31温湿度传感器

本次博客使用的是STM32F103C8T6,因为该BSP已经对接好RTduino了可以直接上手使用。

一、RTduino简介

RTduino是RT-Thread实时操作系统的Arduino生态兼容层,为RT-Thread社区的子社区、Arduino开源项目的下游项目,旨在兼容Arduino社区生态来丰富RT-Thread社区软件包生态(如上千种分门别类的Arduino库,以及Arduino社区优秀的开源项目),并降低RT-Thread操作系统以及与RT-Thread适配的芯片的学习门槛。通过RTduino,可以让用户使用Arduino的函数、编程方法,轻松地将RT-Thread和BSP使用起来。用户也可以直接使用Arduino第三方库(例如传感器驱动库、算法库等)直接用在RT-Thread工程中,极大地补充了RT-Thread社区生态。

本软件包可以在RT-Thread Studio IDE和Keil-MDK编译环境下运行,但是,因为Arduino的库都是基于GCC环境开发的,因此强烈推荐使用RT-Thread Studio IDE运行。

参考链接:https://github.com/RTduino/RTduino

二、在C8T6上使用RTduino读取传感器sht31

打开兼容框架:

修改kconfig,由于C8T6flash只有64k,有些功能就不得不裁剪。

下一步就是去软件包里面拉去sht31的软件包(同时也是arduino那边的传感器库)。

然后保存后编译一下工程,到这一步基本上是不会报错的,如果报错的话就回头看看前面是否按照步骤来的。然后来到代码编写环节,不同于传统的RTthread编写方式,代码编写需要在arduino_main.c文件下进行。

这时来到packages文件下找到刚刚拉取的sht31软件包。将代码复制粘贴到arduino_main.cpp文件中去,然后开始修改。

主要是修改一下波特率,在arduino给的demo下是初始化的9600,但是我们RTthread使用的是115200,为了不乱码就不给Serial.begin()参数这样就使用RTthread的默认波特率。

最后编译一下代码,同时我也将最终代码放在下面:

/***************************************************
  This is an example for the SHT31-D Humidity & Temp Sensor

  Designed specifically to work with the SHT31-D sensor from Adafruit
  ----> https://www.adafruit.com/products/2857

  These sensors use I2C to communicate, 2 pins are required to
  interface
 ****************************************************/

#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"

bool enableHeater = false;
uint8_t loopCnt = 0;

Adafruit_SHT31 sht31 = Adafruit_SHT31();

void setup() {
  Serial.begin();

//  while (!Serial)
//    delay(10);     // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("SHT31 test");
  if (! sht31.begin(0x44)) {   // Set to 0x45 for alternate i2c addr
    Serial.println("Couldn't find SHT31");
    while (1) delay(1);
  }

  Serial.print("Heater Enabled State: ");
  if (sht31.isHeaterEnabled())
    Serial.println("ENABLED");
  else
    Serial.println("DISABLED");
}


void loop() {
  float t = sht31.readTemperature();
  float h = sht31.readHumidity();

  if (! isnan(t)) {  // check if 'is not a number'
    Serial.print("Temp *C = "); Serial.print(t); Serial.print("\t\t");
  } else {
    Serial.println("Failed to read temperature");
  }

  if (! isnan(h)) {  // check if 'is not a number'
    Serial.print("Hum. % = "); Serial.println(h);
  } else {
    Serial.println("Failed to read humidity");
  }

  delay(1000);

  // Toggle heater enabled state every 30 seconds
  // An ~3.0 degC temperature increase can be noted when heater is enabled
  if (loopCnt >= 30) {
    enableHeater = !enableHeater;
    sht31.heater(enableHeater);
    Serial.print("Heater Enabled State: ");
    if (sht31.isHeaterEnabled())
      Serial.println("ENABLED");
    else
      Serial.println("DISABLED");

    loopCnt = 0;
  }
  loopCnt++;
}

最终运行结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: sht31湿度传感器是一种数字湿度传感器,可以测量环境的度和湿度。C8T6是一种型号较老的单片机开发板,使用ATmega8芯片。下面是一个可能的SHT31湿度传感器驱动C8T6代码的示例: #include <avr/io.h> #include <util/delay.h> #include <stdint.h> // 定义SHT31传感器的I2C地址 #define SHT31_I2C_ADDR 0x44 // 初始化I2C总线 void i2c_init() { // 设置SCL和SDA引脚为输出模式 DDRD |= (1 << PD0) | (1 << PD1); // 设置TWI控制寄存器的预分频系数为1,设置SCL时钟频率为 400KHz TWSR &= ~(1 << TWPS0); TWSR &= ~(1 << TWPS1); TWBR = 0x0C; } // 启动I2C总线 void i2c_start() { TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); } // 发送I2C设备地址和读写模式 void i2c_send_addr(uint8_t addr, uint8_t rw) { TWDR = addr | rw; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); } // 发送数据 void i2c_send_data(uint8_t data) { TWDR = data; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); } // 读取数据 uint8_t i2c_read_data() { TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); return TWDR; } // 停止I2C总线 void i2c_stop() { TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); _delay_us(50); } // 从SHT31读取度值 float sht31_read_temperature() { // 启动I2C总线 i2c_start(); // 发送传感器的I2C地址和读模式位 i2c_send_addr(SHT31_I2C_ADDR, 0x01); // 等待传感器完成度和湿度测量 _delay_ms(50); // 读取度数据 uint8_t msb = i2c_read_data(); uint8_t lsb = i2c_read_data(); // 停止I2C总线 i2c_stop(); // 计算度值 float temperature = ((msb << 8) | lsb) * 175.0 / 65535.0 - 45.0; return temperature; } // 从SHT31读取湿度值 float sht31_read_humidity() { // 启动I2C总线 i2c_start(); // 发送传感器的I2C地址和读模式位 i2c_send_addr(SHT31_I2C_ADDR, 0x01); // 等待传感器完成度和湿度测量 _delay_ms(50); // 读取湿度数据 uint8_t msb = i2c_read_data(); uint8_t lsb = i2c_read_data(); // 停止I2C总线 i2c_stop(); // 计算湿度值 float humidity = ((msb << 8) | lsb) * 100.0 / 65535.0; return humidity; } 以上代码是一个简单的SHT31湿度传感器的驱动代码示例,可以在C8T6开发板上读取度和湿度数值。使用I2C通信协议与传感器进行通信,获取湿度数据,并进行计算转换。需要注意的是,在使用代码前,需要将C8T6开发板上的SCL和SDA引脚连接到SHT31湿度传感器的对应引脚上。 ### 回答2: SHT31湿度传感器是一种广泛应用于物联网和环境监测等领域的传感器。其驱动代码将根据不同的硬件平台和编程语言而有所不同。下面以C语言为例,展示一个简单的SHT31湿度传感器在C8T6开发板上的驱动代码: ```c #include <Wire.h> // 包含I2C库 #define SHT31_ADDR 0x44 // 传感器I2C地址 void setup() { Serial.begin(9600); // 初始化串口 Wire.begin(); // 初始化I2C总线 delay(100); // 延时等待传感器稳定 } void loop() { float temperature, humidity; Wire.beginTransmission(SHT31_ADDR); // 启动传输 Wire.write(0x2C); // 度和湿度读取命令 Wire.write(0x06); // 高精度模式 Wire.endTransmission(); delay(500); // 等待传感器测量 Wire.requestFrom(SHT31_ADDR, 6); // 从传感器读取数据 if(Wire.available() == 6){ uint16_t rawTemp = Wire.read() << 8; rawTemp |= Wire.read(); uint16_t rawHumidity = Wire.read() << 8; rawHumidity |= Wire.read(); Wire.read(); Wire.read(); temperature = -45 + (175 * (float)rawTemp / 65535); humidity = 100 * (float)rawHumidity / 65535; Serial.print("Temperature: "); Serial.print(temperature); Serial.print(" °C, Humidity: "); Serial.print(humidity); Serial.println(" %"); } delay(2000); // 等待2秒后重新进行测量 } ``` 这段代码使用了Wire库进行I2C通信,首先初始化了串口和I2C总线,在主循环里使用I2C读取湿度数据,然后进行数据处理和打印输出。 需要注意的是,SHT31湿度传感器的I2C地址为0x44,读取的命令为0x2C,采用高精度模式。具体的硬件平台和传感器连接方式可能会有所不同,请根据具体情况进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式路上的流浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值