프롬프트
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()