Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Stasiun Cuaca V 2.0

Mengukur suhu, tekanan, dan kelembapan di kamar.

Cerita

Dalam proyek ini kita akan menggunakan Adafruit Starter Pack untuk Windows 10 IoT Core pada komponen kit Raspberry Pi 2 untuk membuat proyek yang menggunakan sensor untuk membaca suhu, tekanan , kelembaban dan ketinggian.

CATATAN:ada dua versi kit, satu menyertakan sensor BMP280 dan yang lain BME280. Jika Anda memiliki BMP280, Anda dapat membuka proyek Weather Station v1 https://www.hackster.io/windows-iot/weather-station

Perangkat Keras

Hubungkan Raspberry Pi2 ke breadboard dan komponen lainnya sesuai dengan diagram Fritzing di bagian “Skema” di bawah.

Perangkat Lunak

Anda dapat mengunduh proyek awal kode dari https://github.com/ms-iot/adafruitsample dan kami akan memandu Anda melalui penambahan kode yang diperlukan untuk berbicara ke layanan web dan dapatkan pin Anda di peta. Peta apa?

Buka “Lesson_203v2\StartSolution\lesson_203v2.sln“ dan buka file mainpage.xaml.cs.

Kami telah mengisi beberapa metode sebagai titik awal untuk Anda dalam solusi ini. Jika Anda ingin melompat ke depan, Anda dapat menemukan solusi dengan menyelesaikan semua kode di: “Lesson_203v2\FullSolution\lesson_203v2.sln”

Halaman Utama.xaml.cs

Buka file MainPage.xaml.cs .

Tambahkan referensi ke kelas sensor (BME280).

kelas parsial tertutup publik Halaman Utama :Halaman{ // Buat objek baru untuk kelas sensor BME280 BME280;

Sekarang kita menambahkan kode dalam metode OnNavigatedTo yang akan membuat objek BME280 baru untuk sensor dan menginisialisasi objek.

// Buat objek baru untuk sensor kita classBME280 =new BME280Sensor();//Inisialisasi sensorawait BME280.Initialize();

Selanjutnya kita tambahkan kode untuk melakukan hal berikut:

 //Inisialisasi ke 0.float temp =0;float pressure =0;float altitude =0;float moisture =0;//Buat konstanta untuk tekanan di permukaan laut. //Ini didasarkan pada tekanan permukaan laut lokal Anda (Satuan:Hectopascal)const float seaLevelPressure =1022.00f;//Baca 10 sampel data untuk (int i =0; i <10; i++){ temp =menunggu BME280.ReadTemperature (); tekanan =menunggu BME280.ReadPreasure(); ketinggian =menunggu BME280.ReadAltitude(seaLevelPressure); kelembaban =menunggu BME280.ReadHumidity(); //Tulis nilai ke konsol debug Anda Debug.WriteLine("Temperature:" + temp.ToString() + " deg C"); Debug.WriteLine("Kelembaban:" + kelembaban.ToString() + "%"); Debug.WriteLine("Tekanan:" + tekanan.ToString() + " Pa"); Debug.WriteLine("Ketinggian:" + ketinggian.ToString() + " m"); Debug.WriteLine("");}

BME280.cs

Buka file BME280.cs .

Bagian pertama dari kode ini adalah membuat daftar alamat register yang berbeda di BME280. Nilai ini dapat ditemukan di lembar data BMP280.

Di kelas BME280, tambahkan berikut ini setelah enum untuk alamat register.

 //String untuk nama ramah dari I2C busconst string I2CControllerName ="I2C1";//Buat perangkat I2Cprivate I2cDevice bme280 =null;//Buat data kalibrasi baru untuk sensorBME280_CalibrationData CalibrationData;/ /Variabel untuk memeriksa apakah perangkat diinisialisasibool init =false;

Selanjutnya tambahkan kode berikut pada fungsi Inisialisasi ke:

//Metode untuk menginisialisasi BME280 sensorpublic async Task Initialize(){ Debug.WriteLine("BME280::Initialize"); try { //Instantiate I2CConnectionSettings menggunakan alamat perangkat dari BME280 I2cConnectionSettings settings =new I2cConnectionSettings(BME280_Address); //Mengatur kecepatan koneksi bus I2C ke pengaturan mode cepat.BusSpeed ​​=I2cBusSpeed.FastMode; //Gunakan pemilih perangkat I2CBus untuk membuat string sintaks kueri lanjutan aqs =I2cDevice.GetDeviceSelector(I2CControllerName); //Gunakan kelas Windows.Devices.Enumeration.DeviceInformation untuk membuat koleksi menggunakan string sintaks kueri lanjutan DeviceInformationCollection dis =menunggu DeviceInformation.FindAllAsync(aqs); //Instansiasi perangkat BME280 I2C menggunakan id perangkat I2CBus dan I2CConnectionSettings bme280 =menunggu I2cDevice.FromIdAsync(dis[0].Id, settings); //Periksa apakah perangkat ditemukan jika (bme280 ==null) { Debug.WriteLine("Perangkat tidak ditemukan"); } } catch (Pengecualian e) { Debug.WriteLine("Pengecualian:" + e.Message + "\n" + e.StackTrace); melemparkan; }}

Tambahkan kode berikut di fungsi Begin ke:

async pribadi Tugas Mulai(){ Debug.WriteLine("BME280::Mulai"); byte[] WriteBuffer =byte baru[] { (byte)eRegisters.BMP280_REGISTER_CHIPID }; byte[] ReadBuffer =byte baru[] { 0xFF }; //Baca tanda tangan perangkat bmp280.WriteRead(WriteBuffer, ReadBuffer); Debug.WriteLine("Tanda Tangan BME280:" + ReadBuffer[0].ToString()); //Verifikasi tanda tangan perangkat jika (ReadBuffer[0] !=BMP280_Signature) { Debug.WriteLine("BMP280::Begin Signature Mismatch."); kembali; } //Setel variabel initalisasi ke true init =true; //Membaca tabel koefisien CalibrationData =menunggu ReadCoefficeints(); //Tulis register kontrol menunggu WriteControlRegister(); //Tulis register kontrol kelembaban menunggu WriteControlRegisterHumidity();}

Tambahkan kode berikut ke 2 fungsi berikutnya untuk ditulis ke register kontrol.

Tugas asinkron pribadi WriteControlRegisterHumidity(){ byte[] WriteBuffer =byte baru[] { (byte)eRegisters.BMP280_REGISTER_CONTROLHUMID, 0x03 }; bmp280.Tulis(WriteBuffer); menunggu Task.Delay(1); return;}//Metode untuk menulis 0x3F ke register kontrolprivate async Tugas WriteControlRegister(){ byte[] WriteBuffer =byte baru[] { (byte)eRegisters.BMP280_REGISTER_CONTROL, 0x3F }; bmp280.Tulis(WriteBuffer); menunggu Task.Delay(1); kembali;}

Tambahkan kode berikut ke fungsi ReadUInt16_LittleEndian ke:

//Metode untuk membaca nilai 16-bit dari register dan mengembalikannya dalam format little endian pribadi UInt16 ReadUInt16_LittleEndian(byte register){ UInt16 value =0; byte[] writeBuffer =byte baru[] { 0x00 }; byte[] readBuffer =byte baru[] { 0x00, 0x00 }; writeBuffer[0] =daftar; bmp280.WriteRead(writeBuffer, readBuffer); int h =readBuffer[1] <<8; int l =readBuffer[0]; nilai =(UInt16)(h + l); mengembalikan nilai;}

Tambahkan kode berikut ke fungsi ReadByte untuk membaca data 8-bit dari register.

//Metode untuk membaca nilai 8-bit dari registerprivate byte ReadByte(byte register){ nilai byte =0; byte[] writeBuffer =byte baru[] { 0x00 }; byte[] readBuffer =byte baru[] { 0x00 }; writeBuffer[0] =daftar; bmp280.WriteRead(writeBuffer, readBuffer); nilai =readBuffer[0]; mengembalikan nilai;}

3 fungsi berikutnya telah selesai untuk Anda. Informasi yang diperlukan untuk menulis fungsi-fungsi ini dapat ditemukan di lembar data.

ReadCoefficeints: Ini adalah fungsi tempat semua data kalibrasi dibaca dari alamat register.

BMP280_compensate_T_double:Dalam fungsi ini, suhu dalam ºC dihitung menggunakan rumus kompensasi di lembar data BMP280.

BMP280_compensate_P_Int64: Dalam fungsi ini, tekanan dalam Pa dihitung menggunakan rumus kompensasi di lembar data BMP280.

Tambahkan kode berikut untuk menyelesaikan fungsi ReadTemperature.

Tugas asinkron publik ReadTemperature(){ //Pastikan perangkat I2C diinisialisasi jika (!init) menunggu Begin(); //Baca MSB, LSB dan bit 7:4 (XLSB) suhu dari register BMP280 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 //Gabungkan nilai-nilai tersebut menjadi bilangan bulat 32-bit Int32 t =(tmsb <<12) + (tlsb <<4) + (txlsb>> 4); //Konversi nilai mentah ke suhu dalam degC double temp =BMP280_compensate_T_double(t); //Mengembalikan suhu sebagai nilai float kembali (float)temp;}

Ulangi langkah yang sama untuk menyelesaikan fungsi ReadPressure.

 public async Task ReadPreasure() { //Pastikan perangkat I2C diinisialisasi jika (!init) menunggu Begin(); //Baca suhu terlebih dahulu untuk memuat nilai t_fine untuk kompensasi if (t_fine ==Int32.MinValue) { menunggu ReadTemperature(); } //Membaca MSB, LSB dan bit 7:4 (XLSB) dari tekanan dari register BMP280 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 //Gabungkan nilai-nilai tersebut menjadi bilangan bulat 32-bit Int32 t =(tmsb <<12) + (tlsb <<4) + (txlsb>> 4); //Konversi nilai mentah menjadi tekanan dalam Pa Int64 pres =BMP280_compensate_P_Int64(t); //Mengembalikan suhu sebagai pengembalian nilai float ((float)pres) / 256;}

Akhirnya selesaikan fungsi ReadAltitude:

//Metode untuk mengambil tekanan permukaan laut dalam Hectopascals(hPa) sebagai parameter dan menghitung ketinggian menggunakan tekanan saat ini.public async Tugas ReadAltitude(float seaLevel){ //Pastikan perangkat I2C diinisialisasi jika (!init) menunggu Begin(); //Baca tekanannya terlebih dahulu tekanan apung =menunggu ReadPreasure(); //Ubah tekanan ke Hectopascals(hPa) tekanan /=100; //Menghitung dan mengembalikan ketinggian menggunakan rumus barometrik internasional return 44330.0f * (1.0f - (float)Math.Pow((pressure / seaLevel), 0.1903f));}

Proyek Anda sekarang siap untuk diterapkan!

Hasil yang Diharapkan

Suhu:24,46189 derajat C

Kelembaban:54,372 %

Tekanan:99738,73 Pa

Ketinggian:205,1726 m

Sumber:  Stasiun Cuaca V 2.0


Proses manufaktur

  1. Stasiun cuaca berdasarkan Raspberry Pi
  2. Stasiun Cuaca Raspberry Pi 2
  3. Stasiun Cuaca Raspberry Pi
  4. Pemantauan Cuaca Jarak Jauh Menggunakan Raspberry Pi
  5. Bergabunglah dengan IOT dengan Stasiun Cuaca Anda – CWOP
  6. Pemantau Cuaca
  7. Arduino + ESP Weather Box
  8. $10 Portable Arduino Weather Station (AWS)
  9. eDOT - Jam Presisi dan Stasiun Cuaca Berbasis Arduino
  10. Stasiun Cuaca ArduinoThingSpeak