[XOLAR] 태양광 패널 작동 시연

2한나·2024년 11월 11일
0

XOLAR

목록 보기
4/4

태양광패널 작동

회로도

코드

import paho.mqtt.client as mqtt
import time
import json

from gpiozero import Motor

# GPIO 핀 설정 (모터 제어 핀 지정)
motor1 = Motor(forward=20, backward=21)
motor2 = Motor(forward=23, backward=24)

motor3 = Motor(forward=27, backward=17)
motor4 = Motor(forward=22, backward=6)

# MQTT 브로커 및 연결 설정
BROKER = "a3p9eizp6emyml-ats.iot.ap-northeast-2.amazonaws.com"  # AWS IoT > 연결 > 도메인 구성 > iot:Data-ATS
PORT = 8883
TOPIC = "$aws/things/aaa/shadow/update"

# 인증서 파일 경로 설정
CA_PATH = "/home/pi/certificates/AmazonRootCA1.pem"
CERT_PATH = "/home/pi/certificates/certificate.pem.crt"
KEY_PATH = "/home/pi/certificates/private.pem.key"

# MQTT 연결 콜백 함수 정의
def on_connect(client, userdata, flags, rc):
    print("MQTT Connect Success, Code:", rc)
    client.subscribe(TOPIC)

# MQTT 메시지 수신 콜백 함수 정의
def on_message(client, userdata, msg):
    payload = msg.payload.decode()
    print("Recieved Message:", payload)

    # 수신된 메시지를 JSON으로 파싱하여 비상 상태 추출
    data = json.loads(payload)
    emergency_status = data.get("state", {}).get("reported", {}).get("status")

    # 비상 상태에 따른 모터 동작
    if emergency_status == "STRONG_WIND":
        # 강풍 비상 상태
        print("Strong-Wind")
        motor1.backward(1.0)
        motor2.backward(1.0)
        motor3.backward(1.0)
        motor4.backward(1.0)
        time.sleep(100)
        motor1.stop()
        motor2.stop()
        motor3.stop()
        motor4.stop()
    elif emergency_status == "HEAVY_SNOW":
        # 폭설 비상 상태
        print("Heavy-Snow")
        motor1.backward(1.0)
        motor2.backward(1.0)
        motor3.forward(1.0)
        motor4.forward(1.0)
        time.sleep(100)
        motor1.stop()
        motor2.stop()
        motor3.stop()
        motor4.stop()
    else:
        # 정상 상태 - 추후 태양 추적 알고리즘을 사용해 태양을 따라 움직이도록 설정할 예정
        print("Normal")

# MQTT 클라이언트 설정 및 실행
client = mqtt.Client()
client.tls_set(CA_PATH, certfile=CERT_PATH, keyfile=KEY_PATH)
client.on_connect = on_connect
client.on_message = on_message

# MQTT 브로커에 연결하고, 무한 루프로 메시지 수신 대기
client.connect(BROKER, PORT)
client.loop_forever()

작동 영상

시연 영상 보러가기

트러블 슈팅

1. DNS 문제로 인한 인터넷 연결 X

문제상황

작동이 잘 되는 것을 확인하고 일주일 뒤 시연 영상을 촬영하기위해 라즈베리파이를 실행시키고 연결을 시도했다. 근데 잘 연결되던 인터넷이 갑자기 연결되지 않았고, 문제를 찾아보니 네트워크 설정이 초기화되어서 라즈베리파이가 인터넷에서 호스트 이름을 IP주소로 변환하는데 필요한 DNS 설정이 안돼 있던 것이었다.

시스템 재부팅 과정에서 네트워크 설정 파일인 /etc/resolv.conf가 자동으로 덮어씌어진 것으로 예상되었다.

해결방법

  1. /etc/resolv.conf 파일 생성 및 DNS 서버 설정

    아래 명령어로 /etc/resolv.conf 파일을 생성한다.

    sudo nano /etc/resolv.conf

    열리는 파일에 다음 내용을 추가한다.

    nameserver 8.8.8.8
    nameserver 8.8.4.4
  2. resolv.conf 파일 고정

    /etc/resolv.conf 파일이 자동으로 덮어씌워질 수 있기 때문에, 파일을 수정 불가능하게 만들어 고정한다.

    sudo chattr +i /etc/resolv.conf
  3. 네트워크 서비스 재시작

    위 설정을 적용하기 위해 네트워크 서비스를 재시작한다.

    sudo systemctl restart networking

0개의 댓글