Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Метеостанция 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. 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 Task  ReadTemperature () {// Убедитесь, что устройство 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 Task  ReadPreasure () {// Убедитесь, что устройство 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 Task  ReadAltitude (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


Производственный процесс

  1. Метеостанция на основе Raspberry Pi
  2. Метеостанция Raspberry Pi 2
  3. Метеостанция Raspberry Pi
  4. Удаленный мониторинг погоды с помощью Raspberry Pi
  5. Присоединяйтесь к IOT со своей метеостанцией - CWOP
  6. Weather Monitor
  7. Погодное окно Arduino + ESP
  8. Портативная метеостанция Arduino (AWS) за 10 долларов
  9. eDOT - точные часы и метеостанция на базе Arduino
  10. Метеостанция ThingSpeak Arduino