산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Weather Station V 2.0

온도, 기압, 습도 측정 방.

스토리

이 프로젝트에서는 Raspberry Pi 2 키트 구성요소의 Windows 10 IoT Core용 Adafruit 스타터 팩을 사용하여 센서를 사용하여 온도, 압력을 읽는 프로젝트를 생성합니다. , 습도 및 고도.

참고:키트에는 두 가지 버전이 있습니다. 하나는 BMP280 센서를 포함하고 다른 하나는 BME280입니다. BMP280이 있는 경우 Weather Station v1 프로젝트로 이동하고 싶을 것입니다. https://www.hackster.io/windows-iot/weather-station

하드웨어

아래 "도식" 섹션의 Fritzing 다이어그램에 따라 Raspberry Pi2를 브레드보드 및 기타 구성 요소에 연결합니다.

소프트웨어

https://github.com/ms-iot/adafruitsample에서 프로젝트 시작 코드를 다운로드할 수 있으며 대화에 필요한 코드를 추가하는 과정을 안내해 드립니다. 웹 서비스에 접속하고 지도에서 핀을 찾으세요. 어떤 지도요?

"Lesson_203v2\StartSolution\lesson_203v2.sln"을 열고 mainpage.xaml.cs 파일을 엽니다.

이 솔루션의 시작점으로 몇 가지 방법을 입력했습니다. 계속 진행하려면 'Lesson_203v2\FullSolution\lesson_203v2.sln'

에서 모든 코드가 완료된 솔루션을 찾을 수 있습니다.

메인페이지.xaml.cs

MainPage.xaml.cs 파일을 엽니다.

센서(BME280) 클래스에 대한 참조를 추가합니다.

public sealing partial class MainPage :Page{ // 센서 클래스 BME280 BME280에 대한 새 객체 생성;

이제 OnNavigatedTo 메서드에 코드를 추가하여 센서에 대한 새 BME280 개체를 만들고 개체를 초기화합니다.

// 센서를 위한 새 객체 생성 classBME280 =new BME280Sensor();// sensorawait BME280.Initialize();를 초기화합니다.

다음으로 다음을 수행하는 코드를 추가합니다.

 //0.float temp =0;float pressure =0;float 고도 =0;float 습도 =0;//해수면 압력에 대한 상수를 만듭니다. //이는 지역 해수면 기압을 기반으로 합니다(단위:헥토파스칼) const float seaLevelPressure =1022.00f;//(int i =0; i <10; i++){ temp =await BME280.ReadTemperature에 대한 데이터 샘플 10개 읽기 (); 압력 =BME280.ReadPreasure()를 기다립니다. 고도 =BME280.ReadAltitude(seaLevelPressure)를 기다립니다. 습도 =대기 BME280.ReadHumidity(); // 디버그 콘솔에 값 쓰기 Debug.WriteLine("Temperature:" + temp.ToString() + " deg C"); Debug.WriteLine("습도:" + 습도.ToString() + " %"); Debug.WriteLine("압력:" + pressure.ToString() + " Pa"); Debug.WriteLine("고도:" + 고도.ToString() + " m"); Debug.WriteLine("");}

BME280.cs

BME280.cs 파일을 엽니다.

코드의 첫 번째 부분은 BME280의 다른 레지스터 주소 목록을 만드는 것입니다. 이 값은 BMP280 데이터시트에서 찾을 수 있습니다.

BME280 클래스에서 레지스터 주소의 열거형 뒤에 다음을 추가합니다.

 //I2C busconst 문자열의 친숙한 이름에 대한 문자열 I2CControllerName ="I2C1";//I2C deviceprivate 생성 I2cDevice bme280 =null;// sensorBME280_CalibrationData CalibrationData에 대한 새 보정 데이터 생성;/ /장치가 초기화되었는지 확인하는 변수bool init =false;

다음으로 초기화 기능에 다음 코드를 추가합니다.

//BME280 sensorpublic을 초기화하는 방법 sensorpublic async Task Initialize(){ Debug.WriteLine("BME280::Initialize"); try { //BME280의 장치 주소를 사용하여 I2CConnectionSettings를 인스턴스화합니다. I2cConnectionSettings settings =new I2cConnectionSettings(BME280_Address); //연결의 I2C 버스 속도를 고속 모드로 설정 설정.BusSpeed ​​=I2cBusSpeed.FastMode; //I2CBus 장치 선택기를 사용하여 고급 쿼리 구문을 생성합니다. string string aqs =I2cDevice.GetDeviceSelector(I2CControllerName); //Windows.Devices.Enumeration.DeviceInformation 클래스를 사용하여 고급 쿼리 구문 string DeviceInformationCollection dis =await DeviceInformation.FindAllAsync(aqs)를 사용하여 컬렉션을 만듭니다. //I2CBus의 장치 ID와 I2CConnectionSettings를 사용하여 BME280 I2C 장치를 인스턴스화합니다. bme280 =await I2cDevice.FromIdAsync(dis[0].Id, settings); //장치가 있는지 확인 if (bme280 ==null) { Debug.WriteLine("장치를 찾을 수 없음"); } } catch(예외 e) { Debug.WriteLine("예외:" + e.Message + "\n" + e.StackTrace); 던지다; }}

다음 코드를 시작 기능에 추가:

비동기 작업 시작(){ Debug.WriteLine("BME280::Begin"); byte[] WriteBuffer =새로운 byte[] { (byte)eRegisters.BMP280_REGISTER_CHIPID }; byte[] ReadBuffer =새로운 byte[] { 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(); // 쓰기 제어 레지스터 대기 WriteControlRegister(); //습도 제어 레지스터 쓰기 대기 WriteControlRegisterHumidity();}

제어 레지스터에 쓰기 위해 다음 2개 함수에 다음 코드를 추가합니다.

개인 비동기 작업 WriteControlRegisterHumidity(){ byte[] WriteBuffer =new byte[] { (byte)eRegisters.BMP280_REGISTER_CONTROLHUMID, 0x03 }; bmp280.Write(쓰기 버퍼); Task.Delay(1)를 기다립니다. return;}//제어 레지스터에 0x3F를 쓰는 방법private async Task WriteControlRegister(){ byte[] WriteBuffer =new byte[] { (byte)eRegisters.BMP280_REGISTER_CONTROL, 0x3F }; bmp280.Write(쓰기 버퍼); Task.Delay(1)를 기다립니다. 반환;}

다음 코드를 ReadUInt16_LittleEndian 함수에 추가하여 다음을 수행합니다.

//레지스터에서 16비트 값을 읽어 리틀 엔디안 형식으로 반환하는 메서드private UInt16 ReadUInt16_LittleEndian(byte register){ UInt16 value =0; byte[] writeBuffer =새로운 byte[] { 0x00 }; byte[] readBuffer =새로운 byte[] { 0x00, 0x00 }; writeBuffer[0] =레지스터; bmp280.WriteRead(쓰기 버퍼, 읽기 버퍼); 정수 h =readBuffer[1] <<8; 정수 l =readBuffer[0]; 값 =(UInt16)(h + l); 반환 값;}

다음 코드를 ReadByte 함수에 추가하여 레지스터에서 8비트 데이터를 읽습니다.

//registerprivate byte ReadByte(byte register){ byte value =0; byte[] writeBuffer =새로운 byte[] { 0x00 }; byte[] readBuffer =새로운 byte[] { 0x00 }; writeBuffer[0] =레지스터; bmp280.WriteRead(쓰기 버퍼, 읽기 버퍼); 값 =readBuffer[0]; 반환 값;}

다음 3가지 기능이 자동으로 수행됩니다. 이러한 기능을 작성하는 데 필요한 정보는 데이터시트에서 찾을 수 있습니다.

ReadCoefficeints:레지스터 주소에서 모든 보정 데이터를 읽는 기능입니다.

BMP280_compensate_T_double:이 함수에서 ºC 단위의 온도는 BMP280 데이터시트의 보상 공식을 사용하여 계산됩니다.

BMP280_compensate_P_Int64:이 함수에서 Pa 단위의 압력은 BMP280 데이터시트의 보상 공식을 사용하여 계산됩니다.

다음 코드를 추가하여 ReadTemperature 기능을 완료하세요.

public async Task ReadTemperature(){ //(!init) await Begin(); //BMP280 레지스터에서 온도의 MSB, LSB 및 비트 7:4(XLSB) 읽기 byte tmsb =ReadByte((byte)eRegisters.BMP280_REGISTER_TEMPDATA_MSB); 바이트 tlsb =ReadByte((바이트)eRegisters.BMP280_REGISTER_TEMPDATA_LSB); 바이트 txlsb =ReadByte((바이트)eRegisters.BMP280_REGISTER_TEMPDATA_XLSB); // 비트 7:4 // 값을 32비트 정수로 결합 Int32 t =(tmsb <<12) + (tlsb <<4) + (txlsb>> 4); //원시 값을 degC의 온도로 변환 double temp =BMP280_compensate_T_double(t); //온도를 float 값으로 반환 return (float)temp;}

ReadPressure 기능을 완료하려면 동일한 단계를 반복하십시오.

 public async Task ReadPreasure() { //I2C 장치가 초기화되었는지 확인 if (!init) await Begin(); //보상을 위한 t_fine 값을 로드하기 위해 먼저 온도를 읽습니다. if (t_fine ==Int32.MinValue) { await ReadTemperature(); } //BMP280 레지스터에서 압력의 MSB, LSB 및 비트 7:4(XLSB)를 읽습니다. byte tmsb =ReadByte((byte)eRegisters.BMP280_REGISTER_PRESSUREDATA_MSB); 바이트 tlsb =ReadByte((바이트)eRegisters.BMP280_REGISTER_PRESSUREDATA_LSB); 바이트 txlsb =ReadByte((바이트)eRegisters.BMP280_REGISTER_PRESSUREDATA_XLSB); // 비트 7:4 // 값을 32비트 정수로 결합 Int32 t =(tmsb <<12) + (tlsb <<4) + (txlsb>> 4); //원시 값을 Pa Int64의 압력으로 변환합니다. pres =BMP280_compensate_P_Int64(t); //온도를 float 값으로 반환 return ((float)pres) / 256;}

마지막으로 ReadAltitude 기능 완료:

//해수면 기압을 Hectopascals(hPa) 단위로 매개변수로 받아 현재 pressure.public async Task ReadAltitude(float seaLevel)를 사용하여 고도를 계산하는 메소드 (!init)이 Begin()을 기다리면 I2C 장치가 초기화됩니다. //첫 번째 압력 읽기 float pressure =await ReadPreasure(); //압력을 헥토파스칼(hPa)로 변환 압력 /=100; //국제 기압 공식을 사용하여 고도를 계산하고 반환 return 44330.0f * (1.0f - (float)Math.Pow((pressure / seaLevel), 0.1903f));}

이제 프로젝트를 배포할 준비가 되었습니다!

예상 출력

온도:24.46189도 C

습도:54.372%

압력:99738.73 Pa

고도:205.1726m

출처: 기상 관측소 V 2.0


제조공정

  1. Raspberry Pi 기반 기상 관측소
  2. Raspberry Pi 2 기상 관측소
  3. 라즈베리 파이 기상 관측소
  4. Raspberry Pi를 사용한 원격 날씨 모니터링
  5. 기상 관측소로 IOT에 참여하십시오 – CWOP
  6. 날씨 모니터
  7. Arduino + ESP Weather Box
  8. $10 휴대용 Arduino 기상 관측소(AWS)
  9. eDOT - Arduino 기반 정밀 시계 및 기상 관측소
  10. ThingSpeak Arduino 기상 관측소