나만의 Raspberry Pi 기상 관측소 구축

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hat은 Raspberry Pi 단일 보드 컴퓨터와 함께 사용할 수 있는 애드온 보드입니다. Raspberry Pi Sense Hat에는 8×8 LED 디스플레이와 5버튼 조이스틱이 있으며 다음 센서가 장착되어 있습니다.

  1. 자이로스코프
  2. 가속도계
  3. 자력계
  4. 온도
  5. 기압
  6. 습기

이 기사에서는 Python API 기반 기상 관측소 웹 응용 프로그램을 사용하여 만드는 방법을 보여 드리겠습니다. 온도 , 기압 , 그리고 습기 Raspberry Pi Sense Hat의 센서. 이 문서를 따라 하려면 다음이 필요합니다.







  1. 네트워크 연결이 가능한 Raspberry Pi 3 또는 Raspberry Pi 4.
  2. Raspberry Pi Sense Hat 모듈.
  3. 마이크로 USB(Raspberry Pi 3) 또는 USB Type-C(Raspberry Pi 4) 전원 어댑터.
  4. Raspberry Pi OS가 탑재된 16GB 또는 32GB microSD 카드.
  5. VNC 원격 데스크톱 액세스 또는 Raspberry Pi에 대한 SSH 액세스를 위한 랩톱 또는 데스크톱 컴퓨터.

노트: 이 기사에서는 Raspberry Pi의 헤드리스 설정을 사용하여 VNC 또는 SSH를 통해 원격으로 Raspberry Pi에 연결합니다. SSH 또는 VNC를 통해 원격으로 Raspberry Pi에 액세스하지 않으려면 모니터, 키보드 및 마우스를 Raspberry Pi에 연결해야 합니다.



Raspberry Pi OS 이미지를 microSD 카드에 플래시하는 방법을 배우려면 Raspberry Pi Imager 설치 및 사용 방법을 참조하십시오. Raspberry Pi에 Raspberry Pi OS를 설치하는 데 도움이 필요하면 다음을 읽으십시오. Raspberry Pi 4에 Raspberry Pi OS를 설치하는 방법 . Raspberry Pi의 헤드리스 설정에 대한 도움이 필요하면 외부 모니터 없이 Raspberry Pi 4에서 Raspberry Pi OS를 설치 및 구성하는 방법을 확인하십시오.



Raspberry Pi Sense Hat을 Raspberry Pi에 연결

Raspberry Pi Sense Hat 키트는 Raspberry Pi Sense Hat 애드온 보드, 40핀 암수 헤더, 일부 나사 및 스페이서와 함께 제공됩니다.





Sense Hat 보드를 Raspberry Pi에 부착하기 전에 40핀 헤더를 Sense Hat에 연결해야 합니다. 40핀 수-암 헤더의 수 핀을 아래 이미지와 같이 Sense Hat에 연결합니다.



Raspberry Pi 단일 보드 컴퓨터에는 추가 보드 또는 케이스를 부착하는 데 사용할 수 있는 4개의 구멍이 있습니다. 애드온 보드를 부착하려면 아래 이미지와 같이 라즈베리 파이 뒷면의 나사를 삽입하세요.

그런 다음 스페이서를 나사에 연결합니다.

4개의 나사와 스페이서를 모두 추가하면 Raspberry Pi가 아래 이미지와 같이 보일 것입니다.

아래 이미지와 같이 Raspberry Pi Sense Hat을 Raspberry Pi의 40핀 GPIO 수 헤더에 연결합니다.

노트: Raspberry Pi GPIO의 핀이 구부러지지 않도록 Raspberry Pi 40핀 GPIO 헤더에서 Raspberry Pi Sense Hat을 분리할 때 주의하십시오.

나머지 4개의 나사로 아래 이미지와 같이 Raspberry Pi Sense Hat을 고정합니다.

라즈베리 파이 전원 켜기

Raspberry Pi Sense Hat이 Raspberry Pi에 연결되었으므로 Raspberry Pi OS가 설치된 microSD 카드를 Raspberry Pi의 microSD 카드 슬롯에 삽입하고 전원 케이블을 Raspberry Pi에 연결한 후 전원을 켭니다.

Raspberry Pi Sense Hat Python 라이브러리 설치

Raspberry Pi에서 Raspberry Pi Sense Hat을 사용하려면 센스 모자 Python 라이브러리는 Raspberry Pi OS에 설치되어 있어야 합니다. NS 센스 모자 라이브러리는 Raspberry Pi OS의 공식 패키지 저장소에서 사용할 수 있습니다.

라즈베리파이를 설치하려면 센스 모자 Raspberry Pi OS의 Python 라이브러리에서 먼저 다음 명령을 사용하여 APT 패키지 리포지토리 캐시를 업데이트합니다.

$ sudo apt 업데이트

그런 다음 다음 명령을 실행합니다.

$ sudo apt 설치 감지 모자 -y

Flask Micro Web Framework Python 라이브러리 설치

우리는 Flask Python 프레임워크를 사용하여 날씨 애플리케이션을 만들 것입니다. 다음 명령을 사용하여 Raspberry Pi OS의 공식 패키지 저장소에서 Flask를 설치할 수 있습니다.

$ sudo apt install python3-flask -y

프로젝트 디렉토리 생성

프로젝트 파일을 구성하기 위해 프로젝트 디렉토리를 만드는 것이 좋습니다. 프로젝트 디렉토리를 생성하려면 ~/일하다 , 다음 명령을 사용합니다.

$ mkdir ~/work

프로젝트 디렉토리가 생성되면 다음과 같이 프로젝트 디렉토리로 이동합니다.

$ cd ~/작업

Raspberry Pi Sense Hat 테스트

Raspberry Pi Sense Hat이 작동하는지 테스트하기 위해 간단한 테스트 Python 스크립트를 작성할 수 있습니다. 라는 새 Python 스크립트를 만들 수 있습니다. test.py 이랑 나노 다음과 같이 텍스트 편집기:

$ 나노 테스트.py

에 다음 코드를 입력하십시오. test.py 파일. 1행 수입 센스햇 ~로부터 센스_모자 모듈, 3행은 센스햇 객체에 참조를 저장하고 감각 변수이고 5-6행은 모든 8×8 LED의 색상을 빨간색으로 설정합니다. 완료되면 다음을 누릅니다. + NS 뒤이어 그리고 그리고 .

당신은 실행할 수 있습니다 test.py 다음 명령을 사용하는 Python 스크립트:

$ python3 test.py

8×8 LED 매트릭스는 아래 이미지와 같이 빨간색으로 빛납니다.

Sense Hat의 LED를 끄려면 다음을 실행하십시오. 분명한() 색상 값이 없는 메서드 test.py 아래 스크린샷과 같이 Python 스크립트를 실행하고 test.py 다시 파이썬 스크립트.

이제 아래 이미지와 같이 Sense Hat의 LED가 꺼집니다.

Sense Hat이 제대로 작동하면 다음 섹션으로 넘어갑니다.

Sense Hat에서 날씨 데이터 가져오기

다음을 사용하여 Sense Hat에서 센서 데이터를 매우 쉽게 얻을 수 있습니다. 센스 모자 파이썬 라이브러리. Sense Hat에서 센서 데이터를 검색하려면 새 Python 스크립트를 생성할 수 있습니다. read_sensor_data.py 다음과 같이:

$ 나노 read_sensor_data.py

에 다음 코드를 입력하십시오. read_sensor_data.py 파이썬 파일.

~에서센스_모자수입센스햇
~에서 시각 수입
감각=센스햇()
감각.분명한()
동안 진실:
온도=감각.get_온도()
임시 직원=온도 *(9/5)+32
압력=감각.get_pressure()
습기=감각.get_humidity()

인쇄('온도: %.2f°C/%.2f°FN'%(온도,임시 직원))
인쇄('압력: %.2fmbN'%(압력))
인쇄('습도: %.2f%%NN'%(습기))
(5)

완료되면 다음을 누릅니다. + NS 뒤이어 그리고 그리고 .

위의 코드에서 1행과 2행은 필요한 모든 라이브러리를 가져오고 4행은 센스햇 5번째 줄은 다음을 사용하여 Sense Hat의 모든 LED를 끕니다. 분명한() 방법. 7행의 while 루프는 8-16행의 코드를 영원히 실행하는 무한 루프입니다.

8행에서, get_온도() 메서드는 Sense Hat의 습도 센서에서 온도 데이터(섭씨 단위)를 읽는 데 사용됩니다. 9행에서 온도 데이터는 섭씨에서 화씨로 변환됩니다. 10행에서, get_pressure() 방법은 Sense Hat의 압력 센서에서 기압 데이터(밀리바 단위)를 읽는 데 사용됩니다. 11행에서, get_humidity() 방법은 Sense Hat의 습도 센서에서 습도 데이터(%)를 읽는 데 사용됩니다.

라인 13-15는 센서 데이터를 콘솔에 인쇄하는 데 사용되며, 라인 16은 센서 데이터를 다시 읽기 전에 5초 동안 기다리는 데 사용됩니다.

당신은 실행할 수 있습니다 read_sensor_data.py 다음과 같은 Python 스크립트:

$ python3 read_sensor_data.py

스크립트가 실행되면 센서 데이터가 콘솔에 인쇄됩니다.

이제 Sense Hat에서 센서 데이터를 읽을 수 있으므로 + 프로그램을 중지합니다.

기상 관측소 웹 앱 만들기

이 섹션에서는 Python Flask 웹 프레임워크를 사용하여 날씨 API와 날씨 애플리케이션을 만드는 방법을 보여줍니다. 날씨 애플리케이션은 날씨 데이터 API에 액세스하여 실시간으로 날씨 데이터를 표시합니다. 이 섹션에서 논의된 모든 코드는 GitHub에서 사용할 수 있습니다. shovon8 / raspberry-pi-sense-hat-weather-app .

먼저, 생성 서버.py 프로젝트 디렉토리의 Python 스크립트는 다음과 같습니다.

$ 나노 서버.py

에 다음 코드를 입력하십시오. 서버.py 파이썬 파일.

~에서플라스크수입플라스크
~에서플라스크수입jsonify
~에서플라스크수입렌더링 템플릿
~에서플라스크수입url_for
~에서센스_모자수입센스햇
=플라스크(__이름__)
앱.구성['SEND_FILE_MAX_AGE_DEFAULT'] = 0
감각=센스햇()
감각.분명한()
~와 함께앱.test_request_context():
url_for('공전',파일 이름='스타일.css')
url_for('공전',파일 이름='앱.js')
@앱.노선('/불')
데프():
온도=감각.get_온도()
임시 직원=온도 *(9/5)+32
압력=감각.get_pressure()
압력사이=압력 *0.0145038
압력P=압력 *100
습기=감각.get_humidity()

반품jsonify({
'온도':{ '씨': 온도 C, 'NS': 온도F},
'압력':{ 'MB': 압력, '파': 압력,
'사이': 압력사이, 'NS': 압력P},
'습기': 습도
})
@앱.노선('/')
데프():
반품렌더링 템플릿('./홈.html')

그런 다음 + NS 뒤이어 그리고 그리고 저장하기 위해 서버.py 파이썬 스크립트.

위의 코드에서 1-5행은 필요한 모든 라이브러리를 가져오고, 7행은 Flask 앱을 ​​만들고, 11행은 SenseHat 개체를 만들고, 12행은 Sense Hat의 모든 LED를 끕니다. 8행은 Flask 앱에 대한 웹 캐싱을 비활성화합니다. 이 앱은 가볍기 때문에 캐싱이 필요하지 않습니다. 앱을 수정하려는 경우 웹 캐싱을 비활성화하면 테스트가 훨씬 쉬워집니다.

18-31행은 Sense Hat에서 센서 데이터를 읽고 HTTP GET 요청에서 JSON 형식으로 API 데이터를 반환합니다. /불 웹 서버의 끝점. 37-39행은 날씨 웹 앱 홈페이지를 반환합니다. / 웹 서버의 끝점. 홈페이지는 다음에서 렌더링됩니다. home.html 파일에 있어야 합니다. 템플릿/ 프로젝트 디렉토리의 디렉토리.

라인 14-16은 액세스를 허용하는 데 사용됩니다. 스타일.css 그리고 앱.js 정적 파일. 이러한 파일은 다음 위치에 있어야 합니다. 공전/ 프로젝트 디렉토리의 디렉토리. NS 스타일.css 파일은 스타일을 지정하는 데 사용됩니다. home.html 홈페이지, 그리고 앱.js 파일은 API 데이터를 요청하는 데 사용됩니다. /불 끝점에서 날씨 데이터를 업데이트합니다. home.html 5초마다 페이지를 표시합니다.

생성 공전/ 그리고 템플릿/ 다음과 같이 프로젝트 디렉토리의 디렉토리:

$ mkdir -v {정적,템플릿}

만들기 home.html 에 있는 파일 템플릿/ 디렉토리는 다음과 같습니다.

$ 나노 템플릿/home.html

에 다음 코드를 입력하십시오. home.html 파일.


< HTML >
< 머리 >
< 메타 이름='뷰포트' 콘텐츠='너비=장치 너비, 초기 크기=1.0'>
< 제목 >라즈베리 파이 기상 관측소</ 제목 >
< 링크 상대='스타일시트' 유형='텍스트/css'
href='{{ url_for('정적', 파일 이름='스타일.css') }}'/>
</ 머리 >
< 신체 >
< div ID='콘텐츠'>
< h1 >라즈베리 파이 기상 관측소</ h1 >

< div 수업='데이터 콘텐츠'>
< h2 >온도</ h2 >
< div 수업='데이터 행'>
< div 수업='데이터 셀' ID='tempC'>
...
</ div >
< div 수업='데이터 셀' ID='tempF'>
...
</ div >
</ div >
</ div >

< div 수업='데이터 콘텐츠'>
< h2 >압력</ h2 >
< div 수업='데이터 행'>
< div 수업='데이터 셀' ID='압력MB'>
...
</ div >
< div 수업='데이터 셀' ID='압력사이'>
...
</ div >
</ div >
< div 수업='데이터 행'>
< div 수업='데이터 셀' ID='압력하파'>
...
</ div >
< div 수업='데이터 셀' ID='압력P'>
...
</ div >
</ div >
</ div >

< div 수업='데이터 콘텐츠'>
< h2 >습기</ h2 >
< div 수업='데이터 행'>
< div 수업='데이터 셀' ID='습기'>
...
</ div >
</ div >
</ div >
</ div >

< 스크립트 유형='텍스트/자바스크립트' src='{{ url_for('정적', 파일 이름='app.js') }}'></ 스크립트 >
</ 신체 >
</ HTML >

그런 다음 + NS 뒤이어 그리고 그리고 저장하기 위해 home.html 파일.

만들기 스타일.css 에 있는 파일 공전/ 디렉토리는 다음과 같습니다.

$ nano static/style.css

에 다음 코드를 입력하십시오. 스타일.css 파일.

@수입 URL('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
: 0;
여유: 0;
글꼴 패밀리: '로봇', 산세 리프;
}
신체{
배경: # 737373;
}
h1{
표시하다: 블록;
색상: #79DC7B;
텍스트 정렬: 센터;
글꼴 두께: 400;
배경: # 000;
: 0.5em 0;
}
h2{
표시하다: 블록;
배경: # 000;
색상: #ffff;
텍스트 정렬: 센터;
글꼴 두께: 400;
글꼴 크기: 1em;
}
.data-content {
여유: 10픽셀;
국경: 2픽셀 단단한 검은 색;
경계 반경: 5픽셀;
배경색: #79DC7B;
}
.데이터 행 {
표시하다:몸을 풀다;
플렉스 방향:;
}
.data-cell {
너비: 100%;
: 80픽셀;
표시하다:몸을 풀다;
항목 정렬: 센터;
내용을 정당화하다: 센터;
글꼴 두께: 굵게;
글꼴 크기: 1.5em;
색상: #006902;
}
.data-cell:호버 {
배경: # FFE891;
색상: # AA8600;
커서: 바늘;
}

그런 다음 + NS 뒤이어 그리고 그리고 저장하기 위해 스타일.css 파일.

만들기 앱.js 에 있는 파일 공전/ 디렉토리는 다음과 같습니다.

$ 나노 정적/app.js

에 다음 코드를 입력하십시오. 앱.js 파일.

창문.추가 이벤트 리스너('짐',기본);
기능기본() {
기능API 데이터 가져오기() {
어디http= 새로운XMLHttpRequest();

http.준비 상태 변경 = 기능() {
만약(이것.준비 상태 === 4 && 이것.상태 === 200) {
업데이트(JSON.분석하다(이것.응답 텍스트));
}
}

http.열려있는('가져 오기', '/불', 진실);
http.보내다();
}


기능업데이트(API 데이터) {
어디온도=문서.getElementById('tempC');
어디임시 직원=문서.getElementById('tempF');
어디압력Mb=문서.getElementById('압력MB');
어디압력사이=문서.getElementById('압력사이');
어디압력Hpa=문서.getElementById('압력하파');
어디압력P=문서.getElementById('압력P');
어디습기=문서.getElementById('습기');

온도내부HTML =파스플로트(API 데이터.온도.).고정(2) + '℃';
임시 직원내부HTML =파스플로트(API 데이터.온도.NS).고정(2) + '°F';

압력Mb.내부HTML =파스플로트(API 데이터.압력.메가바이트).고정(2) + '엠비';
압력사이.내부HTML =파스플로트(API 데이터.압력.사이).고정(2) + '사이';
압력Hpa.내부HTML =파스플로트(API 데이터.압력.hPa).고정(2) + 'hPa';
압력P.내부HTML =파스플로트(API 데이터.압력.NS).고정(2) + ' NS';

습기.내부HTML =파스플로트(API 데이터.습기).고정(2) + '%';
}


기능() {
창문.세트간격(기능() {
API 데이터 가져오기();
}, 5000);
}

();
}

그런 다음 + NS 뒤이어 그리고 그리고 저장하기 위해 앱.js 파일.

여기서 1행은 다음을 실행합니다. 기본() 웹 페이지 로드가 완료되면 함수. 에서 기본() 기능, API 데이터 가져오기() 함수는 AJAX를 사용하여 날씨 API 데이터를 가져오고 업데이트() 데이터를 성공적으로 가져오면 함수(10행)를 실행합니다. NS 업데이트() 함수는 API 데이터를 사용하여 웹 페이지 요소를 업데이트합니다.

20행에서, 문서.getElementById() 메소드는 id가 있는 웹 페이지 요소의 참조를 얻는 데 사용됩니다. 온도 . 28행은 id가 있는 웹 페이지 요소의 내용을 대체하는 데 사용됩니다. 온도 API의 온도(섭씨)로. 같은 방식으로 모든 웹 요소(21-26행)의 내용은 각각의 API 데이터로 대체됩니다.

에서 앱() 기능, API 데이터 가져오기() 날씨 앱에서 날씨 데이터를 최신 상태로 유지하기 위해 5초(5000밀리초)마다 호출됩니다. 마지막으로 46행에서 앱() 기능이 실행됩니다.

웹 앱을 테스트하려면 다음 명령을 입력합니다.

$ FLASK_APP=server.py 플라스크 실행 --host=0.0.0.0

날씨 앱은 기본적으로 포트 5000에서 실행되어야 합니다.

Weather API가 작동하는지 테스트하려면 다음 명령어를 실행하세요.

$ 컬 -s http://localhost:5000/api | json_pp

보시다시피 Weather API 데이터는 콘솔에 인쇄됩니다. 따라서 API가 작동합니다.

날씨 앱을 테스트하려면 다음을 방문하세요. http://localhost:5000 Chromium 웹 브라우저에서. 날씨 앱은 웹 브라우저에 로드해야 하지만 처음에는 날씨 데이터가 표시되지 않아야 합니다.

몇 초 후 날씨 앱은 API에서 날씨 데이터 가져오기를 완료하고 표시해야 합니다.

언제든지 다음을 누를 수 있습니다. + 웹 서버를 중지합니다.

날씨 웹 앱을 위한 시스템화된 서비스 만들기

이 섹션에서는 부팅 시 자동으로 시작되도록 날씨 앱에 대한 시스템 서비스 파일을 만드는 방법을 보여줍니다.

먼저, 생성 기상 관측소.서비스 다음과 같이 프로젝트 디렉토리에 파일을 만듭니다.

$ 나노 기상 관측소.서비스

다음 코드 줄을 입력하십시오. 기상 관측소.서비스 파일.

[단위]
Description=Raspberry Pi Sense Hat을 사용하는 Raspberry Pi 기상 관측소 웹 앱
이후=네트워크.타겟

[서비스]
작업 디렉토리=/home/pi/work
환경=FLASK_APP=server.py
환경=FLASK_ENV=프로덕션
ExecStart=/usr/bin/flask 실행 --host=0.0.0.0
StandardOutput=상속
StandardError=상속
다시 시작=항상
사용자=파이

[설치]
WantedBy=다중 사용자.대상

그런 다음 + NS 뒤이어 그리고 그리고 저장하기 위해 기상 관측소.서비스 파일.

복사 기상 관측소.서비스 에 파일 /etc/systemd/system/ 다음 명령으로 디렉토리:

$ sudo cp -v 기상 관측소.서비스 /etc/systemd/system/

다음과 같이 변경 사항을 적용하려면 systemd 데몬을 다시 로드하십시오.

$ sudo systemctl 데몬 다시 로드

NS 기상청 아래 스크린샷과 같이 systemd 서비스가 현재 비활성화되어 있어야 합니다.

$ sudo systemctl 상태 weather-station.service

시작 기상청 다음 명령으로 서비스:

$ sudo systemctl weather-station.service 시작

보시다시피, 기상청 현재 서비스가 실행 중입니다.

$ sudo systemctl 상태 weather-station.service

이제 그 기상청 서비스가 작동 중이면 다음 명령을 사용하여 Raspberry Pi OS의 시스템 시작에 추가할 수 있습니다.

$ sudo systemctl enable weather-station.service

다음 명령을 사용하여 Raspberry Pi를 재부팅합니다.

$ sudo 재부팅

라즈베리 파이가 부팅되면 기상청 아래 스크린샷과 같이 서비스가 실행 중이어야 합니다.

$ sudo systemctl 상태 weather-station.service

다른 장치에서 날씨 앱에 액세스

홈 네트워크의 다른 장치에서 날씨 앱에 액세스하려면 Raspberry Pi의 IP 주소를 알아야 합니다. 홈 라우터의 웹 관리 인터페이스에서 Raspberry Pi 4의 IP 주소를 찾을 수 있습니다. 이 경우 IP 주소는 192.168.0.103이지만 이 주소는 사용자마다 다르므로 이후의 모든 단계에서 이 주소를 사용자의 주소로 교체해야 합니다.

Raspberry Pi 콘솔에 액세스할 수 있는 경우 다음 명령을 실행하여 IP 주소도 찾을 수 있습니다.

$ 호스트 이름 -I

Raspberry Pi의 IP 주소를 알면 홈 네트워크의 모든 장치에서 액세스할 수 있습니다. 아래 스크린샷과 같이 Android 스마트폰에서 날씨 앱에 액세스했습니다.

결론

이 기사에서는 Raspberry Pi Sense Hat을 사용하여 Raspberry Pi 기상 관측소를 구축하는 방법을 보여주었습니다. 우리는 사용 센스 모자 Raspberry Pi Sense Hat에서 날씨 데이터를 추출하는 Python 라이브러리. 그런 다음 Flask Python 마이크로 웹 프레임워크를 사용하여 날씨 API와 웹 애플리케이션을 만들었습니다. 웹 앱은 5초마다 날씨 API에서 날씨 데이터를 가져와 웹 앱을 최신 날씨 데이터로 최신 상태로 유지합니다.