본문 바로가기

아두이노우노 R4

UNO R4 WiFi BLE ① 기압 센서 LPS22 연결

반응형

 

MEMS 기압 센서 LPS22HB(STMicroelectronics)를 사용합니다. 기압과 온도를 측정할 수 있습니다.

 

마이크로컴퓨터 보드 Arduino UNO R4 WiFi는 Wi-Fi와 BLE 무선 통신을 지원하며, BLE로 3회에 걸쳐 송수신을 한다.

 

● Adafruit의 Stemma QT/Qwiic 보드

 

LPS22 보드 설명 페이지 

 

 

Stemma QT/Qwiic(JST SH 4핀) 커넥터는 2곳에 장착되어 있으며, 어느 쪽에 연결해도 상관없다. 이 커넥터를 사용하여 I2C로 제어하는 경우, 특히 점퍼선을 연결하는 등의 작업이 필요하지 않습니다.

 

커넥터는 앞면과 뒷면 모두 꽂을 수 있지만, 핀이 내부 상단에 정렬되어 있어 꽂을 수 있는 방향이 정해져 있습니다. 잠금장치는 없지만, 쉽게 빠지는 일은 없습니다.

 

● 기압 센서 LPS22의 주요 사양

 

LPS22HB의 데이터 시트는 이 웹페이지에서 확인할 수 있습니다.

  • 전원 전압 1.7~3.6V
  • 기압 측정 범위 260~1260hPa, 정확도: ±1hPa, 분해능: ±0.1hPa
  • 온도 측정 범위 -40~+85℃, 정확도 ±1.5℃, 분해능 ±1.5℃.
  • 인터페이스 I2C(0~400kHz), SPI(10MHz)
  • 슬레이브 주소 0x5d, 후면의 Address를 단락시키면 0x5c

사용 환경

  • Arduino UNO R4 WiFi
  • Arduino IDE 2.2.1
  • Windows10 22H2

 

연결  

 

Arduino UNO R4 WiFi의 I2C 신호와 센서 보드를 JST 커넥터로 연결합니다(Stemma QT/Qwiic 보드의 사진 비율은 다릅니다). 

 

https://www.denshi.club/cookbook/arduino/r4/arduino-uno-r4-wifible-1.html

 

슬레이브 주소 확인

 

기존에 많이 사용되는 i2cScanner.ino를 실행하여 슬레이브 주소를 확인합니다.

이 마이컴 보드에는 Qwiic 전용 커넥터가 준비되어 있지만, LPS22는 인식하지 못했습니다.

(2024/01/30) Qwiic 전용 커넥터는 이 보드에 있는 두 개의 버스 중 두 번째 버스에 연결되어 있습니다.

 

Arduino UNO R4 WiFi Qwiic 커넥터

 

Wire1.begin();
libraryName.begin( Wire1 );

 

와 같이 작성하게 된다. 미확인. (추기 끝) 

 

 

I/O 단자의 SCL과 SDA 단자, 전원 단자를 이용하여 Stemma QT/Qwiic 커넥터를 장착합니다.

전원은 3.3V입니다.

주소 x5d를 찾았습니다. 

 

 

 

라이브러리 준비: LPS22에서 검색하여 찾은 Adafruit LPS2X 라이브러리를 설치합니다. 

 

 

 

설치를 시작할 때 관련 라이브러리 및 종속성 설치 여부를 묻는 패널이 나오면 모두 설치를 선택합니다.

 

샘플 스케치

 

메뉴의 파일->스케치 예제에서 Adafruit LPS2X의 adafruit_lps22_test.ino를 선택한다,

컴파일, 실행합니다. 실행 시 처음 표시되는 값은 올바르지 않은 것 같으니, 읽지 말고 버리십시오. 온도는 다른 온도 센서에 비해 +2±0.5℃로 높게 측정됩니다. 

 

 

 

SPI 관련을 제거하고 I2C에 대한 설명만 남긴 스케치입니다.  

 

 

// Basic demo for pressure readings from Adafruit LPS2X
#include <Wire.h>
#include <Adafruit_LPS2X.h>
#include <Adafruit_Sensor.h>

Adafruit_LPS22 lps;

void setup(void) {
  Serial.begin(115200);
  while (!Serial) delay(10);     // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("Adafruit LPS22 test!");

  // Try to initialize!
  if (!lps.begin_I2C()) {
    Serial.println("Failed to find LPS22 chip");
    while (1) { delay(10); }
  }
  Serial.println("LPS22 Found!");

  lps.setDataRate(LPS22_RATE_10_HZ);
  Serial.print("Data rate set to: ");
  switch (lps.getDataRate()) {
    case LPS22_RATE_ONE_SHOT: Serial.println("One Shot / Power Down"); break;
    case LPS22_RATE_1_HZ: Serial.println("1 Hz"); break;
    case LPS22_RATE_10_HZ: Serial.println("10 Hz"); break;
    case LPS22_RATE_25_HZ: Serial.println("25 Hz"); break;
    case LPS22_RATE_50_HZ: Serial.println("50 Hz"); break;
    case LPS22_RATE_75_HZ: Serial.println("75 Hz"); break;
  }
}

void loop() {
  sensors_event_t temp;
  sensors_event_t pressure;
  lps.getEvent(&pressure, &temp);// get pressure
  float tempC = temp.temperature;
  float press = pressure.pressure;

  Serial.print("Temperature: ");Serial.print(temp.temperature);Serial.println(" degrees C");
  Serial.print("Pressure: ");Serial.print(pressure.pressure);Serial.println(" hPa");
  Serial.println("");
  delay(5000);
}

 

 

그래픽 디스플레이에 측정 결과 표시

 

측정한 온도와 기압을 그래픽 디스플레이에 표시하는 방법은 다음과 같습니다.

 

Arduino UNO R4 Minima로 센서 인터페이스하기 ⑤ 온습도 센서 Si7021의 측정 결과를 그래픽 디스플레이에 표시하기  

 

스케치 코드입니다. 

 

// Basic demo for pressure readings from Adafruit LPS2X
#include <Wire.h>
#include <Adafruit_LPS2X.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_SSD1306.h>

Adafruit_LPS22 lps;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);

void setup(void) {
  Serial.begin(115200);
  while (!Serial) delay(10);     // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("Adafruit LPS22  + ssd1306");

  // Try to initialize!
  if (!lps.begin_I2C()) {
    Serial.println("Failed to find LPS22 chip");
    while (1) { delay(10); }
  }
  Serial.println("LPS22 Found!");

  lps.setDataRate(LPS22_RATE_10_HZ);
  Serial.print("Data rate set to: ");
  switch (lps.getDataRate()) {
    case LPS22_RATE_ONE_SHOT: Serial.println("One Shot / Power Down"); break;
    case LPS22_RATE_1_HZ: Serial.println("1 Hz"); break;
    case LPS22_RATE_10_HZ: Serial.println("10 Hz"); break;
    case LPS22_RATE_25_HZ: Serial.println("25 Hz"); break;
    case LPS22_RATE_50_HZ: Serial.println("50 Hz"); break;
    case LPS22_RATE_75_HZ: Serial.println("75 Hz"); break;
  }

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    for (;;)
      ; // Don't proceed, loop forever
  }
  display.display();
  delay(500); // Pause for 2 seconds
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setRotation(0);
  display.clearDisplay();
}

void loop() {
  display.clearDisplay();
  display.setCursor(0, 0);

  sensors_event_t temp;
  sensors_event_t pressure;
  lps.getEvent(&pressure, &temp);// get pressure

  Serial.print("Temperature: ");Serial.print(temp.temperature);Serial.println(" degrees C");
  Serial.print("Pressure: ");Serial.print(pressure.pressure);Serial.println(" hPa");
  Serial.println("");

  display.println("Temperature: - `C");
  display.print(temp.temperature, 2);
  display.println("");
  display.println("");
  display.println("Pressure: - hPa");
  display.print(pressure.pressure, 1);
  display.display();

  delay(5000);
}

 

 

실행 예시입니다. 

 

 

 

포스팅 내용 참고 주소: BLE 실습 예제 참고 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^