짧은 시간, 기가 막힌 아이디어, Nano 33 BLE 보드 하드웨어와 소프트에어를 배우는 중인데, 그럼에도 불구하고 열정이 있는 11조가 숙제를 주었습니다. erun. 집에 아침마다 밥 달라고 창문 앞에서 우는 길고양이 같습니다. 덕분에 한 달 전에 산 고양이 사료가 다 떨어져 갑니다.
11조 작품인 공기청정기 이동 로봇에 들어가는 Nano 33 BLE Sense 보드, PM2008M 미세먼지 센서와 Liquid Crystal LCD를 연결하여 미세먼지 센서 값을 나타냅니다. 연결이 좀 복잡할 것 같은 예감이 듭니다. Nano 33 BLE Sense 컨트롤 보드는 3.3V로 동작합니다. 미세먼지 센서를 다짜고짜 3.3V전원을 연결하니 잘 동작하네요. 남은 것은 16*2 캐릭터 LCD인데 5V에서 동작합니다. 그래서 보드 뒷면에 USB 전원을 쓸 때 연결해 주면 5V가 출력되는 핀을 LCD 전원으로 연결해 동작하니 이상 없이 잘 디스플레이됩니다.
집에 방이 여러 개니 방 개수만큼 미세먼지 센서와 Display를 달아 모니터링합니다. 통신은 BLE를 사용하려고 하는 데 아직까지 방법을 찾지 못해서 불안하기는 합니다. 여하튼 전체 과정을 올려둡니다. 주저하지 맙시다. 유령들이 우리 주위를 감싸기 전에 하고 싶은 것들은 해치웁시다. ^^ 우리가 진행할 전체 단계는 아래와 같습니다.
1. 미세먼지 센서 PM2008M 테스트
2. Nano 33 BLE Sense 보드 뒷면의 VUSB 단자 쇼트(솔더링으로 연결)
3. i2c Character LCD 디스플레이 테스트 -> 다음에는 ssd1306 OLED 사용할 것, 아니면 3.3V 지원 LCD
4. 전체 하나로 합쳐서 미세먼지 PM2.5 디스플레이 하기
전체 회로도는 아래와 같습니다. 주의할 점은 LCD와 PM2008M은 같은 I2C 통신을 하므로 LCD 2개로 그렸습니다. LCD 구동전원은 +5V 이므로 보드 뒷면의 VUSB를 연결해주고 그 핀에서 전원을 공급합니다.
1. 미세먼지 센서 PM2008M 테스트
우선 센서의 데이터북을 참고하세요.
미세먼지 센서 PM2008M은 주위 미세먼지 농도를 알려주는 센서 / 미세먼지 수치(PM)는 GRIMM 방식과 TSI 방식 모두 지원 / CUBIC사 정품 / 샤오X 공기청정기의 센서입니다.
Features
- GRIMM 방식, TSI 방식 지원(GRIMM, TSI는 회사 이름입니다.)
- 입자 검출 최소 크기 : 0.3 ㎛
- 공급 전압 : 5V
- 노이즈 방지를 위한 금속 차폐
- 통신 방식 : I2C, UART
- 크기 : 48(W) x 40(H) x12(D) [mm]
Application Ideas
- Air Purifier
- Air Quality Monitor
- Air Conditioner
- Ventilator
Platform Supported
- 아두이노
- 라즈베리 파이
- 비글본
- Wio
- 그 외 I2C, UART 가능 하드웨어 플랫폼에 사용 가능
Specification
Particle size range |
0.3㎛~ 10㎛ |
Output result |
Particle mass concentration (㎍/m.) |
Maximum Measurement range () is Effective measuring range |
PM1.0: 0 ~ 1,000㎍/m³, (0 ~ 500㎍/m³) PM2.5: 0 ~ 1,000㎍/m³, (0 ~ 500㎍/m³) PM10: 0 ~ 1,000㎍/m³, (0 ~ 500㎍/m³) |
Test dust |
Aerosol kcl. |
Measurement (Reference) |
GRIMM 11-A, TSI 8530 |
Resolution |
1 ㎍/m. |
Maximum Consistency Error |
0 ~ 100㎍/m³, ±10㎍/m³ 101 ~ 500㎍/m³, ±10% reading |
Maximum Consistency Error for PM 10 |
0 ~ 100㎍/m³, ±25㎍/m³ 101 ~ 500㎍/m³,±25% reading |
Responsd time |
1sec |
Time to first reading |
≤ 8 seconds |
Working temperature |
-10℃ ~ 50℃ |
Working humidity |
0 ~ 95%RH(non-condensing) |
Storage temperature |
-30℃ ~ 60℃ |
Power supply |
DC 5V±0.1V, ripple wave<50mV |
Working current |
≤100mA |
Standby current |
≤200μA |
Digital output 1 |
I2C, UART_TTL (L <0.8V, H >2.7V@3.3V/5V) |
Digital output 2 |
PWM (customized) |
Output method |
Default by active output after powering on, sampling time interval should be over 1,000ms. |
L.D MTTF |
37,297hr (continuous turn on) |
센서를 구매할 때 추가로 PM2008M용 아두이노 연결 케이블을 구매하셔야 합니다.
하네스 케이블을 다음과 같이 연결합니다. 아두이노 UNO 기준입니다.
- 빨강 : 5V
- 검정 : GND
- 흰색 : A4 (SDA)
- 녹색 : A5 (SCL)
- 기존에 판매했던 4핀 케이블은 I2C 전용입니다.
- 이번에 수정된 5핀 케이블은 노란색 점퍼 케이블을 아래와 같이 연결하느냐에 따라 UART 또는 I2C로 동작합니다.
[노란색 케이블 연결]
- VCC 연결 또는 플로팅 유지 : UART 모드
- GND 연결 : I2C 모드
연결이 잘 되었다면 라이브러리를 설치합니다. 아두이노 IDE 스케치에서 툴 > 라이브러리 관리에서 PM2008을 찾아서 설치해 줍니다. 아래 이미지를 참고하세요.
스케치에서 불러올 파일은 파일 > 예제로 가서 아래와 같습니다.
예제를 불러오면 i2c 주소는 0x28로 아예 설정되어 있습니다. 굳이 i2c 주소를 확인하시려면 i2c scanner 코드를 불러와 실행하면 i2c 주소를 볼 수 있습니다. 아래 이미지는 위쪽은 미세먼지 센서의 i2c주소이고 아래 이미지는 i2c LCD의 i2c 주소를 보여줍니다. 우선 i2c 스캔 코드는 아래와 같고 테스트가 필요 없으면 그냥 진행하세요.
#include <Wire.h>
void setup() {
Serial.begin(9600);
Wire.begin();
Serial.println("\nI2C Scanner");
}
void loop() {
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++) {
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address < 16)
Serial.print("0");
Serial.println(address, HEX);
nDevices++;
}
else if (error == 4) {
Serial.print("Unknown error at address 0x");
if (address < 16)
Serial.print("0");
Serial.println(address, HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found");
else
Serial.println("done");
delay(5000); // wait 5 seconds for next scan
}
미세먼지 센서 예제 코드를 컴파일 후 업로딩 하면 결과는 아래와 같습니다.
GRIMM, TSI는 미국의 센서 회사 이름입니다. 아래 5개 마이크로미터 단위로 나오는 값을 쓰셔도 되고 원하는 PM 값을 선택해 공기 질을 판단하시면 됩니다.
2. Nano 33 BLE Sense 보드 뒷면의 VUSB 단자 쇼트(솔더링으로 연결) - LCD 연결
5V 전원을 LCD에 공급하기 위해 아래 이미지처럼 보드 뒷면의 VUSB 단자를 납땜으로 연결합니다. 아주 소량의 납으로 연결합니다.
3. i2c Character LCD 디스플레이 테스트 -> 다음에는 ssd1306 OLED 사용할 것, 아니면 3.3V 지원 LCD
우선 라이브러리를 아래 이미지와 마찬가지로 검색하여 설치해 줍니다.
예제 코드는 아래와 같은 경로를 따라 불러옵니다. 위 이미지와 같은 라이브러리를 설치했다면 사용자의 컴퓨터 아두이노 라이브러리가 설치된 폴더를 찾아갑니다. 제 경우는 아래와 같은 폴더입니다.
C:\Users\girin\Documents\Arduino\libraries\LiquidCrystal_I2C\examples\HelloWorld\HelloWorld.pde입니다.
소스코드는 아래와 같습니다.
//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup()
{
lcd.init(); // initialize the lcd
lcd.init();
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(3,0);
lcd.print("Hello, world!");
lcd.setCursor(2,1);
lcd.print("Ywrobot Arduino!");
lcd.setCursor(0,2);
lcd.print("Arduino LCM IIC 2004");
lcd.setCursor(2,3);
lcd.print("Power By Ec-yuan!");
}
void loop()
{
}
파일을 컴파일하여 업로드하면 되는데 스케치 아래 상태 화면에 "경고: 라이브러리 LiquidCrystal_I2C가 avr 아키텍처에서 실행되며 mbed아키텍처에서 실행되는 현재 보드에서는 호환되지 않을 수 있습니다." 메시지가 나오는데 영향 없이 잘 됩니다.
테스트 결과 아래와 같은 아름다운 화면이 나옵니다.
4. 전체 하나로 합쳐서 미세먼지 PM2.5 디스플레이 하기
하, 왜 이리 길 까요? 전체를 합쳐서 테스트합니다. 하드웨어도 하나로 하고, 소프트웨어도 하나로 합니다. 오늘은 늦어서 다음 기회에 하기로 합니다. 그래도 내일이면 다 하겠죠. ^^
코드를 하나로 합쳤습니다. 오전에 동호회에서 총회 송년회를 온라인으로 준비해야 해서 회의를 하고 이제야 연결하고 소프트웨어 수정을 했습니다. 아~ 힘드네요.
전체 코드를 올립니다. 여기에 BLE 통신 코드를 추가해야 합니다. ㅠ.ㅠ. 언제 될지는 모릅니다.
#include <pm2008_i2c.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
PM2008_I2C pm2008_i2c;
void setup() {
lcd.init(); // initialize the lcd
lcd.backlight();
pm2008_i2c.begin();
Serial.begin(9600);
pm2008_i2c.command();
delay(1000);
}
void loop() {
uint8_t ret = pm2008_i2c.read();
if (ret == 0) {
Serial.print("PM 1.0 (GRIMM) : ");
Serial.println(pm2008_i2c.pm1p0_grimm);
Serial.print("PM 2.5 (GRIMM) : : ");
Serial.println(pm2008_i2c.pm2p5_grimm);
Serial.print("PM 10 (GRIMM) : : ");
Serial.println(pm2008_i2c.pm10_grimm);
Serial.print("PM 1.0 (TSI) : ");
Serial.println(pm2008_i2c.pm1p0_tsi);
Serial.print("PM 2.5 (TSI) : : ");
Serial.println(pm2008_i2c.pm2p5_tsi);
Serial.print("PM 10 (TSI) : : ");
Serial.println(pm2008_i2c.pm10_tsi);
Serial.print("Number of 0.3 um : ");
Serial.println(pm2008_i2c.number_of_0p3_um);
Serial.print("Number of 0.5 um : ");
Serial.println(pm2008_i2c.number_of_0p5_um);
Serial.print("Number of 1 um : ");
Serial.println(pm2008_i2c.number_of_1_um);
Serial.print("Number of 2.5 um : ");
Serial.println(pm2008_i2c.number_of_2p5_um);
Serial.print("Number of 5 um : ");
Serial.println(pm2008_i2c.number_of_5_um);
Serial.print("Number of 10 um : ");
Serial.println(pm2008_i2c.number_of_10_um);
}
lcd.setCursor(3,0);
lcd.print("PM2.5--->");
lcd.setCursor(6,1);
lcd.print(pm2008_i2c.pm2p5_grimm);
delay(1000);
//print dust sensor sensor value
}
결과가 아주 잘 나옵니다. 아래 이미지는 동작 이미지입니다. 참고하십시오. 놀러 나가려고 하는데 벌써 해가 다 졌네요. 샤워기 호스가 고장 나서 농협에서 사 가지고 교체를 해야 합니다. 치열한 일상은 순진한 사랑 이야기에 비하면 탁하고 어두운 습지대입니다. 시간은 흐르고 삶은 지치고 감정은 메말라갑니다.
참고
1. 16*2 LCD Module with Adapter - 메카솔루션
2. 3.3V/5V LCD Module 16x2 1602 Character Display,Black on White ERM1602FS-6
5. Liquid Crystal I2C 라이브러리 Github
'개발자 > Arduino' 카테고리의 다른 글
Arduino Portenta H7 처음 시작하기 (0) | 2021.02.19 |
---|---|
Arduino Portenta H7 기본적인 특징 (0) | 2021.02.18 |
Arduino Nano 33 BLE Sense Sensor Library 연구 (0) | 2020.12.30 |
LSM9DS1 라이브러리 버전 2.0 소개 (0) | 2020.12.14 |
Arduino와 Processing 상호 제어 (0) | 2020.12.04 |
SSD 1306 OLED 디스플레이 원리 (3) | 2020.12.03 |
LSM6DS3 3D 가속도계와 3D 자이로스코프 미세 진동 감지 (0) | 2020.11.30 |
Arduino Nano 33 BLE Sense Sensor 라이브러리 소개 (0) | 2020.11.24 |
더욱 좋은 정보를 제공하겠습니다.~ ^^