跳到主要内容

I2C传感器

概述

I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,广泛用于连接各种传感器、存储器和外设。YF3300-ESP32S3 开发板提供了 1 个 I2C 总线(SDA=GPIO17, SCL=GPIO18),本章节将以 SHT30 温湿度传感器为例,介绍如何使用 I2C 总线读取传感器数据。

所需 NuGet 包

在 nanoFramework 项目中使用 I2C 和 SHT30 需要引用以下包:

包名说明
nanoFramework.System.Device.I2cI2C 总线操作核心库
nanoFramework.Iot.Device.Sht3xSHT30/SHT31/SHT35 传感器驱动库
nanoFramework.Hardware.Esp32ESP32 硬件配置库(用于引脚映射)
nanoFramework.CoreLibrary基础类库(通常自动包含)

SHT30 传感器

SHT30 传感器是一种高精度数字温湿度传感器,主要特性:

参数规格
温度范围-40°C ~ +125°C
温度精度±0.3°C
湿度范围0% ~ 100% RH
湿度精度±2% RH
供电电压2.4V ~ 5.5V
I2C 地址0x44(默认)或 0x45

硬件连接说明

I2C 总线引脚

YF3300-ESP32S3 开发板的 I2C 总线引脚定义:

信号GPIO 引脚说明
SDAGPIO17I2C 数据线
SCLGPIO18I2C 时钟线

SHT30 连接方式

SHT30 引脚开发板连接
VDD3.3V
GNDGND
SDAGPIO17
SCLGPIO18
ADDRGND(地址为 0x44)

使用示例

Sht30Sensor.cs

using System;
using Iot.Device.Sht3x;
using System.Device.I2c;
using nanoFramework.Hardware.Esp32;

namespace Sht30SensorTest
{
// SHT30 温湿度传感器封装类
public class Sht30Sensor : IDisposable
{
private Sht3x _sht30; // SHT3x 传感器驱动实例
private I2cDevice _i2cDevice; // I2C 设备实例
private const int DefaultI2cBusId = 1; // I2C 总线 ID
private const byte DefaultSensorAddress = 0x44; // 传感器地址

// SHT30传感器数据模型(嵌套类)
public class Sht30Data
{
public double Temperature { get; set; } // 温度值(摄氏度)
public double Humidity { get; set; } // 湿度值(百分比)
public DateTime Timestamp { get; set; } // 数据读取时间戳

// 格式化输出传感器数据
public override string ToString()
{
return $"时间: {Timestamp:HH:mm:ss}, 温度: {Temperature:F1}°C, 湿度: {Humidity:F1}%";
}
}

// 默认构造函数:I2C总线0,地址0x44,SDA=IO17,SCL=IO18
public Sht30Sensor()
{
Configuration.SetPinFunction(Gpio.IO17, DeviceFunction.I2C1_DATA);
Configuration.SetPinFunction(Gpio.IO18, DeviceFunction.I2C1_CLOCK);

var i2cSettings = new I2cConnectionSettings(DefaultI2cBusId, DefaultSensorAddress);
_i2cDevice = I2cDevice.Create(i2cSettings);
_sht30 = new Sht3x(_i2cDevice);
}

// 带参数构造函数
public Sht30Sensor(int i2cBusId, byte sensorAddress)
{
Configuration.SetPinFunction(Gpio.IO17, DeviceFunction.I2C1_DATA);
Configuration.SetPinFunction(Gpio.IO18, DeviceFunction.I2C1_CLOCK);

var i2cSettings = new I2cConnectionSettings(i2cBusId, sensorAddress);
_i2cDevice = I2cDevice.Create(i2cSettings);
_sht30 = new Sht3x(_i2cDevice);
}

// 单次获取传感器数据
public Sht30Data ReadMeasurement()
{
try
{
// 直接读取属性(属性内部已包含读取逻辑)
return new Sht30Data
{
Temperature = _sht30.Temperature.DegreesCelsius,
Humidity = _sht30.Humidity.Percent,
Timestamp = DateTime.UtcNow
};
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"SHT30读取失败:{ex.Message}");
return null;
}
}

// 重置传感器
public void Reset()
{
try
{
_sht30.Reset();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"SHT30重置失败:{ex.Message}");
}
}

// 释放资源
public void Dispose()
{
if (_sht30 != null) { _sht30.Dispose(); _sht30 = null; }
if (_i2cDevice != null) { _i2cDevice.Dispose(); _i2cDevice = null; }
}
}
}

Program.cs

using System;
using System.Diagnostics;
using System.Threading;

namespace Sht30SensorTest
{
public class Program
{
public static void Main()
{
Debug.WriteLine("SHT30 温湿度传感器测试");
Debug.WriteLine("========================\n");

// 创建传感器实例(使用默认地址 0x44)
using (var sensor = new Sht30Sensor())
{
while (true)
{
// 读取传感器数据
Sht30Sensor.Sht30Data data = sensor.ReadMeasurement();

if (data != null)
{
Debug.WriteLine(data.ToString());
}
else
{
Debug.WriteLine("读取失败,重试中...");
}

// 每2秒读取一次
Thread.Sleep(2000);
}
}
}
}
}