资料介绍
描述
在这个项目中,我们将使用适用于 Windows 10 IoT Core on Raspberry Pi 2套件组件的 Adafruit 入门包来创建一个使用气压传感器读取温度、压力和高度的项目。
注意:该套件有两个版本,一个包含 BMP280 传感器,另一个包含 BME280。如果你有 BME280,
硬件
根据下面“原理图”部分中的 Fritzing 图,将 Raspberry Pi2 连接到面包板和其他组件。
软件
您可以从https://github.com/ms-iot/adafruitsample下载代码启动项目,我们将引导您完成添加与 Web 服务对话并在地图上获取您的 pin 所需的代码。什么地图?
打开“Lesson_203\StartSolution\lesson_203.sln ”并打开 mainpage.xaml.cs 文件。
我们已经填写了一些方法作为您在此解决方案中的起点。如果你想跳到前面,你可以在以下位置找到所有代码已完成的解决方案:“Lesson_203\FullSolution\lesson_203.sln”
MainPage.xaml.cs
打开 MainPage.xaml.cs 文件。
添加对气压传感器 (BMP280) 类的引用。
public sealed partial class MainPage : Page
{
//A class which wraps the barometric sensor
BMP280 BMP280;
现在我们在 OnNavigatedTo 方法中添加代码,该方法将为气压传感器创建一个新的 BMP280 对象并初始化该对象。
如果您不想在地图上添加图钉,请删除 MakePinWebAPICall();
//This method will be called by the application framework when the page is first loaded
protected override async void OnNavigatedTo(NavigationEventArgs navArgs)
{
Debug.WriteLine("MainPage::OnNavigatedTo");
MakePinWebAPICall();
try
{
//Create a new object for our barometric sensor class BMP280 = new BMP280();
//Initialize the sensor
await BMP280.Initialize();
接下来我们添加代码来执行以下操作:
- 创建变量来存储温度、压力和高度。将它们设置为 0。
- 为海平面压力创建一个变量。默认值为 1013.25 hPa。
- 读取温度、压力和高度 10 次并将值输出到调试控制台。
//Create variables to store the sensor data: temperature, pressure and altitude.
//Initialize them to 0.
float temp = 0;
float pressure = 0;
float altitude = 0;
//Create a constant for pressure at sea level.
//This is based on your local sea level pressure (Unit: Hectopascal)
const float seaLevelPressure = 1013.25f;
//Read 10 samples of the data
for(int i = 0; i < 10; i++)
{
temp = await BMP280.ReadTemperature();
pressure = await BMP280.ReadPreasure();
altitude = await BMP280.ReadAltitude(seaLevelPressure);
//Write the values to your debug console
Debug.WriteLine("Temperature: " + temp.ToString() + " deg C");
Debug.WriteLine("Pressure: " + pressure.ToString() + " Pa");
Debug.WriteLine("Altitude: " + altitude.ToString() + " m");
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
BMP280.cs
打开 BMP280.cs 文件。
代码的第一部分是列出 BMP280 中不同寄存器的地址。这些值可以在BMP280 数据表中找到。
在 BMP280 类中,在寄存器地址枚举之后添加以下内容。
//String for the friendly name of the I2C bus
const string I2CControllerName = "I2C1";
//Create an I2C device
private I2cDevice bmp280 = null;
//Create new calibration data for the sensor
BMP280_CalibrationData CalibrationData;
//Variable to check if device is initialized
bool init = false;
接下来在Initialize函数中添加如下代码:
//Method to initialize the BMP280 sensor
public async Task Initialize()
{
Debug.WriteLine("BMP280::Initialize");
try
{
//Instantiate the I2CConnectionSettings using the device address of the BMP280
I2cConnectionSettings settings = new I2cConnectionSettings(BMP280_Address);
//Set the I2C bus speed of connection to fast mode settings.BusSpeed = I2cBusSpeed.FastMode;
//Use the I2CBus device selector to create an advanced query syntax string
string aqs = I2cDevice.GetDeviceSelector(I2CControllerName); //Use the Windows.Devices.Enumeration.DeviceInformation class to create a collection using the advanced query syntax string
DeviceInformationCollection dis = await DeviceInformation.FindAllAsync(aqs);
//Instantiate the the BMP280 I2C device using the device id of the I2CBus and the I2CConnectionSettings
bmp280 = await I2cDevice.FromIdAsync(dis[0].Id, settings);
//Check if device was found
if (bmp280 == null)
{
Debug.WriteLine("Device not found");
}
}
catch (Exception e)
{
Debug.WriteLine("Exception: " + e.Message + "\n" + e.StackTrace);
throw;
}
}
在Begin函数中添加如下代码:
private async Task Begin()
{
Debug.WriteLine("BMP280::Begin");
byte[] WriteBuffer = new byte[] { (byte)eRegisters.BMP280_REGISTER_CHIPID };
byte[] ReadBuffer = new byte[] { 0xFF };
//Read the device signature
bmp280.WriteRead(WriteBuffer, ReadBuffer);
Debug.WriteLine("BMP280 Signature: " + ReadBuffer[0].ToString()); //Verify the device signature
if (ReadBuffer[0] != BMP280_Signature)
{
Debug.WriteLine("BMP280::Begin Signature Mismatch.");
return;
}
//Set the initalize variable to true
init = true;
//Read the coefficients table
CalibrationData = await ReadCoefficeints();
//Write control register
await WriteControlRegister();
//Write humidity control register
await WriteControlRegisterHumidity();
}
将以下代码添加到接下来的 2 个函数中以写入控制寄存器。
//Method to write 0x03 to the humidity control register
private async Task WriteControlRegisterHumidity()
{
byte[] WriteBuffer = new byte[] { (byte)eRegisters.BMP280_REGISTER_CONTROLHUMID, 0x03 };
bmp280.Write(WriteBuffer);
await Task.Delay(1);
return;
}
//Method to write 0x3F to the control register
private async Task WriteControlRegister()
{
byte[] WriteBuffer = new byte[] { (byte)eRegisters.BMP280_REGISTER_CONTROL, 0x3F };
bmp280.Write(WriteBuffer);
await Task.Delay(1);
return;
}
将以下代码添加到 ReadUInt16_LittleEndian 函数中即可:
//Method to read a 16-bit value from a register and return it in little endian format
private UInt16 ReadUInt16_LittleEndian(byte register)
{
UInt16 value = 0;
byte[] writeBuffer = new byte[] { 0x00 };
byte[] readBuffer = new byte[] { 0x00, 0x00 };
writeBuffer[0] = register;
bmp280.WriteRead(writeBuffer, readBuffer);
int h = readBuffer[1] << 8;
int l = readBuffer[0];
value = (UInt16)(h + l);
return value;
}
将以下代码添加到 ReadByte 函数以从寄存器中读取 8 位数据。
//Method to read an 8-bit value from a register
private byte ReadByte(byte register)
{
byte value = 0;
byte[] writeBuffer = new byte[] { 0x00 };
byte[] readBuffer = new byte[] { 0x00 };
writeBuffer[0] = register;
bmp280.WriteRead(writeBuffer, readBuffer);
value = readBuffer[0];
return value;
}
接下来的 3 个功能已为您完成。可以在数据表中找到编写这些函数所需的信息。
- ReadCoefficeints:这是从寄存器地址读取所有校准数据的函数。
- BMP280_compensate_T_double:在此函数中,使用 BMP280 数据表中的补偿公式计算以 ºC 为单位的温度。
- BMP280_compensate_P_Int64:在此函数中,使用 BMP280 数据表中的补偿公式计算以 Pa 为单位的压力。
添加如下代码完成ReadTemperature功能。
public async Task<float> ReadTemperature()
{
//Make sure the I2C device is initialized
if (!init) await Begin();
//Read the MSB, LSB and bits 7:4 (XLSB) of the temperature from the BMP280 registers
byte tmsb = ReadByte((byte)eRegisters.BMP280_REGISTER_TEMPDATA_MSB);
byte tlsb = ReadByte((byte)eRegisters.BMP280_REGISTER_TEMPDATA_LSB);
byte txlsb = ReadByte((byte)eRegisters.BMP280_REGISTER_TEMPDATA_XLSB); // bits 7:4
//Combine the values into a 32-bit integer
Int32 t = (tmsb << 12) + (tlsb << 4) + (txlsb >> 4);
//Convert the raw value to the temperature in degC
double temp = BMP280_compensate_T_double(t);
//Return the temperature as a float value
return (float)temp;
}
重复相同的步骤以完成 ReadPressure 函数。
public async Task<float> ReadPreasure()
{
//Make sure the I2C device is initialized
if (!init) await Begin();
//Read the temperature first to load the t_fine value for compensation
if (t_fine == Int32.MinValue)
{
await ReadTemperature();
}
//Read the MSB, LSB and bits 7:4 (XLSB) of the pressure from the BMP280 registers
byte tmsb = ReadByte((byte)eRegisters.BMP280_REGISTER_PRESSUREDATA_MSB);
byte tlsb = ReadByte((byte)eRegisters.BMP280_REGISTER_PRESSUREDATA_LSB);
byte txlsb = ReadByte((byte)eRegisters.BMP280_REGISTER_PRESSUREDATA_XLSB); // bits 7:4
//Combine the values into a 32-bit integer
Int32 t = (tmsb << 12) + (tlsb << 4) + (txlsb >> 4);
//Convert the raw value to the pressure in Pa
Int64 pres = BMP280_compensate_P_Int64(t);
//Return the temperature as a float value
return ((float)pres) / 256;
}
最后完成ReadAltitude函数:
//Method to take the sea level pressure in Hectopascals(hPa) as a parameter and calculate the altitude using current pressure.
public async Task<float> ReadAltitude(float seaLevel)
{
//Make sure the I2C device is initialized
if (!init) await Begin();
//Read the pressure first
float pressure = await ReadPreasure();
//Convert the pressure to Hectopascals(hPa)
pressure /= 100;
//Calculate and return the altitude using the international barometric formula
return 44330.0f * (1.0f - (float)Math.Pow((pressure / seaLevel), 0.1903f));
}
您的项目现在可以部署了!
预期产出
在这里查看下一课。
- 气压传感器BMP数据手册下载 8次下载
- 高精度低功耗的小型双气压计芯片SPL06-007 0次下载
- P900系列高性能金属应变式压力传感器的中文数据手册免费下载 15次下载
- 基于支持向量机的压力传感器校正模型 9次下载
- FM-DQY大气压力传感器说明 8次下载
- P900系列高性能金属应变式压力传感器 12次下载
- 光纤压力和温度传感器在石油天然气应用 36次下载
- 如何使用ATmega16实现压力传感器温度补偿智能化的设计 6次下载
- 如何实现压阻式压力传感器温度的补偿方法 49次下载
- BMP085气压传感器的详细资料介绍和应用代码免费下载 23次下载
- 进气压力传感器 24次下载
- 用硅压阻式压力传感器解算高度速度的方法
- 轮胎气压传感器设计
- 膜盒式压力传感器的应用
- 压力传感器及误差补偿
- 使用气压传感器MS5611获取温度数据和气压数据 2908次阅读
- HPX气体压力传感器的功能特性及如何实现飞行器高度测量 4255次阅读
- 进气压力传感器输出特性_进气压力传感器原理 3428次阅读
- 进气压力传感器的作用及安装位置 2.3w次阅读
- 进气压力传感器信号电路电压过高的原因 3.5w次阅读
- 进气压力传感器故障现象及解决方法 2.1w次阅读
- 气压传感器的工作原理_气压传感器应用 2.4w次阅读
- 进气压力传感器坏了有什么反应 2.1w次阅读
- 如何在导航仪中利用MEMS压力传感器辅助GPS接收器测量海拔高度 2306次阅读
- 温度传感器和压力传感器在智能啤酒桶中的应用 3720次阅读
- VTI公司的压力传感器让飞行员手表实现了精确气压和高度测量的功能 1376次阅读
- 大陆集团研发可自动调整车辆高度的新型传感器 3401次阅读
- 高度传感器的应用_高度传感器的作用 2w次阅读
- 压力传感器测试方法_压力传感器的测量原理_压力传感器种类 3.3w次阅读
- 怎么检测压力传感器? 3946次阅读
下载排行
本周
- 1PCB板EMC/EMI的设计技巧
- 0.20 MB | 3次下载 | 免费
- 22024PMIC市场洞察
- 2.23 MB | 2次下载 | 免费
- 3UC3842工作原理及开关电源电路
- 0.08 MB | 1次下载 | 免费
- 4JFG-AS02微量程扭矩传感器数据表
- 0.32 MB | 1次下载 | 免费
- 5JFG-3D02三维力传感器数据表
- 0.58 MB | 1次下载 | 免费
- 6LTH7充电电路和锂电池升压5V输出电路原理图
- 0.04 MB | 1次下载 | 免费
- 7TMR技术在电流传感器中的应用
- 616.47 KB | 1次下载 | 免费
- 8LM5157-Q1反激式转换器评估模块
- 3.18MB | 次下载 | 免费
本月
- 1XL4015+LM358恒压恒流电路图
- 0.38 MB | 148次下载 | 1 积分
- 2新概念模拟电路第四册信号处理电路电子书免费下载
- 10.69 MB | 65次下载 | 免费
- 3PCB布线和布局电路设计规则
- 0.40 MB | 30次下载 | 免费
- 4智能门锁原理图
- 0.39 MB | 13次下载 | 免费
- 5GB/T4706.1-2024 家用和类似用途电器的安全第1部分:通用要求
- 7.43 MB | 11次下载 | 1 积分
- 6JESD79-5C_v1.30-2024 内存技术规范
- 2.71 MB | 10次下载 | 免费
- 7elmo直线电机驱动调试细则
- 4.76 MB | 9次下载 | 6 积分
- 8PC1013三合一快充数据线充电芯片介绍
- 1.03 MB | 7次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935115次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420061次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233084次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191367次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183330次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81581次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73806次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65985次下载 | 10 积分
评论
查看更多