• Skip to primary navigation
  • Skip to main content

IoTmaker

사물인터넷에 대한 모든 것 여기서 해결하셔요!

  • 홈
  • 책:마이크로파이썬을 활용한 사물인터넷
  • 책:따라 하면서 배우는 사물인터넷
  • 온라인 교육 코스
  • 새로운 소식
  • 의견보내기
  • 내 수강정보
  • 로그인
  • 회원가입

AI 프롬프트 실습 9-5: DS18B20Sensor 클래스 만들기

마이크로파이썬 > AI 프롬프트

프롬프트

file: ai-9-5-DS18B20Sensor-클래스-만들기.md

  프롬프트 영역으로 마우스를 옮기고 Copy 버튼을 누르면 클립보드에 프롬프트의 내용이 복사됩니다.
(여기에 'ai-9-1-센서-클래스-템플릿.md'의 내용을 붙여 넣으세요)

components:
- sensor_calss:
    센서_모델: DS18B20
    클래스_이름: DS18B20Sensor
    pin_type: pin_gpio
    key_1: Temperature, 소숫점 1자리
    라이브러리: |
        특이사항 없음.

def main():
    import pinno as P
    from parse import Parse

    sensor = DS18B20Sensor(pin_gpio=P.DS18B20)  # DS18B20 센서를 특정 GPIO에 연결함.    
    while True:
        data = sensor.read()
        print(data)

        p = Parse(data)

        for i in range(len(p.names)):
            print(f'name: {p.names[i]}, Id: {p.ow_ids[i]}, {p.ow_keys[i]}: {p.ow_values[i]}')

        time.sleep_ms(5000)

if __name__ == '__main__':
    main()

AI가 만든 코드

프로그램: \lib\ds18b20sensor.py

from machine import Pin
import time
import onewire
import ds18x20
import binascii

# file: ds18b20sensor.py
class DS18B20Sensor:
    """
    DS18B20 온도 센서 클래스.

    :param pin_gpio: DS18B20 센서를 연결할 GPIO 핀을 지정합니다.
    :param ser: 센서의 고유 식별자 (선택 사항)
    """

    def __init__(self, *, pin_gpio: int, ser=None) -> None:
        """
        DS18B20 센서를 초기화합니다.

        :param pin_gpio: DS18B20 센서를 연결할 GPIO 핀
        :param ser: 센서의 고유 식별자 (선택 사항)
        """
        # pin_gpio를 사용해 Pin 인스턴스를 만듭니다.
        self.pin_or_bus = Pin(pin_gpio, Pin.IN)

        # OneWire 인스턴스 생성
        self.ow = onewire.OneWire(self.pin_or_bus)

        # DS18X20 센서 인스턴스 생성
        self.sensor_instance = ds18x20.DS18X20(self.ow)

        # 센서 모델 설정
        self._model = 'DS18B20'
        self._model_ser = f"{self._model}_{ser}" if ser else self._model

        # 센서 데이터 초기화
        self._sensor_id = self.ow.scan()  # OneWire 버스에 연결된 센서 주소 리스트
        self._sensor_count = len(self._sensor_id)  # 연결된 센서의 수

        # 디버깅: 감지된 센서의 주소를 출력합니다.
        print(f"Detected DS18B20 sensors: {self._sensor_id}")

        self._names = []
        self.name_first = True
        self._keys = ['Temperature']  # 첫 번째 key는 'Temperature'
        self._values = []  # 센서에서 읽은 값
        self._sensor_id_hex = []  # DS18B20 센서의 고유 ID HEX 값
        self._dict = {}  # 센서 데이터를 저장할 딕셔너리

        try:
            if self._sensor_count == 0:
                print("No DS18B20 sensors found!")
                self._values = [None]
            else:
                for sensor_id in self._sensor_id:
                    self._sensor_id_hex.append(self.hex_id(sensor_id))  # 센서의 HEX ID 생성
        except OSError as e:
            print("센서 연결 실패:", e)
            self._values = [None]  # 센서 연결 실패 시 값을 None으로 처리

    def make_data(self):
        """
        센서에서 데이터를 읽고 처리하는 함수입니다.
        """
        try:
            self.sensor_instance.convert_temp()  # 온도 변환 시작
            time.sleep_ms(750)  # DS18B20 센서의 온도 변환 시간 (750ms 대기)

            # 온도 읽기
            for sensor_id in self._sensor_id:
                temperature = self.sensor_instance.read_temp(sensor_id)
                self._values.append(round(temperature, 1))  # 소숫점 1자리로 반올림
        except OSError as e:
            self._values = [None]  # 오류 발생 시 None 처리

    def make_dict(self):
        """
        센서 데이터를 딕셔너리 형태로 변환하는 함수입니다.
        """
        if self._model == 'DS18B20':
            for i in range(self._sensor_count):
                sensor_data = {
                    "Id": self._sensor_id_hex[i],  # 센서 고유 ID
                    self._keys[0]: self._values[i]  # 'Temperature'에 해당하는 센서 값
                }
                this_name_ser = self._model_ser + f"_{i+1}" if self._sensor_count > 1 else self._model_ser
                self._dict[this_name_ser] = sensor_data
        else:
            sensor_data = {}
            for i in range(len(self._keys)):
                sensor_data[self._keys[i]] = self._values[i]
            self._dict[self._model_ser] = sensor_data

    def read(self):
        """
        센서 데이터를 읽고, 딕셔너리 형태로 반환합니다.
        """
        self._values = []
        self.make_data()  # 센서 데이터를 먼저 읽음
        self.make_dict()  # 데이터를 딕셔너리 형식으로 정리

        # 온도 단위 처리
        self._dict['TempUnit'] = 'C'  # 섭씨 단위로 설정 (기본값 C)

        return self._dict

    def hex_id(self, id):
        """
        센서의 고유 ID를 HEX 형식으로 변환합니다.
        """
        return binascii.hexlify(id).decode('utf-8')

def main():
    import pinno as P
    from parse import Parse

    # DS18B20 센서를 GPIO에 연결
#     sensor = DS18B20Sensor(pin_gpio=P.DS18B20_IN)
    sensor = DS18B20Sensor(pin_gpio=P.DS18B20_IN)           # L3,L4

    while True:
        data = sensor.read()  # 센서 데이터를 읽음
        print(data)  # 센서 데이터 출력

        p = Parse(data)  # Parse 객체를 사용하여 데이터 파싱

        # 파싱된 각 센서 정보를 출력
        for i in range(len(p.names)):
            print(f'name: {p.names[i]}, Id: {p.ow_ids[i]}, {p.ow_keys[i]}: {p.ow_values[i]}')

        time.sleep_ms(5000)  # 5초 대기 후 반복

if __name__ == '__main__':
    main()

Copyright © 2025 ·로그인