대기압 센서 BMP085 및 Arduino. Arduino를 기반으로 한 가장 간단한 기압 고도계

기압계는 대기압을 측정하는 장치입니다. 즉, 사방에서 우리를 누르는 기압입니다. 학교 시절부터 우리는 최초의 기압계가 수은이 담긴 접시와 그 안에 거꾸로 된 시험관이었다는 것을 알고 있습니다. 이 장치의 저자는 이탈리아의 물리학자이자 수학자인 Evangelista Torricelli였습니다. 수은 기압계에서 판독하는 것은 알코올 온도계에서 판독하는 것처럼 간단하게 수행할 수 있습니다. 플라스크 외부의 압력이 높을수록 플라스크 내부의 수은 기둥도 높아집니다. 수은 증기는 독성이 매우 강한 것으로 알려져 있습니다.

나중에 더 안전한 장치, 즉 아네로이드 기압계가 나타났습니다. 이 기압계에서는 수은이 얇은 주석으로 만들어진 골판지 상자로 대체되어 진공이 생성되었습니다. 대기의 영향으로 상자가 수축되고 레버 시스템을 통해 다이얼의 화살표가 회전합니다. 이것이 이 두 기압계의 모습입니다. 왼쪽에는 아네로이드가 있고 오른쪽에는 Torricelli의 기압계가 있습니다.

왜 기압계가 필요한가요? 대부분 이 장치는 항공기에서 비행 고도를 결정하는 데 사용됩니다. 선박이 해수면 위로 더 높이 올라갈수록 선상 기압계가 경험하는 압력은 줄어듭니다. 이러한 의존성을 알면 높이를 결정하는 것이 쉽습니다.

또 다른 일반적인 사용 사례는 집에서 만든 기상 관측소입니다. 이 경우, 우리는 대기압에 대한 미래 날씨의 알려진 의존성을 사용할 수 있습니다. 기압계 외에도 이러한 스테이션에는 습도 및 온도 센서가 장착되어 있습니다.

1. 전자 기압계

로봇 공학에서는 이렇게 부피가 큰 기압계를 사용할 수 없습니다. 동일한 Arduino Uno에 쉽게 연결할 수 있는 소형의 에너지 효율적인 장치가 필요합니다. 대부분의 최신 기압계는 회전 속도계 및 가속도계와 마찬가지로 MEMS 기술을 사용하여 제작됩니다. MEMS 기압계는 변형력의 영향으로 재료의 저항을 변경하는 효과를 사용하는 압저항 또는 스트레인 게이지 방법을 기반으로 합니다.

MEMS 기압계 하우징을 열면 장치 보호 하우징 구멍 바로 아래에 위치한 감지 요소(오른쪽)와 1차 필터링 및 측정 변환을 수행하는 제어 보드(왼쪽)를 볼 수 있습니다. .

2. 센서 BMP085 및 BMP180

비행 컨트롤러 및 다양한 가정용 전자 장치에 자주 사용되는 가장 저렴한 압력 센서에는 BOSH의 센서인 BMP085 및 BMP180이 포함됩니다. 두 번째 기압계는 최신 버전이지만 이전 버전과 완벽하게 호환됩니다.

BMP180의 몇 가지 중요한 특징:

  • 측정값 범위: 300hPa ~ 1100hPa(해발 -500m ~ +9000m)
  • 공급 전압: 3.3~5V;
    전류: 폴링 속도 - 1Hz에서 5μA;
  • 소음 수준: 초저전력 모드에서 0.06hPa(0.5m), 고급 분해능 모드에서 0.02hPa(0.17m).

이제 이 센서를 컨트롤러에 연결하고 대기압을 추정해 보겠습니다.

3. BMP180 연결

두 센서 모두 I2C 인터페이스를 갖추고 있으므로 Arduino 제품군의 모든 플랫폼에 쉽게 연결할 수 있습니다. Arduino Uno 연결 테이블은 다음과 같습니다.

BMP 180 접지 VCC S.D.A. SCL
아두이노 우노 접지 +5V A4 A5

개략도

레이아웃 모양

4. 프로그램

센서를 사용하려면 라이브러리가 필요합니다: BMP180_Breakout_Arduino_Library

저장소에서 다운로드하여 Arduino IDE에 설치하세요. 이제 첫 번째 프로그램을 작성할 준비가 모두 완료되었습니다. 센서에서 원시 데이터를 가져와 COM 포트 모니터로 출력해 보겠습니다.

#포함하다 #포함하다 SFE_BMP180 압력; void setup())( Serial.begin(9600); Pressure.begin(); ) void loop())( double P; P = getPressure(); Serial.println(P, 4); 지연(100); ) double getPressure ()( char status; double T,P,p0,a; status = Pressure.startTemperature(); if (status != 0)( // 온도 측정 대기 중 Delay(status); status = Pressure.getTemperature( T); if (status != 0)( status = Pressure.startPressure(3); if (status != 0)( // 압력 측정 대기 중(status); status = Pressure.getPressure(P,T); if (상태 ! = 0)( return(P); ) ) ) ) )

센서에서 원하는 압력을 얻는 절차는 그리 간단하지 않으며 여러 단계로 구성됩니다. 단순화된 형태로 알고리즘은 다음과 같습니다.

  1. 내장된 온도 센서의 판독값을 기압계에 요청합니다.
  2. 센서가 온도를 평가하는 동안 대기 시간 A;
  3. 우리는 온도를 얻습니다.
  4. 우리는 기압계에 압력을 묻습니다.
  5. 센서가 압력을 평가하는 동안 대기 시간 B;
  6. 압력 값을 얻으십시오;
  7. 함수에서 압력 값을 반환합니다.

시간 B는 함수에 지정된 측정 정확도에 따라 달라집니다. 시작압력. 이 함수의 단일 인수는 0에서 3까지의 값을 가질 수 있습니다. 여기서 0은 가장 대략적이고 빠른 추정이고 3은 가장 정확한 압력 추정입니다.

Arduino Uno에 프로그램을 로드하고 대기압 측정 흐름을 관찰합니다. 센서를 머리 위로 올리고 바닥 수준까지 낮추어 보겠습니다. 판독 값은 약간 다를 수 있습니다. 남은 것은 이 이상한 숫자를 해발 고도로 변환하는 방법을 알아내는 것입니다.

5. 압력을 고도로 변환

BMP180 센서는 압력 값을 헥토파스칼(hPa) 단위로 반환합니다. 대기압은 일반적으로 이 단위로 측정됩니다. 1hPa = 100파스칼. 해수면의 압력은 평균 1013hPa로 알려져 있으며, 해발 1m가 추가될 때마다 이 압력은 대략 0.11hPa만 감소합니다.

따라서 함수 결과에서 빼면 압력을 얻다숫자는 1013이고 나머지 차이를 0.11로 나누면 해발 높이를 미터 단위로 얻습니다. 우리 프로그램은 다음과 같이 변경됩니다.

무효 루프())( double P, Alt; P = getPressure(); Alt = (P - 1013)/0.11; Serial.println(Alt, 2); 지연(100); )

실제로 압력은 해발 고도에 따라 비선형적으로 달라지며, 우리의 공식은 우리가 일반적으로 거주하는 고도에만 적합합니다. 다행스럽게도 인류는 키에 대한 압력의 관계를 더 정확하게 알고 있으며, 이를 적용하여 더 정확한 결과를 얻을 수 있습니다.

여기서 p는 주어진 지점에서 측정된 압력이고, p0는 높이가 측정된 상대 압력입니다.

SFE_BMP180 라이브러리에는 이미 지정된 함수를 사용하는 함수가 있습니다. 정확한 높이를 구하는 공식 우리는 그것을 우리 프로그램에서 사용합니다.

#포함하다 #포함하다 SFE_BMP180 압력; 이중 P0 = 0; void setup())( Serial.begin(9600); Pressure.begin(); P0 = Pressure.getPressure(); ) void loop())( double P, Alt; P = getPressure(); Alt = Pressure.altitude (P,P0) Serial.println(Alt, 2); double getPressure() ( ... )

텍스트를 읽기 쉽게 유지하기 위해 getPressure 함수를 완전히 복사하지 않았습니다.

프로그램에 또 다른 변수 P0이 나타났습니다. 이는 프로그램 시작 시 측정할 압력입니다. 항공기의 경우 P0는 상승을 시작할 이륙 지점의 압력이 됩니다.

6. 시각화

이제 프로그램에서 압력 판독값을 표시해 보겠습니다. SF모니터, 센서가 2미터 높이로 이동할 때 압력이 어떻게 변하는지 살펴보겠습니다.

정적 const 바이트 PACKET_SIZE = 1; 정적 const 바이트 VALUE_SIZE = 2; 정적 const 부울 SEPARATE_VALUES = true; #포함하다 #포함하다 #포함하다 SFE_BMP180 압력; SerialFlow rd(&직렬); 이중 P0 = 0; void setup())( rd.setPacketFormat(VALUE_SIZE, PACKET_SIZE, SEPARATE_VALUES); rd.begin(9600); Pressure.begin(); P0 = getPressure(); ) void loop())( double P; P = getPressure( ); rd.setPacketValue(100+int((P - P0)*100)); rd.sendPacket() 지연(100) double getPressure( ... )

프로그램의 결과로 파스칼 단위의 압력 그래프를 얻습니다.

7. 결론

우리가 수업에서 배운 것처럼 해발 고도를 결정하는 것은 그리 간단한 작업이 아닙니다. 압력은 고도에 따라 비선형적으로 달라질 뿐만 아니라 다양한 외부 요인에 의해 상황이 손상됩니다. 예를 들어, 우리 집의 압력은 시간이 지나면서 끊임없이 변합니다. 몇 분 안에도 우리 장치로 측정된 높이는 0.5~1미터 범위에서 달라질 수 있습니다. 온도 역시 측정 품질에 큰 영향을 미치므로 압력을 계산할 때 이를 고려해야 합니다.

항공기의 경우 MS5611과 같은 고정밀 센서를 사용하는 것이 좋습니다. 이 기압계의 측정 정확도는 0.012hPa에 도달할 수 있으며 이는 BMP180보다 5배 더 좋습니다. 또한 GPS 좌표는 비행 기압 고도를 명확히 하는 데 사용됩니다.

분위기를 관찰해 보세요! 🙂

동료들에게 인사드립니다!
왜냐하면 겨울에는 날씨가 대부분 비행하기에 적합하지 않습니다. 즉, 자유 시간이 많다는 것을 의미하며, 게으름으로 인해 두뇌가 마르지 않도록 뭔가를 하는 것이 좋을 것입니다. 저는 최근 치열한 홀리바르와 열띤 논쟁의 주제, 즉 Arduino 구현의 Atmega328 마이크로컨트롤러를 마스터하기로 결정했습니다.
Arduina 자체에 대한 토론을 시작하지 말 것을 강력히 요청합니다. 이미 인터넷에는 모든 장단점에 대한 수많은 정보가 있습니다.
그래서 사이트의 특성을 고려하면 '스마트 홈'에 대해 이야기하는 것은 그다지 주제가 아닌 것 같아서 Arduino를 기반으로 3자리 7세그먼트 LED 디스플레이를 갖춘 기압고도계를 구축해 보겠습니다.

자세한 내용은?


저는 독창적이거나 혁신적인 척하지 않습니다. 인터넷에는 유사한 프로젝트가 많이 있습니다. 하지만 검색을 통해 이 리소스에서 비슷한 내용을 찾을 수 없었기 때문에 누군가에게 유용할 수도 있으므로 게시하기로 결정했습니다.
또 코드는 제가 직접 작성했으니 다 인도산이라면 너무 가혹하게 판단하지 마세요 =) 아직 배우는 중이에요. 제가 컨트롤러를 마지막으로 프로그래밍한 것은 10여년 전 연구소에서 4학년 때였습니다. =) 유능하고 건설적인 비판을 환영합니다!
나는 그러한 장치를 조립하는 방법을 명확하고 자세하게 설명하려고 노력할 것입니다. 거의 모든 수준의 훈련을 받은 사람이 그것을 다룰 수 있다고 생각합니다.

이 장치의 가장 큰 장점은 가격입니다. 오늘날의 생활과 환율에서도 350루블을 쓸 수 있는데 이는 일반적으로 돈이 아닙니다. 또한 곧은 손과 납땜 인두를 다룰 수 있는 능력도 필요합니다.

장치 기능:
- 현재 높이를 측정하여 LED 디스플레이에 표시합니다.
- 전원을 켠 이후 발생한 최대 고도값을 기억합니다.
- 버튼을 누르면 최대 높이가 표시됩니다.
- 최대 높이 값을 컨트롤러의 비휘발성 메모리(EEPROM)에 기록합니다(전원을 끈 후 저장됨).
- EEPROM에 저장된 최대 높이를 읽어 디스플레이에 표시합니다.

제로 기준점은 장치의 전원이 켜진 고도입니다.

필요한 것(괄호 안은 모든 종류의 eBay 등에서 검색하기 위한 키워드입니다.)
- Arduino 마이크로 컨트롤러는 원칙적으로 코드가 조정되면 거의 모든 사람이 사용할 수 있지만 모든 것은 기본(Arduino Nano)을 기반으로 조립 및 테스트되었습니다.

- I2C 버스(BMP085)를 갖춘 기압 고도 센서.

- 공통 양극이 있는 3자리 7세그먼트 LED 디스플레이(7-세그먼트 LED 디스플레이).
-모든 것을 하나의 전체로 연결하는 와이어, 커넥터가있는 기성품을 사용했지만 이것이 전혀 필요하지는 않습니다 (Dupont Wire).

- 버튼은 위치를 고정하지 않고 하면 됩니다(Tact Switch Push Button). 예를 들면 다음과 같습니다.
- 1KOhm에서 10KOhm까지의 저항.
- 3개의 100Ω 저항기.
- 모든 고불과 그것을 사용할 수 있는 능력을 갖춘 납땜 인두입니다.
- 아두이노 소프트웨어.

선택 과목:
- 디스플레이 배선용 개발 보드.

주제에서 완전히 벗어난 사람들을 위해. 장치를 조립하고 코드를 자세히 살펴보기 전에 다음 리소스를 방문하여 읽어 보는 것이 좋습니다.
주제 소개, 간단한 예.
7세그먼트 디스플레이를 예시와 연결하는 방법에 대해 설명합니다.
센서, 예제, 라이브러리에 대한 설명입니다.
시간이 많이 걸리지 않고 이해도가 크게 높아질 것입니다 =)

먼저 디스플레이에 대해 조금 설명하겠습니다.
공통 양극이 있는 7세그먼트 LED 디스플레이는 다음과 같은 LED 어셈블리입니다(그림에서 빨간색 원으로 표시).
다이어그램을 자세히 살펴보면 한 번에 방전 중 하나만 켜질 수 있다는 것이 분명해집니다. 세 자리 숫자를 표시하려면 각 숫자를 차례로 켜고 꺼야 하며 이를 매우 빠르게 수행해야 합니다. 따라서 숫자는 무슨 일이 있어도 깜박입니다. 가장 중요한 것은 이러한 깜박임이 충분히 빈번하고 눈에 깜박임으로 인식되지 않는다는 것입니다. 이는 Arduino가 이 디스플레이의 컨트롤러로도 작동하여 기본적으로 현재 높이와 동일한 숫자를 구성하는 숫자를 차례로 그리는 것을 의미합니다.
바로 예약하겠습니다. 컨트롤러가 내장된 기성 솔루션을 구입할 수 있지만 비용이 5배 더 비싸고 검색할 때 적합한 구현을 찾지 못했습니다. 왜냐하면... 3비트 제품을 정말 갖고 싶었는데 4비트 제품이 점점 더 많이 판매되고 있습니다.
그런데 표시가 3자리인 것을 고려하면 표시할 수 있는 최대 높이는 999m이다. 원칙적으로 장치는 4자리 디스플레이에 쉽게 적용할 수 있지만 프로그램은 약간 수정해야 합니다. 3자리 코드를 이해하는 사람이라면 누구나 쉽게 4자리 코드를 적용할 수 있습니다.
결과적으로, 이 깜박임으로 인해 발생한 문제에도 불구하고 우리는 다소 수용 가능한 결과를 얻을 수 있었습니다. 아래에 더 자세히 설명되어 있습니다. 높이 센서로 인해 문제가 발생했습니다.
센서에 대한 자세한 내용.
센서는 기압계입니다. 대기압의 변화에 ​​따라 고도의 변화를 결정합니다. 실제로 센서는 대기압만 측정합니다. 센서의 라이브러리 코드는 압력의 함수로 고도를 계산합니다. 이 경우 센서에는 ADC와 I2C 인터페이스가 내장되어 있습니다. 측정된 값을 디지털 형식으로 제공하는데 이는 의심할 여지 없이 장점입니다. 센서 작업을 위한 기성 라이브러리가 있습니다. 첫 번째 버전을 사용했는데 리소스 집약도가 낮고 코드에 통합하기가 더 쉽습니다. 라이브러리 기능을 사용하면 측정 정확도를 0(최소 정확도)에서 3(최고 정확도)까지 조정할 수 있습니다(코드 참조). 솔직히 말해서 0 이상의 레벨 사이에는 큰 차이가 없습니다. 측정 오류는 약 1미터로 일반적으로 허용되는 수준입니다. 측정 결과는 정상 대기압에서 해발 절대 고도입니다. 그러나 이것은 전혀 흥미롭지 않습니다. 반면에 아두이노와 간단한 수학연산을 이용하면 상대적인 높이를 쉽게 계산할 수 있게 됐습니다.
그러나 연고에는 파리가있었습니다. 표준 기능을 사용하여 센서를 폴링하는 데 시간이 꽤 오래 걸리고 Arduino도 7 세그먼트 디스플레이 컨트롤러라는 점을 고려하면 매우 재미있는 특수 효과를 얻었습니다. 센서를 폴링하는 동안 디스플레이의 출력이 저절로 중단되어 그 순간 표시되는 숫자가 다른 것보다 조금 더 오래 켜졌습니다. 그 결과 세 가지 요소로 구성된 이러한 유형의 화환이 탄생했습니다.
궁극적으로 지연을 실험하고 최적의 센서 폴링 기간을 선택한 후 깜박임이 거의 완전히 없는 것을 달성했습니다. 또한, 프로그램 주기마다 센서를 폴링할 필요가 없습니다. 높이는 여전히 제한된 속도로 변경됩니다. 하지만 센서의 오류와 너무 잦은 폴링으로 인해 첫 번째 숫자가 깜박이는 것은 아름답게 보이지 않습니다.
원칙적으로는 기술이 더 좋다면 센서 라이브러리를 다시 작성할 수도 있지만 아직 준비가 되지 않았습니다. 그리고 이 구현에서는 기능을 완전히 수행하고 나머지는 가사입니다.
숫자 출력이 인터럽트로 전환되고 깜박임이 제거되고 스케치가 업데이트되었습니다.
여기에서 장치의 요소에 대한 간략한 설명을 마치고 조립으로 넘어갈 것입니다.

장치 요소의 연결 다이어그램(클릭 가능):


“뭐야, 정상적인 도표를 못 그리던데요?!” 시리즈의 질문을 예상하며 가능하다고 말하겠지만, 초심자에게는 이 옵션이 이해하기 더 쉬울 것이라고 생각하지만, 입문자에게는 중요하지 않으므로 다이어그램은 정상적으로 읽혀집니다. 나는 4비트 버전에서만 7세그먼트 핀아웃을 발견했습니다. 3비트 버전은 6번째 레그가 없다는 점만 다릅니다.

장치의 전원 공급 장치의 경우 원래 형태의 Arduino는 일반적으로 7V에서 16V까지, 극단적인 경우 6V에서 20V까지 견딜 수 있습니다. 하지만 중국산 클론이 있다는 점을 고려하면 어떤 사악한 실험도 시도하지 않았지만 LiPo 3S 배터리는 문제없이 작동합니다.
공기에 자유롭게 접근할 수 있도록 센서를 포장하는 동시에 센서의 구멍으로 직접적인 공기 흐름을 차단하는 것이 좋습니다. 예를 들어 발포 고무로 덮습니다.
Arduino 보드에서 RX 및 TX LED를 제거하는 것이 좋습니다. 왜냐하면... 이는 디지털 핀 0과 1에 병렬로 연결되어 있으므로 이 핀에 연결된 세그먼트의 밝기가 낮아집니다.

대기압의 크기, 변화의 속도 및 성격은 날씨를 예측하는 데 중요한 역할을 하며 다양한 기상 현상과 관련된 질병인 날씨 의존성에 민감한 사람들의 안녕에 큰 영향을 미칩니다. 기압계는 대기압을 측정하는 데 사용됩니다. 기계식 아네로이드 기압계에는 두 개의 손이 있습니다. 하나는 현재 압력을 보여줍니다. 임의의 위치로 수동으로 설정할 수 있는 또 다른 화살표를 사용하면 시간에 따른 대기압 변화 추세를 확인하기 위해 측정된 값을 표시할 수 있습니다. 전자 기압계는 대기압의 값뿐만 아니라 증가 또는 감소 여부와 측정된 매개변수가 얼마나 빨리 변화하는지 확인할 수 있도록 하는 것이 매우 바람직합니다.

저렴한 가정용 기상 관측소에는 빗방울, 구름 또는 태양의 그림 문자만 표시됩니다. 이러한 아이콘이 대기압과 어떤 관련이 있는지, 이 기상 관측소에 기압 센서가 있는지 또는 날씨를 예측하는 다른 창의적인 방법을 사용하는지 말하기는 어렵습니다. 보다 발전된 기상 관측소는 현재 기압 값을 숫자로 표시하고, 주로 장식적인 기능을 하는 대략적인 막대 그래프 형태로 이전 몇 시간 동안의 기압 변화를 표시합니다. 이러한 기상 관측소는 훨씬 더 비쌉니다. 또한 선원, 요트 조종사 등을 위해 설계된 매우 진보된 장치가 시장에 나와 있는데, 이는 압력 변화와 현재 값을 모두 높은 정확도로 표시하지만 이러한 장치는 매우 비쌉니다.

이 간행물에서는 대기압과 기온의 변화 크기와 속도를 보여주는 간단한 수제 기압계에 대해 설명합니다.

장치의 외관은 사진에 나와 있습니다.

측정 결과는 두 줄의 문자 합성 디스플레이에 표시됩니다. 첫 번째 줄에는 현재 대기압을 mmHg 단위로 측정한 결과, 특정 위치의 평균값과 현재 압력값의 편차(평균을 초과하는 현재 압력값은 양수로 간주됨)가 표시됩니다. 섭씨 온도. 맨 윗줄에 표시된 데이터는 6초마다 업데이트됩니다. 새 데이터가 출력되면 표시기 위에 ​​있는 LED가 깜박입니다.

표시기의 두 번째 줄에는 지난 1시간, 3시간, 10시간 동안의 압력 증가분이 표시됩니다. 지정된 시간 동안 압력이 증가하면 해당 증가분이 플러스로 표시되고, 그렇지 않으면 마이너스로 표시됩니다. 두 번째 줄의 데이터는 10분마다 업데이트됩니다. 기압계를 켜자마자 두 번째 줄은 비어 있게 됩니다. 1시간, 3시간, 10시간 후에 각각 숫자 값이 나타납니다.

기압계는 온도 0~40°C, 대기압 600~825mmHg의 건조하고 가열된 실내에서 작동하도록 설계되었습니다. 미술.

압력 및 온도 측정의 정확도는 사용된 Bosch BMP180 압력 센서의 정확도에 따라 전적으로 결정됩니다. 일반적인 압력 측정 오류는 -1hPa이며 이는 대략 0.75mmHg에 해당합니다. 압력 측정 시 소음 성분은 0.02hPa(0.015mmHg)입니다. 25°C 부근의 일반적인 온도 측정 오류는 +/- 0.5°C입니다. BMP180 센서의 더 자세한 기술적 특성은 기술 사양에서 확인할 수 있습니다. 응용 프로그램의 설명.

이 장치의 시간 간격은 프로그래밍 방식으로 계산됩니다. 저자가 측정한 이러한 간격 형성의 오류는 10시간 동안 1분을 초과하지 않습니다.

기압계의 다이어그램이 그림에 나와 있습니다.

장치의 주요 요소는 Arduino Nano 모듈입니다. 저자는 ATmega 328 마이크로 컨트롤러와 함께 버전 3을 사용했습니다. 이 경우 모듈 메모리는 1/3만 차지하므로 ATmega 168 마이크로 컨트롤러와 함께 Arduino Nano 모듈을 사용할 수 있습니다.

Winstar WH1602L의 디스플레이는 각 줄에 16자를 포함하는 두 줄입니다. 그 기반은 HD44780 컨트롤러입니다. 저항 R2를 사용하면 이미지 대비를 조정할 수 있습니다. 핀 3(Vo)의 전압이 최적 전압에서 크게 벗어나면 디스플레이에 이미지가 전혀 표시되지 않습니다. 장치를 처음 켤 때 이러한 상황을 고려해야 합니다. 저자가 사용한 디스플레이 인스턴스의 경우 핀 3의 최적 전압은 약 1V였습니다. 저항 R3은 백라이트 LED의 전류 값을 결정합니다.

BMP180 압력 센서에는 3.6x3.6x1mm 크기의 금속 하우징이 있습니다. 결론은 하우징 바닥에 위치한 접촉 패드입니다. 또한 센서에는 1.8~3.6V의 전원 공급 장치가 필요합니다. 센서가 외부 장치와 교환하는 신호 레벨도 필요한 신호 레벨과 다릅니다. 이러한 상황에서는 BMP180을 직접 사용하기가 어렵습니다. 다행히 이 문제는 쉽게 해결됩니다. BMP180 센서 기반 모듈은 센서 자체와 일치하는 모든 요소를 ​​포함하여 판매 가능합니다. 이 모듈은 10x13mm 보드입니다. 비용은 약 1.4 USD입니다. 모듈의 모습은 다음 사진에 나와 있습니다.

HL1 LED는 6초마다 깜박이며 기압계 디스플레이에 새로운 결과가 표시되었음을 나타냅니다. 저자는 Kingbright의 직경 3mm L-1154GT 녹색 LED를 사용했습니다.
커패시터 C1은 용량이 상당히 커서 장치가 단기 정전에 민감하지 않습니다. 이것이 필요하지 않은 경우 C1을 500마이크로패럿으로 줄일 수 있습니다.
다이오드 D1은 정전 시 표시기 백라이트를 끕니다. 이렇게 하면 커패시터 C1에 저장된 에너지로 기압계의 배터리 수명이 늘어납니다.

이 장치는 출력 전압이 8~12V인 모든 DC 소스(휴대폰 충전기, 모든 장치의 전원 공급 장치 등)에서 전원을 공급받을 수 있습니다. 9V 전압에서 기압계는 약 80mA를 소비합니다.

이 장치는 85 x 55mm 크기의 브레드보드에 조립되며 플렉시글래스 판을 사용하여 디스플레이에 부착됩니다.

BMP180 센서는 저항 R3 및 LED 백라이트 디스플레이와 같은 주요 발열 요소에서 가능한 한 멀리 있는 하단에 위치합니다. 장치 본체는 160x160x25 크기의 플라스틱 상자입니다. 상자의 바닥과 상단 벽에 일련의 환기구를 뚫어야 합니다.

Arduino Nano 모듈의 메모리에 플래시해야 하는 스케치가 애플리케이션에 표시됩니다. 저자는 Arduino IDE 1.8.1을 사용했습니다. 압력 센서를 지원하려면 Adafruit-BMP085 라이브러리를 설치해야 합니다. 해당 파일은 첨부파일에 포함되어 있습니다.

스케치를 로드하기 전에 17행에 작성자 기압계 설치 장소의 평균 압력에 해당하는 숫자 740.0 대신 평균 압력을 mm 단위로 입력합니다. rt. 미술. , 기압계가 설치될 위치에 해당합니다. 첫 번째 근사값으로 이 매개변수는 공식 Рср = 760 - 0.091h로 결정될 수 있습니다. 여기서 h는 해발 높이(미터)입니다. 높이를 결정하는 가장 쉬운 방법은 GPS 내비게이터를 사용하는 것입니다.

이 공식은 대기압에 영향을 미치는 많은 요소를 고려하지 않으며 최대 500m의 고도에만 적용됩니다. 평균 압력을 더 정확하게 결정하는 방법에 대한 설명은 이 출판물의 범위를 벗어납니다. 인터넷에서 구할 수 있는 기상학에 관한 수많은 자료에서 찾을 수 있습니다.

방사성 원소 목록

지정 유형 명칭 수량 메모가게내 메모장
A1 센서 BMP180이 포함된 모듈 1 메모장으로
A2 아두이노 보드

아두이노 나노 3.0

1 메모장으로
VD1 정류다이오드

1N4007

1 메모장으로
HG1 LCD 디스플레이WH1602L1 윈스타 메모장으로
HL1 발광 다이오드L-1154GT1 킹브라이트 메모장으로
C1 전해콘덴서4700uF x 16V1

BMP085는 기압을 모니터링하는 센서입니다(추가로 온도도 모니터링합니다).

이 센서는 사실상 아날로그가 없기 때문에 Arduino를 사용하는 프로젝트를 포함한 많은 프로젝트에서 사용됩니다. 게다가 가격도 저렴하다. 발생하는 첫 번째 질문은 대기압을 측정하는 이유는 무엇입니까? 여기에는 두 가지 이유가 있습니다. 첫 번째는 해발 고도를 제어하는 ​​것입니다. 고도가 높아질수록 압력은 감소합니다. GPS 내비게이터 대신 하이킹할 때 매우 편리합니다. 또한, 날씨를 예측하는 데에는 대기압이 사용됩니다.

BMP085는 이전 제품과 동일한 방식으로 Arduino 및 기타 마이크로 컨트롤러에 연결되지만 더 작고 비용이 적게 드는 BMP180 센서로 대체되었습니다.

BMP085의 기술적 특성

  • 감도 범위: 300~1100hPa(해발 9000m~500m);
  • 분해능: 0.03hPa / 0.25m;
  • 작동 온도 -40 ~ +85°C, 온도 측정 정확도 +-2°C;
  • i2c를 통한 연결;
  • 모듈의 V1은 3.3V 공급 및 논리 전원을 사용합니다.
  • 모듈의 V2는 3.3-5V 전원 및 논리 전원을 사용합니다.

Arduino IDE를 다시 시작한 후 첫 번째 예제 스케치를 실행할 수 있습니다. 해당 코드는 아래와 같습니다.

#include <Wire.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BMP085_U.h>

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);

무효 설정(void)

Serial.begin(9600);

Serial.println("압력 센서 테스트"); Serial.println("");

/* 센서 초기화 */

if(!bmp.begin())

/* "BMP085를 감지하는 데 문제가 발생했습니다..."라는 메시지가 나타나는 경우,

센서가 올바르게 연결되어 있는지 확인하세요 */

Serial.print("앗, BMP085가 감지되지 않았습니다... 배선이나 I2C ADDR을 확인하세요!");

센서_이벤트_t 이벤트;

bmp.getEvent(&event);

/* 결과 표시(기압은 hPa로 측정됨) */

if (이벤트.압력)

/* 대기압을 hPa로 표시 */

Serial.print("압력: "); Serial.print(이벤트.압력); Serial.println("hPa");

직렬 모니터 창을 엽니다(전송 속도 - 9600). 우리의 스케치는 hPa(헥토파스칼) 단위로 압력 데이터를 출력해야 합니다. 센서에 손가락을 대면 센서의 기능을 확인할 수 있습니다. 그림은 손가락으로 누른 후의 압력 값을 보여줍니다.


해발 고도 측정

아마도 고도가 높아질수록 압력이 떨어진다는 것을 알고 계실 것입니다. 즉, 압력과 온도를 알면 높이를 계산할 수 있습니다. 다시 말하지만, 우리는 수학을 뒷전으로 남겨두겠습니다. 계산에 관심이 있다면 이 Wikipedia 페이지에서 확인할 수 있습니다.

아래 예에서는 추가 Arduino 라이브러리가 사용됩니다. BMP085 센서를 사용하여 높이를 계산하려면 "void loop()" 함수를 업데이트하세요. 스케치에 필요한 변경 사항은 아래 스케치에 나와 있습니다. 결과적으로 압력 수준과 온도 값을 기반으로 온도 값을 얻게 됩니다.

/* 센서에 대한 새 이벤트 생성 */

센서_이벤트_t 이벤트;

bmp.getEvent(&event);

/* 결과 표시(hPa 단위의 기압) */

if (이벤트.압력)

/* 대기압을 hPa로 표시 */

Serial.print("압력: ");

Serial.print(이벤트.압력);

Serial.println("hPa");

/* 특정 정확도로 높이를 계산하려면 알아야 할 사항 *

* 평균 압력 및 주변 온도

*측정 당시 섭씨 단위*

* 해당 데이터가 없을 경우 "기본값"을 사용하시면 됩니다.

* 이는 1013.25 hPa와 같습니다(이 값은 다음과 같이 정의됩니다).

*센서_압력_SEALEVELHPA*

* Sensors.h 파일에 있음). 하지만 결과는 정확하지 않습니다*

*필요한 값은 기온 예보가 있는 웹사이트에서 확인할 수 있습니다*

*또는 대형 공항의 정보 센터 리소스에서*

*예를 들어 프랑스 파리의 경우 현재 평균 압력 값을 확인할 수 있습니다*

* 홈페이지: http://bit.ly/16Au8ol */

/* BMP085 센서에서 현재 온도 값을 가져옵니다 */

플로트 온도;

bmp.getTemperature(&온도);

Serial.print("온도: ");

Serial.print(온도);

Serial.println("C");

/* 수신된 데이터를 높이로 변환 */

/* 현재 값으로 다음 줄을 업데이트합니다*/

float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;

Serial.print("고도: ");

Serial.print(bmp.압력ToAltitude(seaLevelPressure,

Serial.println("m");

Serial.println("");

Serial.println("센서 오류");

스케치를 실행하고 계산된 해발 고도를 확인합니다.

날씨에 따라 달라지는 평균 압력 값을 지정하면 BMP085 판독값의 정확도를 크게 높일 수 있습니다. 우리가 고려하지 않은 압력 1hPa마다 8.5미터의 오류가 발생합니다!

아래 그림은 유럽 공항의 정보 자원 중 하나의 압력 값을 보여줍니다. 압력 값은 노란색으로 강조 표시되어 결과를 명확히 하는 데 사용할 수 있습니다.


스케치에서 다음 줄을 변경하여 현재 값(1009hPa)을 작성해 보겠습니다.

float seaLevelPressure = 1009;

결과적으로 약간 다른 결과를 얻게 됩니다.

팁: 압력을 지정할 때 사용되는 데이터를 hPa로 변환하는 것을 잊지 마십시오.

BMP085(API v1) 사용

다시 한번 반복해 보겠습니다. 해발 기압과 고도를 알아내기 위해서는 몇 가지 계산을 수행해야 합니다. 하지만 이들 모두는 링크에서 다운로드할 수 있는 Adafruit_BMP085 Arduino 라이브러리(API v1)에 이미 포함되어 있습니다.

라이브러리를 설치한 후 Arduino IDE를 다시 시작해야 합니다.

재부팅 후 첫 번째 예제 스케치를 실행할 수 있습니다.

#include <Wire.h>

Adafruit_BMP085 bmp;

Serial.begin(9600);

Serial.println(" *C");

Serial.print("압력 = ");

Serial.println("Pa");

Serial.println();

Arduino를 플래싱한 후 직렬 모니터를 엽니다. 전송 속도를 9600으로 설정합니다. 스케치는 온도를 섭씨 단위로, 압력을 파스칼 단위로 출력합니다. 센서의 감지 요소에 손가락을 대면 온도와 압력이 증가합니다.


고도 측정(API v1)

해발 고도를 제어하려면 아래 스케치를 실행하면 됩니다.

#include <Wire.h>

#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;

Serial.begin(9600);

Serial.print("온도 = ");

Serial.print(bmp.readTemperature());

Serial.println(" *C");

Serial.print("압력 = ");

Serial.print(bmp.readPressure());

Serial.println("Pa");

// 값을 기반으로 해발 고도를 계산합니다.

//"표준" 기압은 1013.25밀리바 = 101325파스칼과 같습니다.

Serial.print("고도 = ");

Serial.print(bmp.readAltitude());

Serial.println("미터");

Serial.println();

스케치를 실행하여 결과를 표시합니다.


위의 수치로 판단하면 우리는 해발 기준으로 -21.5m의 고도에 있습니다. 하지만 우리는 우리가 바다 위에 있다는 것을 알고 있습니다! API V2를 사용할 때와 동일한 문제를 기억합니다. 날씨를 고려해야합니다! 좋아요. 날씨가 좋은 웹사이트를 찾았고 기압이 101.964Pa라고 가정해 보겠습니다. Arduino IDE에서 예제->BMP085test를 열고 아래 그림에 강조 표시된 줄을 편집합니다.


이 줄에는 현재 압력 데이터를 입력해야 합니다. 새로 출시한 후에는 데이터가 극적으로 변경되었으며 더하기 기호가 있는 29.58미터를 얻었으며 이는 진실과 훨씬 더 유사합니다.


아래에 의견과 질문을 남기고 개인적인 경험을 공유해 주세요. 새로운 아이디어와 프로젝트는 종종 토론을 통해 탄생합니다!

대기압 센서 bmp180, bmp280, bme280은 엔지니어링 프로젝트에 자주 등장합니다. 날씨를 예측하거나 해발 고도를 측정하는 데 사용할 수 있습니다. 오늘날 이 특정 라인은 Arduino에서 가장 인기 있고 저렴한 센서라고 할 수 있습니다. 이 기사에서는 센서의 작동 원리, 다양한 Arduino 보드에 대한 연결 다이어그램을 설명하고 프로그래밍 스케치의 예를 제공합니다.

기압계는 대기압을 측정하는 장치입니다. 전자 기압계는 로봇 공학 및 다양한 전자 장치에 사용됩니다. 가장 일반적이고 저렴한 압력 센서는 BOSH 제품입니다. BMP085, BMP180, BMP280 등이 있습니다. 처음 두 개는 서로 매우 유사하며 BMP280은 더 새롭고 향상된 센서입니다.

압력 센서는 압력을 기계 부품의 움직임으로 변환하여 작동합니다. 압력 센서는 감지 요소가 있는 변환기, 하우징, 기계 요소(다이어프램, 스프링) 및 전자 회로로 구성됩니다.

BMP280 센서는 작은 크기와 낮은 전력 소비가 요구되는 애플리케이션을 위해 특별히 설계되었습니다. 이러한 애플리케이션에는 내비게이션 시스템, 일기 예보, 수직 속도 표시 등이 포함됩니다. 센서는 높은 정확도, 우수한 안정성 및 선형성을 가지고 있습니다. BMP280 센서의 기술적 특성:

  • 크기 2 x 2.5 x 0.95mm.
  • 압력 300-1100hPa;
  • 0C에서 65C까지의 온도;
  • I2C 및 SPI 인터페이스 지원
  • 공급 전압 1.7V – 3.6V;
  • 평균 전류 2.7μA;
  • 3가지 작동 모드 - 절전 모드, FORCED 모드(측정 수행, 값 읽기, 절전 모드로 전환), NORMAL 모드(센서를 주기적 작동으로 전환 - 즉, 장치는 설정된 시간 후에 자동으로 절전 모드를 종료하고 측정을 수행합니다. 판독값을 읽고 측정값을 저장한 후 절전 모드로 돌아갑니다.)

BMP180 센서는 기압과 온도를 측정하는 저렴하고 사용하기 쉬운 터치 센서입니다. 일반적으로 고도를 결정하고 기상 관측소에서 사용됩니다. 이 장치는 압전 저항 센서, 온도 센서, ADC, 비휘발성 메모리, RAM 및 마이크로 컨트롤러로 구성됩니다.

BMP180 센서의 기술적 특성:

  • 측정된 압력의 한계는 225-825mmHg입니다. 미술.
  • 공급 전압 3.3 – 5V;
  • 전류 0.5mA;
  • I2C 인터페이스 지원;
  • 응답 시간 4.5ms;
  • 크기 15 x 14mm.

bme280 센서에는 압력, 습도 및 온도를 측정하는 3가지 장치가 포함되어 있습니다. 낮은 전류 소비, 높은 신뢰성 및 장기적으로 안정적인 작동을 위해 설계되었습니다.

bme280 센서의 기술적 특성:

  • 크기 2.5 x 2.5 x 0.93mm;
  • 8개의 출력을 갖춘 금속 LGA 케이스;
  • 공급 전압 1.7 – 3.6V;
  • I2C 및 SPI 인터페이스의 가용성
  • 대기 전류 소모량 0.1μA.

모든 장치를 서로 비교하면 센서가 매우 유사합니다. 이전 제품인 BMP180에 비해 최신 BMP280 센서는 크기가 눈에 띄게 작습니다. 8핀 소형 하우징은 설치 시 주의가 필요합니다. 이 장치는 I2C만 지원했던 이전 제품과 달리 I2C 및 SPI 인터페이스도 지원합니다. 센서의 작동 논리에는 실질적으로 변화가 없으며 단지 온도 안정성이 향상되고 ADC의 분해능이 높아졌습니다. 온도, 습도, 압력을 측정하는 BME280 센서도 BMP280과 유사합니다. BME280에는 습도 센서가 있어 크기가 약간 늘어나기 때문에 이들 사이의 차이점은 케이스 크기에 있습니다. 접촉 수와 신체에서의 위치는 동일합니다.

Arduino 연결 옵션

BMP180 센서를 Arduino에 연결합니다. 연결하려면 BMP180 센서 자체, Arduino UNO 보드 및 연결 와이어가 필요합니다. 연결 다이어그램은 아래 그림에 나와 있습니다.

Arduino의 접지는 센서의 접지에 연결되어야 하며 전압은 3.3V, SDA는 핀 A4, SCL은 핀 A5에 연결됩니다. 핀 A4 및 A5는 I2C 인터페이스 지원에 따라 선택됩니다. 센서 자체는 3.3V의 전압으로 동작하고 아두이노는 5V로 동작하므로 센서와 함께 모듈에 전압 안정기가 설치되어 있습니다.

BMP 280을 Arduino에 연결합니다. 보드의 핀아웃과 평면도가 그림에 표시되어 있습니다.

압력 센서 모듈 자체는 다음과 같습니다.

Arduino에 연결하려면 다음과 같이 출력을 연결해야 합니다. 접지를 Arduino에 연결하고 센서의 VCC를 3.3V에, SCL/SCK를 아날로그 핀 A5에, SDA/SDI를 A4에 연결합니다.

BME280 센서를 연결합니다. BME280 센서의 접점 위치와 핀아웃은 BMP280과 동일합니다.

센서는 I2C와 SPI를 통해 작동할 수 있으므로 두 가지 방법으로 연결을 구현할 수 있습니다.

I2C를 통해 연결할 때는 SDA와 SCL 핀을 연결해야 합니다.

SPI를 통해 연결할 때 모듈의 SCL과 SCK(Arduino의 13번째 핀), 모듈의 SDO를 Arduino의 12번 핀에, SDA를 11번 핀에, CSB(CS)를 모든 디지털 핀에 연결해야 합니다. Arduino의 핀 10. 두 경우 모두 전압은 Arduino의 3.3V에 연결됩니다.

센서 작업을 위한 라이브러리에 대한 설명입니다. 스케치 예

BMP180 센서로 작업하기 위해 작업을 단순화하는 다양한 라이브러리가 있습니다. 여기에는 SFE_BMP180, Adafruit_BMP085가 포함됩니다. 동일한 라이브러리가 BMP080 센서 작업에 적합합니다. bmp280 센서는 유사한 라이브러리인 Adafruit_BMP280을 사용합니다.

첫 번째 테스트 스케치에서는 센서가 압력과 온도를 읽도록 합니다. 코드는 BMP180 및 BMP280 센서 모두에 적합합니다. 올바른 라이브러리를 연결하고 모듈이 연결된 올바른 접점을 지정하기만 하면 됩니다. 우선 코드에 있는 모든 라이브러리를 연결하고 센서의 동작을 초기화해야 합니다. 압력을 결정하려면 먼저 온도를 알아야 합니다. 이를 위해 다음 코드 요소가 사용됩니다.

Status = Pressure.startTemperature(); // 센서로부터 온도 데이터를 읽는 중 if(status!=0)( Delay(status); // 대기 상태 = Pressure.getTemperature(T); // 수신된 온도 데이터를 저장하는 중 if( status !=0)( Serial.print("Temperature: "); // "Temperature"라는 단어를 표시합니다. Serial.print(T,2); // 온도 값을 표시합니다. Serial.println("deg C, "); //섭씨 기호를 인쇄합니다.

그런 다음 대기압에 대한 정보를 얻어야 합니다.

상태 = 압력.startPressure(3); // 압력을 읽습니다. if(status!=0)( Delay(status); // 대기 상태 = Pressure.getPressure(P,T); // 압력을 받고 저장됩니다. if(status!=0)( Serial.print ( "절대 압력: "); // "대기압"이라는 단어를 표시합니다. Serial.print(P,2); // 변수 mBar의 값을 표시합니다. Serial.print(" mbar, "); print(P*0.7500637554192,2); // 값을 mmHg(mmHg) 단위로 표시합니다. Serial.println(" mmHg");) // 압력 단위를 "mmHg"로 표시합니다. "(mmHg.)

스케치를 로드한 후 포트 모니터링 창에 온도 및 대기압에 대한 데이터가 나타납니다.

BME280 센서는 압력과 온도도 표시하며 기본적으로 꺼져 있는 습도 판독값도 읽을 수 있습니다. 필요한 경우 센서를 조정하고 습도 판독을 시작할 수 있습니다. 측정 범위는 0~100%입니다. 센서 작업에 필요한 라이브러리는 Adafruit_BME280입니다.

코드는 위에서 설명한 것과 유사하며 습도를 결정하기 위해 선만 추가됩니다.

Void printValues() ( Serial.print("Temperature = "); Serial.print(bme.readTemperature()); Serial.println(" C"); //온도를 결정하여 화면에 섭씨 단위로 표시합니다. Serial.print("Pressure = "); Serial.print(bme.readPressure() / 100.0F); Serial.println(" hPa"); //압력을 결정하고 이를 화면에 표시합니다. = "); Serial.print(bme.readHumidity()); Serial.println(" %"); //습도를 백분율로 결정하고 측정된 값을 표시 Serial.println();

가능한 연결 오류 및 제거

가장 일반적인 오류는 실제 값과 몇 배나 차이가 나는 압력 및 온도에 대한 잘못된 데이터입니다. 그 이유는 대부분 잘못된 연결 때문입니다. 예를 들어 라이브러리에는 I2C를 통해 연결해야 한다고 명시되어 있지만 센서는 SPI를 통해 연결되어 있습니다.

또한 "중국어" 센서를 사용할 때 비표준 I2C 또는 SPI 주소가 발생할 수 있습니다. 이 경우 인기 있는 스케치 중 하나를 사용하여 연결된 모든 장치를 스캔하고 압력 센서가 응답하는 주소를 찾는 것이 좋습니다.

또 다른 문제는 모듈의 작동 전압과 사용되는 컨트롤러의 기본 전압 간의 불일치일 수 있습니다. 따라서 3.3V 센서로 작업하려면 전압 분배기를 생성하거나 기존의 기성 레벨 매칭 모듈 중 하나를 사용해야 합니다. 그건 그렇고, 그러한 모듈은 매우 저렴하므로 초보자가 사용하는 것이 좋습니다.

센서 교정으로 인해 실제 값과 약간의 차이가 있을 수 있습니다. 예를 들어 BMP180 센서의 경우 모든 데이터가 계산되어 스케치에 지정됩니다. 보다 정확한 고도 값을 얻으려면 해당 좌표에 대한 해발 현재 기압을 알아야 합니다.

결론

대기압 센서 bmp180, bmp280은 가장 저렴한 유형의 센서는 아니지만 대부분의 경우 이러한 센서에 대한 대안이 거의 없습니다. 기상 관측소 프로젝트에서 센서는 날씨를 예측할 수 있게 해주는 중요한 매개변수인 대기압을 기록합니다. 비행 차량 제작과 관련된 프로젝트에서 기압계는 해발 실제 고도 센서로 사용됩니다.

센서를 연결하는 데 어려움이 없습니다. 표준 i2C 또는 SPI 연결이 사용됩니다. 프로그래밍을 위해 기성품 중 하나를 사용할 수 있습니다.



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: