아두이노 코딩-199: SPS미세먼지 센서 LCD 1602 I2C인터페이스 출력 실패담

codingart(66)
Published in
#kr
Words
446
Reading
2 min
Listen
Play
8y

noname01.png

SPS 미세먼지 센서 규격을 보면 내부적으로 충분한 샘플링 시간을 부여 하여 PM 1.0 과 PM2.5 를 따로 따로 측정하여 출력하는 것으로 되어 있다. 데스크 탑 컴퓨터에 연결하여 시험할 경우에는 시리얼 모니터 또는 시리얼 플로터로 출력하여 결과를 확인할 수 있으나 포터블화 할 경우에는 전원도 어댑터를 사용해야 하며 출력 결과를 디스플레이 디바이스를 사용하여 출력해 볼 필요가 있다.

가장 흔하게 사용하는 I2C 인터페이스 방식에 의해 1602 LCD 로 출력해보자.
배선도를 참조해 보면 이미 SPS30이 I2C 를 사용하고 있으므로 A4(=SDA),A5(=SCL) 핀 커넥터 한 세트와 반대쪽의 SDA,SCL 핀을 각각 하나씩 할당하여 점퍼선으로 배선 연결하도록 하자. 사실 A4 와 A5 는 SDA 와 SCL 핀과 각각 전기적으로 연결되어 있음에 주의하자. 즉 같은 전기선에 2개의 디바이스가 연결되더라도 각각에 할당되어 있는 고유의 주소에 따라 인터페이스 되기 때문에 알아서 서로 데이터를 주고받는다. 단 SPS30의 경우는 일반 아두이노 센서류와는 달리 별도로 풀업 저항을 사용하여 전원 ON 시에 반드시 적절한 전압 상태를 튜닝해 주어야 하며 제조사에서 제공하는 라이브러리를 그대로 설치해줘야 한다.

이미 아두이노 배선에 의해서 시리얼 모니터 또는 시리얼 플로터에 의해 출력 결과를 볼 수 있다면 별도로 I2C 1602LCD 디스플레이를 위한 루틴을 추가하도록 하자.

아울러 I2C에 의해 1602LCD를 작동시키기 위해서는 헤더 영역에 아두이노 방식에 따라서 Wire.h 와 LiquidCrystal_I2C.h를 설치해 줘야 한다. Wire.h 라이브러라이브러리는 아두이노 시스템에 디폴트로 설치되어 있으므로 라이브러리 포함하기에 등록할 필요 없이 헤더 영역에 그냥 불러 쓰면 된다. 반면에 LiquidCrystal_I2C.h는 따로 라이브러리 포함하기에 등록 작업을 해줘야 한다.

라이브러리 바로 밑에서 클라스 명령 LiquidCrystal_I2C lcd(0x3F,16,2)을 실행한다. 때에 따라서는 자신이 구매한 LCD 의 주소가 0x3F 가 아닌 경우일 수 있다. 주소 확인을 위해서는 아래 url 주소의 i2cscanner 아두이노 코드를 다운받아 실행시키면 LCD의 주소를 스캔해 볼 수 있다. 스캔 값을 넣어 주어야 할 것이다.

http://blog.daum.net/ejleep1/533

setup() 문에서 초기화 및 백라이트 제어 명령을 실행한다. 주의할 점은 I2C 인터페이스를 쓸 경우와 쓰지 않을 경우의 중요한 차이점은 초기화 명령이 서로 다르다는 점이다. I2C 인터페이스의 초기화는 lcd.init() 이며 반면에 I2C를 쓰지 않는 경우에는 lcd.begin() 명령을 사용한다.

준비가 되었으면 코드를 실행보기 바란다. 아울러 코드가 대단히 간단해도 실패할 수 있는데 백팩회로를 부가함에 따라 하드웨어적으로 I2C 주소가 0x27로 변경되어 버린 경우가 있다. 실제 I2C 인터페이스의 주소 값이 얼마인지 첨부된 i2cscanner 코드를 사용하여 시리얼 모니터에서 확인하도록 하자.

I2C 인터페이스 방식에 의거 1602 LCD 디스플레이에서 데이터를 보기 위해 모든 조치를 다하였으나 특정한 에러 메시지도 없이 출력을 볼 수 없었다. 지금까지 상당히 많은 아두이노 코딩에 실패란 없었는데 SPS30 I2C.h 라이브러리와 아두이노의 Wire.h 가 서로 맞지 않는 듯하다. 라이브러리 파일 간의 충돌이 일어나는 문제라면 쉽게 해결이 쉽지 않은 듯하다.

noname02.png

간단하게 출력해볼 수 있는 대안으로는 블루투스 보드 HC-06을 사용하여 스마트폰 앱인벤터에서 보는 방법일 것이다. 앱인벤터 코딩은 매우 간단하므로 다음 블로그에 결과를 정리해서 올릴 예정이다.

I2C.h 와 Wire.h 사이의 충돌 문제가 사실이라면 남은 방법으로서 I2C 인터페이스를 사용하지 말고 UART 기법을 적용해야 할 듯하다. UART 기법에 의해서 SPS30 센서 데이터를 읽을 수 있으면 그때는 Wire.h를 사용하여 I2C 방식에 의해 1602 LCD로 출력이 가능하리라 본다.

마나마인로고.png

아두이노 코딩-199: SPS미세먼지 센서 LCD 1602 I2C인터페이스 출력 실패담 | Ecency