-
Notifications
You must be signed in to change notification settings - Fork 0
Node‐RED GPIO & dht11 details
sudo apt-get update
sudo apt-get upgrade
먼저 운영체제를 업그레이드 해준다.
git clone https://github.com/adafruit/Adafruit_Python_DHT.git 으로 라이브러리 설치 (홈 디렉터리에 설치)
- ls 명령어로 설치한 라이브러리 폴더 이름을 클릭!
-
cd Adafruit_Python_DHT입력해서 해당 폴더로 이동 -
sudo python setup.py install명령어 실행
- 다시 home 으로 이동해서
sudo apt-get install –y libgpiod-dev명령어로 libgpiod 설치 - libgpiod는 파이썬 패키지가 아니라 시스템 패키지로 설치해야 하는 라이브러리 입니다.
- 라즈베리 파이의 패키지 관리 도구인 apt를 사용해야 합니다.
libgpiod을 수동으로 설치해서 에러 해결함
raise RuntimeError("DHT sensor not found, check wiring")
RuntimeError: DHT sensor not found, check wiring
Lost access to message queue
- 필수 패키지 설치 먼저 libgpiod를 수동으로 컴파일하기 위해 필요한 필수 패키지를 설치합니다.
sudo apt-get update
sudo apt-get install -y git build-essential autoconf automake libtool pkg-config
- libgpiod 소스 코드 다운로드 이제 libgpiod 소스 코드를 GitHub에서 다운로드합니다.
git clone https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git
cd libgpiod
- 소스 코드 컴파일 및 설치 소스 코드 디렉터리로 이동한 후, 아래 명령어를 사용해 libgpiod를 컴파일하고 설치합니다.
./autogen.sh
./configure
make
sudo make install
이 명령어는 libgpiod를 수동으로 컴파일하고 설치하는 과정입니다. 설치가 완료되면 libgpiod가 라즈베리 파이에서 정상적으로 사용 가능해집니다.
- 설치 확인 설치가 완료되면 libgpiod가 제대로 설치되었는지 확인하기 위해 다음 명령어를 실행하세요.
gpiodetect
이 명령어가 작동하면, libgpiod가 정상적으로 설치되었음을 의미합니다.
GPIO 접근 권한 문제 라즈베리 파이에서 GPIO 핀을 제어할 때 권한 문제가 발생할 수 있습니다. gpio 그룹에 사용자가 추가되어 있는지 확인하고, 추가 후 라즈베리 파이를 재부팅합니다.
sudo usermod -aG gpio pi
sudo reboot
sudo pip3 install adafruit-circuitpython-dht
이 명령어는 dht11 실습을 위한 파이썬 라이브러리를 설치하는건데, 사용하니까 다음과 같은 오류가 떴다.
오류
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.
- 가상환경을 사용하지 않은 상태일때, 가상환경을 먼저 생성했다.
가상환경 생성
python3 -m venv ~/dht11_env
가상환경 활성화
source ~/dht11_env/bin/activate
- python 가상환경을 사용해서 가상환경내에서 라이브러리를 깔았다.
pip3 install adafruit-circuitpython-dht
가상환경에 라이브러리를 다운로드하기 위해 sudo를 빼고 이렇게 입력했더니 성공.
이제 adafruit를 import해서 파이썬에서 dht11 데이터를 받을수있다.
import time
import board
import adafruit_dht
dhtDevice = adafruit_dht.DHT11(board.D4)
temperature_c = dhtDevice.temperature
temperature_f = temperature_c * (9 / 5) + 32
humidity = dhtDevice.humidity
print("Temp: {:.1f} F / {:.1f} C Humidity: {}% ".format(temperature_f, temperature_c, humidity))
time.sleep(2.0)
vcc는 그대로꼽아서 문제되지않지만 gnd는 -연결단자에 꼽아야함! 실수.
-
온습도 센서 VCC : 1번 핀 (3.3v) - 3.3v 전압 핀
-
온습도 센서 GND : 6번 핀 (Ground) - ground
-
온습도 센서 DAT : GPIO 4 (7번핀)
- 설치 과정
- nodejs 설치
- npm으로 node-red 설치
첫 시도는 sudo apt-get를 통해 설치했지만 비추천, 이유는 gpio nod를 읽어오지 못함.
최신버젼의 nodejs와 node-red 설치를 하려면 해결과정 참고
node-red가 설치 된 화면이다. 설치가 완료되면 한번 실행해주자.
- directory 주소창에 ~/.node-red를 작성하면 생성된 node-red 폴더를 볼수있음.
필요한 node-red 모듈이 설치되면 modules폴더 안에 해당 패키지 이름의 폴더가 생긴다!
- gpio 모듈 설치를 위해 npm을 사용했다.
- npm은 노드 패키지 매니저로 nodejs를 설치하면 사용할수있다.
http://127.0.0.1:1880/에 접속해서 node-red 플로우 창을 열었다.
- 명령어 node-red 를 입력하면 서버가 열리고 위 이미지처럼 주소를 알려준다.
- node-red는 플로우 페이지에서 drag & drop으로 하드웨어 기능을 제어할 수 있다.
- flow page에서 새로운 node를 추가하고 싶다면 햄버거모양의 네비게이션바를 클릭
- Manage palette (팔레트 관리)에 들어가서 검색하면 됨.
플로우를 위 사진처럼 구현함.
- 설정방법: inject payload를 booleon type으로 해야 0, 1에 따라 true, false로 불을 켜고 끄는 기능이 잘 동작합니다.
KakaoTalk_20241014_110823738.mp4
노드 conetcing 오류가 뜨면 빨간색 점이 찍히면서 0, 또는 1을 출력했을때 아래의 오류가 찍힌다.
14 Oct 02:46:06 - [error] [rpi-gpio out:4f9480a235312ea2] nrgpio python command not running
오류를 구글에 검색해서 해결법이 적힌 글을 발견! 참고글
"sudo apt-get update -y" 또는 "sudo apt-get upgrade -y" 를 사용하지 않았고
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
위 명령어로 최신버전의 node-js와 node-red를 설치했더니 gpio노드 정상작동했습니다
dht11 센서 정보를 노드로 불러오기는 실패함. /dev/gimem이 raspberry5에서 호환이안되서...
exec 노드로 파이썬 가상환경을 실행하고 온습도데이터를 json파싱함.
node-red 콘솔에 데이터가 출력되는 모습
debug 노드에 데이터가 출력되는 모습
import time
import board
import adafruit_dht
import json
def read_sensor():
try:
dhtDevice = adafruit_dht.DHT11(board.D4)
temperature_c = dhtDevice.temperature
temperature_f = temperature_c * (9 / 5) + 32
humidity = dhtDevice.humidity
return json.dumps({
"temperature_c": round(temperature_c, 1),
"temperature_f": round(temperature_f, 1),
"humidity": humidity
})
except RuntimeError as error:
return json.dumps({"error": str(error)})
except Exception as error:
return json.dumps({"error": f"Unexpected error: {str(error)}"})
finally:
dhtDevice.exit()
print(read_sensor())
브래드보드를 쓰지 않고 연결, 내부 풀업 저항을 사용함.