지난 몇 년 동안 스마트 홈 장치는 2015년에 300,000개 미만에서 2020년에는 거의 12억 개까지 증가했습니다. 그리고 2021년에는 15억 개까지 증가할 것으로 예상됩니다.
따라서 2021년까지 가정당 평균 스마트 기기가 8.7대에 이를 것이라는 점을 감안할 때 집에 스마트 기기가 최소한 몇 개는 있을 것입니다.
개발자로서 우리는 자체 스마트 홈 장치를 구축할 수 있기 때문에 이 영역에서 몇 가지 이점이 있습니다.
급속한 발전을 겪은 것은 기기뿐만이 아닙니다. 그들에 사용되는 개발 보드는 점점 더 상업적이고 접근하기 시작했습니다.
이 기사에서는 Raspberry Pi, LCD 화면 및 몇 줄의 코드를 사용하여 외부 또는 특정 위치의 날씨를 모니터링하는 방법을 살펴보겠습니다.
DIY(Do It Yourself) 프로젝트이기 때문에 이 장치에 필요한 몇 가지 전제 조건이 있습니다.
전제조건
- 라즈베리 파이 3(또는 그 이상)
- LCD 화면
- 연결 와이어
- 전위차계(선택 사항)
- 브레드보드(선택 사항)
구축 방법
필요한 모든 것을 갖추는 즉시 시작할 수 있습니다. 차근차근 해봅시다.
1단계 - 기본 구성
첫 번째 단계는 기본 설정과 모든 구성 요소의 확인으로 구성됩니다.
이 데모에서는 ClimaCell Weather API를 날씨 데이터 공급자로 사용할 것입니다. ClimaCell Weather API에는 대기 질 지표를 포함하여 사용할 지표가 많기 때문입니다.
API를 사용하려면 플랫폼에서 계정을 열고 요청에 서명하는 데 사용할 API 키를 가져와야 합니다.
계정은 무료로 열 수 있으며 100시간의 API 호출 제한이 제공됩니다. 이는 우리 프로젝트에 충분합니다.
이 API 키가 있으면 하드웨어 구성으로 이동하고 LCD 화면을 Raspberry Pi에 연결할 수 있습니다. 유선 연결을 하는 동안에는 Raspberry Pi를 꺼야 합니다.
Raspberry Pi 3의 핀 레이아웃은 다음 이미지에서 볼 수 있습니다.
LCD와 개발 보드 사이의 배선 연결은 다음과 같습니다.
이 하드웨어 연결은 LCD 화면을 최대 밝기 및 최대 명암비로 만듭니다. 밝기 수준은 문제가 아니지만 대비는 화면에서 문자를 볼 수 없기 때문입니다.
그렇기 때문에 대비 수준을 설정할 수 있는 전위차계를 하나 이상 도입해야 합니다.
이 시점에서 Raspberry Pi를 켤 수 있고 LCD 화면이 살아 있는 것을 볼 수 있습니다. 가변 저항의 도움으로 대비를 제어할 수 있어야 합니다.
2단계 - 프로젝트 구성
프로그래밍 언어로서 우리는 NodeJS를 사용하여 코드를 작성할 것입니다. Raspberry에 NodeJS가 아직 설치되어 있지 않다면 다음의 간단한 지침을 따르십시오.
새 폴더에서 npm init -y
명령을 실행합니다. 새 npm 패키지를 설정하려면 npm install lcd node-fetch
명령을 입력하세요. 이 2개의 필수 종속성을 설치합니다.
lcd
LCD 화면과 통신하는 데 사용됩니다.node-fetch
ClimaCell API에 HTTP 요청을 하는 데 사용됩니다.
날씨 데이터 공급자와 통신하려면 API 키가 필요하다고 말했습니다. 비밀 API 키를 기본 코드에 직접 배치하거나 config.json
를 만들 수 있습니다. 이 키 및 기타 코드 관련 구성을 저장할 수 있는 파일입니다.
config.json
{ "cc_key": "<your_ClimaCell_API_key>"}
마지막으로, 우리 프로젝트의 메인 파일을 만들고 우리가 이야기한 모든 것을 포함하도록 합시다.
// * Dependencies
const Lcd = require("lcd");
const fs = require("fs");
const fetch = require("node-fetch");
// * Globals
const { cc_key } = JSON.parse(fs.readFileSync("./config.json"));
3단계 - LCD
화면에 쓰는 것은 lcd 모듈을 사용하는 케이크 조각입니다. 이 라이브러리는 장치와 통신하는 방법에 대한 추상화 계층 역할을 합니다. 이렇게 하면 각 명령을 개별적으로 미세하게 관리할 필요가 없습니다.
LCD 화면의 전체 코드는 다음과 같습니다.
첫 번째 단계는 새 lcd
을(를) 만드는 것입니다. 객체를 사용하고 우리가 사용한 핀을 인수로 전달합니다.
키 cols
및 rows
LCD 디스플레이의 열과 행 수를 나타냅니다. 16x2는 이 예에서 사용한 것입니다. LCD에 8개의 열과 1개의 행만 있는 경우 16과 2를 값으로 바꿉니다.
디스플레이에 무언가를 쓰려면 다음 두 가지 방법을 연속적으로 사용해야 합니다.
- lcd.setCursor() - 쓰기 시작 위치 선택
- lcd.print()
동시에 async/away
을 사용하겠다는 약속으로 이 두 함수를 래핑했습니다. 키워드.
이 시점에서 이 기능을 사용하여 디스플레이에 무언가를 인쇄할 수 있습니다. writeToLcd(0,0,'Hello World')
Hello World
메시지를 출력해야 합니다. 첫 번째 열에서 시작하여 첫 번째 행에.
4단계 - 날씨 데이터
다음 단계는 날씨 데이터를 가져와 디스플레이에 인쇄하는 것입니다.
ClimaCell은 많은 기상 데이터 정보를 제공할 뿐만 아니라 대기 질 및 꽃가루, 화재 및 기타 정보도 제공합니다. 데이터는 방대하지만 LCD 화면에는 32자에 불과한 16개의 열과 2개의 행만 있다는 점을 염두에 두십시오.
더 많은 유형의 데이터를 표시하고 이 제한이 너무 작으면 스크롤 효과를 사용할 수 있습니다.
이 데모에서는 간단하게 유지하고 LCD 화면에 다음 데이터를 인쇄합니다.
- 현재 날짜(시, 분, 초)
- 온도
- 강수 강도
ClimaCell에서 특정 위치에 대한 데이터를 얻으려면 지리적 좌표, 위도 및 경도를 보내야 합니다.
도시의 좌표를 찾으려면 latlong.net과 같은 무료 도구를 사용한 다음 config.json
에 저장할 수 있습니다. API 키와 함께 파일을 생성하거나 코드에 직접 작성할 수 있습니다.
이 시점에서 API 호출에 의해 반환된 데이터 형식은 다음과 같습니다.
{
lat: 45.658,
lon: 25.6012,
temp: { value: 17.56, units: 'C' },
precipitation: { value: 0.3478, units: 'mm/hr' },
observation_time: { value: '2020-06-22T16:30:22.941Z' }
}
이 객체를 분해하고 온도와 강수량 값을 가져와 첫 번째와 두 번째 행에 인쇄할 수 있습니다.
V단계 - 정리
이제 스크립트에 대한 논리를 작성하고 새 데이터가 도착하면 LCD 화면을 업데이트하기만 하면 됩니다.
날씨 데이터는 5분마다 업데이트됩니다. 그러나 ClimaCell에서 시간당 100개의 API 호출 제한이 있기 때문에 더 나아가 매분 날씨 데이터를 업데이트할 수 있습니다.
현재 날짜에는 두 가지 옵션이 있습니다.
observation_time
속성을 사용할 수 있습니다. 데이터가 수신된 날짜를 표시하거나- 실제 시계를 만들어 현재 시간을 표시할 수 있습니다.
저는 두 번째 옵션을 선택했지만 원하는 대로 자유롭게 선택하세요.
오른쪽 상단 모서리에 시간을 인쇄하려면 먼저 텍스트가 꼭 맞도록 시작 열을 계산해야 합니다. 이를 위해 다음 공식을 사용할 수 있습니다. total columns number
빼기 text to display length
날짜는 8자이고 열은 16개이므로 열 번호 8부터 시작해야 합니다.
LCD 설정은 비동기식이므로 lcd.on()
메서드를 사용해야 합니다. 관련 라이브러리에서 제공하므로 LCD가 초기화되어 사용할 준비가 된 시점을 알 수 있습니다.
임베디드 시스템의 또 다른 모범 사례는 사용하는 리소스를 닫고 해제하는 것입니다. 이것이 SIGNINT
를 사용하는 이유입니다. 프로그램이 중지되면 LCD 화면을 닫는 이벤트입니다. 이와 같은 다른 이벤트는 다음과 같습니다.
SIGUSR1
및SIGUSR2
- nodemon restart와 같은 "kill pid"를 잡기 위해uncaughtException
- 잡히지 않은 예외를 잡기 위해
6단계 - 영원히 실행
스크립트가 완료되었으며 이 시점에서 프로그램을 실행할 수 있습니다. 끝내기 전에 해야 할 일이 한 가지 더 있습니다.
이 시점에서 SSH를 사용하거나 HDMI 케이블과 모니터를 사용하여 직접 Raspberry Pi에 연결했을 수 있습니다. 무슨 일이 있어도 터미널을 닫으면 프로그램이 중지됩니다.
동시에 장치의 전원을 껐다가 잠시 후 또는 즉시 전원을 다시 켜면 스크립트가 시작되지 않고 수동으로 수행해야 합니다.
이 문제를 해결하기 위해 pm2와 같은 프로세스 관리자를 사용할 수 있습니다.
단계는 다음과 같습니다.
sudo npm install pm2 -g
- pm2 설치sudo pm2 startup
- pm2 관리자를 위한 시작 스크립트 생성pm2 start index.js
- 애플리케이션 시작pm2 save
- 서버 재시작 시 프로세스 목록 저장
이제 보드를 재부팅할 수 있으며 장치가 준비되면 스크립트가 자동으로 시작됩니다.
결론
이 시점에서 원하는 대로 새 장치를 사용자 지정할 수 있습니다. 이 날씨 데이터(또는 대기 오염, 꽃가루, 화재 지수 또는 도로 위험과 같은 ClimaCell의 다른 데이터)가 중요하다면 맞춤형 케이스를 만들어 라즈베리 파이와 LCD 디스플레이를 넣을 수 있습니다. 그런 다음 배터리를 추가한 후 장치를 집에 놓을 수 있습니다.
Raspberry Pi는 개인용 컴퓨터와 같기 때문에 Arduino와 같은 마이크로 컨트롤러에서 일반적으로 수행하는 것보다 훨씬 더 많은 작업을 수행할 수 있습니다. 이 때문에 집에 있는 다른 기기와 쉽게 결합할 수 있습니다.