Метеостанция V 2.0
Измерьте температуру, давление и влажность в вашем комната.
История
В этом проекте мы будем использовать Adafruit Starter Pack для Windows 10 IoT Core на компонентах набора Raspberry Pi 2, чтобы создать проект, который использует датчик для считывания температуры и давления. , влажность и высота.
ПРИМЕЧАНИЕ. Существует две версии набора:одна включает датчик BMP280, а другая - BME280. Если у вас есть BMP280, вам нужно перейти к проекту Weather Station v1 https://www.hackster.io/windows-iot/weather-station
Аппаратное обеспечение
Подключите Raspberry Pi2 к макетной плате и другим компонентам согласно диаграмме Fritzing в разделе «Схема» ниже.
Программное обеспечение
Вы можете загрузить исходный код проекта с https://github.com/ms-iot/adafruitsample, и мы проведем вас через добавление кода, необходимого для разговора к веб-сервису и получите свой PIN-код на карте. Какая карта?
Откройте «Lesson_203v2 \ StartSolution \ lesson_203v2.sln» и откройте файл mainpage.xaml.cs.
Мы добавили несколько методов в качестве отправной точки для вас в этом решении. Если вы хотите забежать вперед, вы можете найти решение со всем завершенным кодом по адресу:«Lesson_203v2 \ FullSolution \ lesson_203v2.sln»
MainPage.xaml.cs
Откройте файл MainPage.xaml.cs.
Добавить ссылку на класс датчика (BME280).
public sealed partial class MainPage:Page {// Создаем новый объект для нашего класса датчика BME280 BME280;
Теперь мы добавляем код в метод OnNavigatedTo, который создаст новый объект BME280 для датчика и инициализирует объект.
// Создаем новый объект для нашего датчика classBME280 =new BME280Sensor (); // Инициализируем sensorawait BME280.Initialize ();
Затем мы добавляем код для выполнения следующих действий:
- Создайте переменные для хранения температуры, давления, влажности и высоты. Установите их на 0.
- Создайте переменную для давления на уровне моря. Значение по умолчанию - 1013,25 гПа.
- Считайте температуру, давление, влажность и высоту 10 раз и выведите значения в консоль отладки.
// Инициализируем их на 0. float temp =0; float pressure =0; float altitude =0; float влажность =0; // Создаем константу для давления на уровне моря. // Это основано на вашем местном давлении на уровне моря (единица измерения:гектопаскаль) const float seaLevelPressure =1022.00f; // Считываем 10 выборок данных для (int i =0; i <10; i ++) {temp =await BME280.ReadTemperature (); давление =ждать BME280.ReadPreasure (); altitude =await BME280.ReadAltitude (seaLevelPressure); влажность =ждать BME280.ReadHumidity (); // Записываем значения в консоль отладки Debug.WriteLine ("Temperature:" + temp.ToString () + "deg C"); Debug.WriteLine («Влажность:» + влажность.ToString () + «%»); Debug.WriteLine («Давление:» + pressure.ToString () + «Па»); Debug.WriteLine ("Высота:" + altitude.ToString () + "m"); Debug.WriteLine ("");}
BME280.cs
Откройте файл BME280.cs.
Первая часть кода составляет список адресов различных регистров BME280. Эти значения можно найти в таблице данных BMP280.
В классе BME280 добавьте следующее после перечисления для адресов регистров.
// Строка для понятного имени строки константы шины I2C I2CControllerName ="I2C1"; // Создаем частное устройство I2C I2cDevice bme280 =null; // Создаем новые данные калибровки для датчикаBME280_CalibrationData CalibrationData; / / Переменная для проверки инициализации устройстваbool init =false;
Затем добавьте следующий код в функцию Initialize, чтобы:
// Метод инициализации BME280 sensorpublic async Task Initialize () {Debug.WriteLine ("BME280 ::Initialize"); попробуйте {// создать экземпляр I2CConnectionSettings, используя адрес устройства BME280 I2cConnectionSettings settings =new I2cConnectionSettings (BME280_Address); // Устанавливаем скорость соединения шины I2C в настройки быстрого режима.BusSpeed =I2cBusSpeed.FastMode; // Использование селектора устройств I2CBus для создания строки расширенного синтаксиса запроса string aqs =I2cDevice.GetDeviceSelector (I2CControllerName); // Использование класса Windows.Devices.Enumeration.DeviceInformation для создания коллекции с использованием строки расширенного синтаксиса запроса DeviceInformationCollection dis =await DeviceInformation.FindAllAsync (aqs); // Создание экземпляра устройства BME280 I2C с использованием идентификатора устройства I2CBus и I2CConnectionSettings bme280 =await I2cDevice.FromIdAsync (dis [0] .Id, settings); // Проверяем, найдено ли устройство if (bme280 ==null) {Debug.WriteLine («Устройство не найдено»); }} catch (Exception e) {Debug.WriteLine ("Exception:" + e.Message + "\ n" + e.StackTrace); бросать; }}
Добавьте следующий код в функцию Begin, чтобы:
начало частной асинхронной задачи () {Debug.WriteLine ("BME280 ::Begin"); byte [] WriteBuffer =новый байт [] {(byte) eRegisters.BMP280_REGISTER_CHIPID}; byte [] ReadBuffer =новый байт [] {0xFF}; // Считываем подпись устройства bmp280.WriteRead (WriteBuffer, ReadBuffer); Debug.WriteLine («Подпись BME280:» + ReadBuffer [0] .ToString ()); // Проверяем подпись устройства if (ReadBuffer [0]! =BMP280_Signature) {Debug.WriteLine ("BMP280 ::Begin Signature Mismatch."); возвращение; } // Устанавливаем для переменной инициализации значение true init =true; // Считываем таблицу коэффициентов CalibrationData =await ReadCoefficeints (); // Записываем регистр управления await WriteControlRegister (); // Записываем регистр контроля влажности await WriteControlRegisterHumidity ();}
Добавьте следующий код в следующие 2 функции для записи в регистры управления.
частная асинхронная задача WriteControlRegisterHumidity () {byte [] WriteBuffer =new byte [] {(byte) eRegisters.BMP280_REGISTER_CONTROLHUMID, 0x03}; bmp280.Write (WriteBuffer); ждать Task.Delay (1); return;} // Метод записи 0x3F в регистр управления async Task WriteControlRegister () {byte [] WriteBuffer =new byte [] {(byte) eRegisters.BMP280_REGISTER_CONTROL, 0x3F}; bmp280.Write (WriteBuffer); ждать Task.Delay (1); return;}
Добавьте следующий код в функцию ReadUInt16_LittleEndian, чтобы:
// Метод для чтения 16-битного значения из регистра и возврата его в формате с прямым порядком байтов private UInt16 ReadUInt16_LittleEndian (байтовый регистр) {UInt16 value =0; byte [] writeBuffer =новый байт [] {0x00}; byte [] readBuffer =новый байт [] {0x00, 0x00}; writeBuffer [0] =регистр; bmp280.WriteRead (writeBuffer, readBuffer); int h =readBuffer [1] <<8; int l =readBuffer [0]; значение =(UInt16) (h + l); возвращаемое значение;}
Добавьте следующий код в функцию ReadByte для чтения 8-битных данных из регистра.
// Метод для чтения 8-битного значения из регистра частного байта ReadByte (байтовый регистр) {byte value =0; byte [] writeBuffer =новый байт [] {0x00}; byte [] readBuffer =новый байт [] {0x00}; writeBuffer [0] =регистр; bmp280.WriteRead (writeBuffer, readBuffer); значение =readBuffer [0]; возвращаемое значение;}
Следующие 3 функции выполнены за вас. Информацию, необходимую для написания этих функций, можно найти в таблице данных.
ReadCoefficeints:это функция, в которой все данные калибровки считываются из адресов регистров.
BMP280_compensate_T_double:в этой функции температура в ° C рассчитывается с использованием формулы компенсации из таблицы данных BMP280.
BMP280_compensate_P_Int64:в этой функции давление в Па рассчитывается с использованием формулы компенсации из таблицы данных BMP280.
Добавьте следующий код для завершения функции ReadTemperature.
public async TaskReadTemperature () {// Убедитесь, что устройство I2C инициализировано if (! init) await Begin (); // Считываем MSB, LSB и биты 7:4 (XLSB) температуры из байта регистров BMP280 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); // биты 7:4 // Объединение значений в 32-битное целое число Int32 t =(tmsb <<12) + (tlsb <<4) + (txlsb>> 4); // Преобразуем исходное значение в температуру в градусах Цельсия double temp =BMP280_compensate_T_double (t); // Возвращаем температуру как значение с плавающей запятой return (float) temp;}
Повторите те же шаги, чтобы завершить функцию ReadPressure.
public async TaskReadPreasure () {// Убедитесь, что устройство I2C инициализировано if (! init) await Begin (); // Сначала считываем температуру, чтобы загрузить значение t_fine для компенсации if (t_fine ==Int32.MinValue) {await ReadTemperature (); } // Считываем MSB, LSB и биты 7:4 (XLSB) давления из байта регистров BMP280 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); // биты 7:4 // Объединение значений в 32-битное целое число Int32 t =(tmsb <<12) + (tlsb <<4) + (txlsb>> 4); // Преобразуем исходное значение в давление в Па Int64 pres =BMP280_compensate_P_Int64 (t); // Возвращаем температуру как значение с плавающей запятой return ((float) pres) / 256;}
Наконец, завершите функцию ReadAltitude:
// Метод для принятия давления на уровне моря в гектопаскалях (гПа) в качестве параметра и вычисления высоты с использованием текущего давления. public async TaskReadAltitude (float seaLevel) {// Убедитесь, что устройство I2C инициализируется, если (! init) await Begin (); // Считываем давление первое давление с плавающей запятой =await ReadPreasure (); // Преобразуем давление в гектопаскалях (гПа) pressure / =100; // Вычислить и вернуть высоту по международной барометрической формуле return 44330.0f * (1.0f - (float) Math.Pow ((pressure / seaLevel), 0.1903f));}
Теперь ваш проект готов к развертыванию!
Ожидаемый результат
Температура:24,46189 ° C
Влажность:54,372%
Давление:99738,73 Па
Высота:205,1726 м
Источник: Метеостанция V 2.0
Производственный процесс
- Метеостанция на основе Raspberry Pi
- Метеостанция Raspberry Pi 2
- Метеостанция Raspberry Pi
- Удаленный мониторинг погоды с помощью Raspberry Pi
- Присоединяйтесь к IOT со своей метеостанцией - CWOP
- Weather Monitor
- Погодное окно Arduino + ESP
- Портативная метеостанция Arduino (AWS) за 10 долларов
- eDOT - точные часы и метеостанция на базе Arduino
- Метеостанция ThingSpeak Arduino