esp32 및 esp8266을 갖춘 Dallas ds18b20: 모든 OneWire 토폴로지, 긴 스텁 및 추가 장치
Dallas DS18B20 온도 센서는 다양한 응용 분야에서 온도 측정에 널리 사용되는 다재다능한 장치입니다. 강력한 ESP32 마이크로컨트롤러 또는 ESP8266과 함께 사용하면 여러 개의 DS18B20 센서를 단일 회로에 연결하고 장거리 연결도 가능합니다.

esp32가 있는 Dallas ds18b20: 모든 OneWire 토폴로지, 긴 스텁 및 여러 장치
이 글에서는 OneWire 프로토콜을 사용하여 여러 Dallas DS18B20 온도 센서와 통신하는 방법과 이를 ESP32 또는 ESP8266 보드와 연결하는 방법을 살펴봅니다. 또한 긴 OneWire 회선과 여러 장치를 사용할 때 발생할 수 있는 문제를 해결하는 방법도 다룹니다.
취미인이든, 엔지니어이든, DIY 애호가이든, 이 글은 Dallas DS18B20과 ESP32, esp8266을 시작하는 데 필요한 포괄적인 가이드를 제공합니다.
특징
데이터시트
핀아웃
OneWire 네트워크: 소개
OneWire 네트워크 성능 요소
OneWire 네트워크 토폴로지
-선형 위상수학
-스텁 토폴로지
-스타 토폴로지
스위치드 네트워크
-OneWire 네트워크 제한 사항
-기생충 모드 문제
-임피던스 매칭 분배
문제 해결을 위한 풀업 저항 선택
배선
ESP32
일반 모드
일반 모드 여러 장치
기생충 모드
기생 모드 다중 장치
ESP8266
일반 모드
일반 모드 다중 센서
기생충 모드
기생 모드 다중 센서
도서관
지원되는 장치
문제 해결
DS18B20(정상/기생)에 전원 공급
기생충 모드를 위한 강력한 풀업
라이브러리 크기를 줄이세요
암호
네트워크에 연결된 모든 센서 검색
주소 배열에서 정보와 온도를 가져옵니다.
센서 인덱싱 및 온도 얻기
감사해요
특징
- 고유한 1-Wire® 인터페이스는 통신을 위해 단 하나의 포트 핀만 필요합니다.
- 통합 온도 센서와 EEPROM으로 구성 요소 수 감소
- -55°C ~ +125°C(-67°F ~ +257°F)의 온도 측정
- -10°C ~ +85°C에서 ±0.5°C 정확도
- 9비트에서 12비트까지 프로그래밍 가능한 해상도
- 외부 구성 요소 필요 없음
- 기생 전력 모드는 작동을 위해 2개의 핀(DQ 및 GND)만 필요합니다.
- 멀티드롭 기능으로 분산형 온도 감지 애플리케이션을 간소화합니다.
- 각 장치에는 온보드 ROM에 저장된 고유한 64비트 직렬 코드가 있습니다.
- 프로그래밍된 한계를 벗어난 온도를 가진 장치를 식별하는 알람 검색 명령이 포함된 유연한 사용자 정의 가능 비휘발성(NV) 알람 설정
- 8핀 SO(150밀), 8핀 µSOP 및 3핀 TO-92 패키지로 제공
데이터시트
핀아웃

달라스 ds18b20 핀아웃
센서에는 더 많은 변형이 있지만 배선은 동일하게 유지됩니다.
GND : GND에 연결합니다.
DATA : 단선 데이터 버스입니다.
VCC : 전원 공급 장치(3, 3~5V), 하지만 기생 모드에서는 GND에 연결할 수 있습니다.
여기서 AliExpress에서 센서를 구매할 수 있습니다
OneWire 네트워크: 소개
네트워크를 구축할 때는 회로에 흐르는 전류를 측정하는 데 사용되는 전류 감지 증폭기(CSA)에 주의를 기울여야 합니다. CSA는 전력 관리, 모터 제어, 배터리 모니터링 등 다양한 분야에서 이점을 제공합니다. CSA에는 하이사이드 증폭기와 로우사이드 증폭기를 포함한 다양한 유형이 있으며, 설계에 사용되는 아키텍처도 다양합니다.
입력 오프셋 전압, 대역폭, 공통 모드 제거비(CMRR)와 같은 CSA의 주요 사양 및 성능 매개변수에 대해서는 자세히 다루지 않습니다. 하지만 다양한 유형의 전류 감지 저항과 특정 애플리케이션에 적합한 저항을 선택하는 방법에 대해서는 설명하겠습니다.
CSA 사용에 대한 실질적인 고려 사항, 즉 레이아웃 및 접지 기술, 잡음 감소, 온도 보상 등에 대해 논의합니다. 또한, 간단한 전압-전류 변환, 차동 전압 감지, 션트 기반 전류 감지 등 CSA의 다양한 응용 회로를 제시합니다.
OneWire 네트워크 성능 요소
1-Wire 네트워크 성능에서 중요한 두 가지 지표는 반경과 무게입니다. 1-Wire 네트워크의 반경은 마스터와 가장 먼 슬레이브 사이의 와이어 거리이며 미터 단위로 측정됩니다. 1-Wire 네트워크의 무게는 네트워크 내 와이어의 총 길이이며, 미터 단위로 측정됩니다.
예를 들어, 10m, 20m, 30m의 세 가지 분기가 있는 스타 구성의 1-Wire 네트워크는 반경이 30m(마스터에서 가장 먼 슬레이브까지의 거리)이고 가중치는 60m(네트워크의 총 와이어 길이, 즉 10m + 20m + 30m)입니다.
일반적으로 네트워크의 무게는 케이블의 상승 시간을 제한하는 반면, 반경은 가장 느린 신호 반사 시간을 결정합니다. 이 정보는 1-Wire 네트워크의 효율적이고 안정적인 작동을 보장하기 위해 네트워크 설계 및 문제 해결에 필수적입니다.
OneWire 네트워크 토폴로지
OneWire 네트워크는 구조적으로 상당히 "자유형"이지만 일반적으로 1-Wire 슬레이브의 분포와 상호 연결 와이어의 구성을 기반으로 몇 가지 일반화된 범주에 속합니다.
선형 위상수학

OneWire 네트워크: 선형 토폴로지
1-Wire 버스는 마스터에서 시작하여 가장 먼 슬레이브 장치까지 이어지는 단일 쌍입니다. 다른 슬레이브들은 3m 미만의 미미한 분기 또는 "스텁"을 통해 1-Wire 버스에 연결됩니다.
스텁 토폴로지

OneWire 네트워크: 스텁 토폴로지
1-Wire 버스는 마스터에서 시작하여 가장 먼 슬레이브까지 이어지는 단일 메인 라인입니다. 다른 슬레이브들은 3m 이상의 브랜치 또는 스터브를 통해 메인 라인에 연결됩니다.
스타 토폴로지

OneWire 네트워크: 스타 토폴로지
1-Wire 버스는 마스터 측 또는 그 근처에서 분리되어 다양한 길이의 여러 갈래로 뻗어 있습니다. 각 갈래의 끝부분이나 그 주변에는 슬레이브 장치가 있습니다.
테스트 결과, 언스위칭 스타형 네트워크 토폴로지(즉, 마스터에서 여러 분기가 갈라지는 토폴로지)가 신뢰성을 확보하기 가장 어려운 것으로 나타났습니다. 여러 분기의 접합부는 임피던스가 매우 부정합되어 있으며, 한 분기 끝에서 반사되는 전력은 네트워크 반경이 아닌 네트워크 무게에 거의 해당하는 거리를 이동하여 데이터 오류를 유발할 수 있습니다. 이러한 이유로 언스위칭 스타형 토폴로지는 권장되지 않으며, 성능에 대한 보장도 없습니다.
서로 다른 토폴로지가 혼합되면 네트워크의 실질적인 한계를 파악하기가 훨씬 더 어려워집니다. 일반적으로 설계자는 이러한 경우 가장 보수적인 기준을 적용해야 합니다.
스위치드 네트워크
네트워크의 무게와 반경을 늘리지 않고도 복잡성을 키울 수 있도록, 네트워크는 한 번에 하나씩 전자적으로 켜지는 섹션으로 나뉩니다.
저임피던스 단일 전원 아날로그 스위치를 사용하면 네트워크는 물리적으로는 하나의 토폴로지와 유사하지만 전기적으로는 다른 토폴로지와 유사할 수 있습니다. 즉, 각 분기에 스위치가 있는 스타 구성은 실제로는 선형 토폴로지와 유사합니다.

OneWire 네트워크: switched
이 경우, 언제든지 하나의 브랜치만 활성화됩니다. 위의 예는 반경 150m, 가중치 450m의 스타 토폴로지 네트워크처럼 보입니다. 그러나 각 스위칭 경로를 개별적으로 고려하면 네트워크는 실제로 선형 토폴로지이며 가중치는 150m에 불과합니다. 일반적으로 비스위칭 네트워크에 대한 논의는 스위칭 네트워크의 각 세그먼트에 적용될 수 있습니다.
OneWire 네트워크 제한 사항
OneWire 네트워크의 최대 반경과 무게는 여러 요인에 의해 결정됩니다. 이러한 요인 중 일부는 제어할 수 있지만, 다른 요인은 제어할 수 없습니다. 마스터-엔드 인터페이스는 OneWire 네트워크의 허용 크기를 결정하는 데 중요한 역할을 합니다. 마스터-엔드 인터페이스는 케이블과 슬레이브의 무게를 견딜 수 있는 충분한 구동 전류를 공급하고, 사양에 부합하고 네트워크의 충전 및 방전 시간에 최적화된 타이밍으로 OneWire 파형을 생성하며, 네트워크에 적합한 임피던스 정합을 제공해야 합니다.
1-Wire 네트워크의 반경은 파형 반사 타이밍, 케이블에서 발생하는 시간 지연, 케이블 저항, 신호 레벨 저하 등 여러 요인에 의해 제한됩니다. 네트워크의 무게는 1-Wire 프로토콜을 충족할 만큼 케이블이 얼마나 빠르게 충전 및 방전될 수 있는지에 따라 제한됩니다.
간단한 저항 풀업 회로의 무게 제한은 약 200m입니다. 이와 대조적으로, 로직 제어 하에서 더 높은 전류를 제공하는 능동 풀업 회로를 갖춘 정교한 1-Wire 마스터 설계를 사용하면 무게 제한을 500m 이상으로 확장할 수 있습니다.
반경은 타이밍 및 케이블 저항과 같은 요인에 의해 제한되고, 무게는 케이블의 충전 및 방전 속도에 따라 제한됩니다. 액티브 풀업은 1-Wire 네트워크의 무게 제한을 단순 저항 풀업의 한계를 넘어 확장할 수 있습니다.

ESP8266 Wemos D1 다중 DS18B20 온도 센서
기생충 모드 문제
1-Wire 통신 프로토콜은 통신을 원활하게 할 뿐만 아니라 슬레이브에 작동 전력을 제공합니다. 슬레이브는 버스 전압이 내부 에너지 저장 커패시터 전압보다 높을 때 버스에서 전력을 공급받습니다.
그러나 슬레이브가 너무 많은 네트워크에서는 마스터가 전달하는 전류가 슬레이브의 작동 전압을 유지하기에 충분하지 않아 데이터에 따라 간헐적으로 오류가 발생할 수 있습니다.

esp32: 강력한 풀업을 사용한 기생 모드의 ds18b20 배선 스키마
기생 전원에 대한 최악의 시나리오는 마스터가 발행한 긴 0비트 시퀀스입니다. 버스가 대부분의 시간을 낮은 상태로 보내고 슬레이브를 재충전할 기회가 거의 없기 때문입니다.
각 슬레이브의 전압이 떨어지면 슬레이브가 버스를 구동하는 능력이 감소하고 결국 슬레이브가 응답하지 않는 재설정 상태로 이어집니다.
슬레이브가 다시 충분한 작동 전압을 받으면 존재 펄스를 발생시켜 다른 버스 활동을 손상시킬 수 있습니다.
가능한 해결책은 위 이미지에 나와 있습니다. 특히, 이는 DS18B20 온도 센서에 사용됩니다.
1-Wire 버스는 온도 변환 후 최대 10µs 이내에 강한 풀업으로 전환되어야 하며, 변환 또는 데이터 전송 중에는 풀업에 의해 버스가 High 상태를 유지해야 합니다. 풀업이 활성화된 동안에는 1-Wire 버스에서 다른 작업을 수행할 수 없습니다.
DS18B20은 그림과 같이 외부 전원 공급 장치를 VDD 핀에 연결하는 기존 방식으로도 전원을 공급할 수 있습니다. 이 방법의 장점은 MOSFET 풀업이 필요하지 않고, 온도 변환 시간 동안 1-Wire 버스가 다른 트래픽을 전송할 수 있다는 것입니다.
임피던스 매칭 분배
OneWire 버스 설계는 간단하고 저렴하며, 일반적으로 추가 구성 요소가 필요하지 않습니다.
그러나 스텁이 버스에 연결되면 분기점에서 임피던스 불일치가 발생하여 네트워크의 다른 슬레이브에 간섭을 일으키는 반사가 발생할 수 있습니다.
이 문제를 완화하기 위해 스터브와 직렬로 연결된 저항기를 사용하면 불일치의 심각성과 반사 에너지의 진폭을 줄일 수 있습니다.

OneWire 네트워크: 분산 임피던스 매칭
이 개념을 가장 성공적으로 구현한 방법은 스터브가 메인 트렁크에 연결되는 각 지점(5V 논리 레벨)에 150.5개의 저항을 사용하는 것입니다. 이렇게 하면 연결 지점의 부정합이 약 20% 감소하고 그로 인한 반사가 약 40% 감쇠됩니다. 그러나 추가된 저항으로 인해 잡음 내성이 약 80%까지 저하될 수 있으므로 주의가 필요합니다.
반면, 100½ 저항 값은 좋은 성능을 보였으며 노이즈 면역성을 크게 저하시키지 않았습니다.
문제 해결을 위한 풀업 저항 선택
네트워크를 검색해 본 결과, 3.3V 로직을 사용하는 네트워크에서 거리를 개선하는 몇 가지 흥미로운 솔루션을 찾았습니다.
DS18B20을 사용하는 중거리 네트워크에서 짧은 케이블로 작업했는데, 5M CAT3 케이블에서는 실패했습니다. 문제를 해결하기 위해 누군가가 케이블 양쪽 끝의 데이터 라인과 직렬로 80옴(반무작위로 선택된 낮은 값) 저항을 추가했는데, 이로 인해 슬루율이 낮아지고 문제가 해결되었습니다.
약 40m 길이의 비차폐 CAT5 케이블과 DS18B20 센서 7개를 사용했습니다. GROUND는 서로 다른 꼬임선 2개에 연결되어 있습니다. 이 꼬임선의 마지막 선은 데이터와 전원에 사용됩니다. GPIO4와 3.3V 사이에는 2.2kΩ 풀업 저항이 있습니다. 제조사는 마지막 두 센서의 데이터를 와이어에 맞게 보정하지만, 가운데 센서 하나는 항상 85000을 표시합니다. 저는 풀업 저항을 4.7kΩ에서 2.2kΩ으로 바꾸자 작동하기 시작했습니다.
배선
One-Wire 라이브러리는 모든 마이크로컨트롤러 의 표준이므로 이 장치는 여러 마이크로컨트롤러와 함께 사용할 수 있습니다. 단일 센서의 연결은 이미 설명했으므로, 이제 여러 센서를 연결하고 관리해 보겠습니다.
센서를 하나만 연결해야 하는 경우 이전 문서인 " ESP32 및 ESP8266을 탑재한 Dallas DS18B20: 소개 및 기생 모드"를 참조하세요.
ESP32
가장 흔한 ESP32 프로토타입 보드 중 하나의 핀아웃은 다음과 같습니다.

ESP32 DOIT 개발 키트 v1 핀아웃
여기에서 esp32 ESP32 Dev Kit v1 - TTGO T-Display 1.14 ESP32 - NodeMCU V3 V2 ESP8266 Lolin32 - NodeMCU ESP-32S - WeMos Lolin32 - WeMos Lolin32 mini - ESP32-CAM 프로그래머 - ESP32-CAM 번들 - ESP32-WROOM-32 - ESP32 - S를 선택할 수 있습니다.
일반 모드
일반 모드에서는 3.3V 전원선을 사용하므로 연결은 다음과 같습니다.

방수 DS18B20을 탑재한 ESP32: 브레드보드 배선
연결은 매우 간단합니다.
| esp32 | ds18b20 |
| GND | GND |
| 3.3v | VCC |
| D22 pulled-up | DATA |
일반 모드 여러 장치
이제 ds18b20 5의 선형 토폴로지를 사용한 연결 스키마

esp32: 선형 토폴로지의 여러 ds18b20
또는 별 모양의 위상수학에서

esp32: 스타 토폴로지의 여러 ds18b20
기생충 모드
기생 모드에서는 센서의 VCC 라인에도 GND를 넣고, 데이터 라인에서 전원을 공급받습니다.

기생 모드에서 ds18b20을 사용한 esp32: 브레드보드 배선
| esp32 | ds18b20 |
| GND | GND |
| GND | VCC |
| D22 pulled-up | DATA |
기생 모드 다중 장치
선형 위상수학에서도 같은 일이 일어납니다.

esp32: 선형 토폴로지의 다중 기생충 ds18b20
그리고 시작 토폴로지에서.

esp32: 스타 토폴로지의 다중 기생충 ds18b20
ESP8266
일반 모드

WeMos d1 esp8266 및 ds18b20 배선
| esp8266 | ds18b20 |
| GND | GND |
| 3.3v | VCC |
| D2 pulled-up | DATA |
일반 모드 다중 센서

esp8266 및 ds18b20: 선형 토폴로지의 다중 센서
기생충 모드

기생충의 esp8266 및 ds18b20
| esp8266 | ds18b20 |
| GND | GND |
| GND | VCC |
| D2 pulled-up | DATA |
기생 모드 다중 센서

esp8266 및 ds18b20: 선형 토폴로지의 기생충에 있는 여러 센서
라이브러리
우선, 이 센서는 One-Wire 프로토콜을 사용하므로 OneWire 라이브러리를 추가해야 합니다.

모든 플랫폼에는 이 프로토콜이 있습니다. 다음에는 여러 센서의 사용을 소개할 때 이 프로토콜에 대해 더 자세히 설명하겠습니다.

Arduino IDE: 라이브러리 관리자의 OneWire 라이브러리
그런 다음 프로토콜과 센서 기능을 구현하는 라이브러리를 설치해야 합니다.

저는 가장 널리 사용되는 DallasTemperature(과거에는 Dallas, 현재는 Maxim)를 선택했습니다.

Arduino IDE: libreria DallasTemperature per il ds18b20 dal 라이브러리 관리자
지원되는 장치
저장소에 설명된 대로 이 라이브러리는 다음 장치를 지원합니다.
- DS18B20
- DS18S20 (이 기기에는 몇 가지 문제가 있습니다)
- DS1822
- DS1820
- MAX31820
- MAX31850
1-Wire 데이터 라인과 VCC 사이에 약 4.7KOhm의 풀업 저항이 필요합니다. DS18B20을 사용하는 경우 기생 모드를 사용할 수 있으며, 설명한 대로 VCC를 GND에 연결할 수 있습니다.
문제 해결
온도 변환 문제(결과가 -85°C)가 발생하는 경우, 강력한 풀업 회로가 필요할 수 있습니다. DS18B20 데이터시트 (7페이지) 의 DS18B20 전원 공급 섹션을 참조하여 생성자를 사용하십시오 .
DallasTemperature(OneWire*, uint8_t)
DS18B20(정상/기생)에 전원 공급
DS18B20은 VDD 핀의 외부 전원으로 전원을 공급받거나, "기생 전원" 모드로 작동할 수 있습니다. 이 모드에서는 DS18B20이 로컬 외부 전원(VDD를 GND에 연결) 없이도 작동할 수 있습니다. DS18B20은 버스가 High일 때 DQ 핀을 통해 1-Wire 버스에서 전원을 "훔칩니다". 훔친 전하는 버스가 High일 때 DS18B20에 전원을 공급하고, 일부 전하는 기생 전원 커패시터 (CPP)에 저장되어 버스가 Low일 때 전원을 공급합니다.

기생 모드에서 ds18b20이 있는 esp32: 스키마
하지만 DS18B20이 온도 변환을 수행하거나 스크래치패드 메모리에서 EEPROM으로 데이터를 복사할 때, 동작 전류는 최대 1.5mA까지 높아질 수 있습니다 . 이 전류는 약한 1-Wire 풀업 저항에 허용할 수 없는 전압 강하를 유발할 수 있으며, CPP가 공급할 수 있는 전류보다 더 큰 전류입니다.
기생충 모드를 위한 강력한 풀업
DS18B20에 충분한 전류 공급을 보장하려면 온도 변환이 발생하거나 스크래치패드에서 EEPROM으로 데이터가 복사될 때마다 1-Wire 버스에 강한 풀업을 제공해야 합니다. 이는 MOSFET을 사용하여 버스를 레일로 직접 연결함으로써 구현할 수 있습니다.

esp32: 강력한 풀업을 사용한 기생 모드의 ds18b20 배선 스키마
1-Wire 버스는 온도 변환 후 최대 10µs 이내에 강한 풀업으로 전환되어야 하며, 변환 또는 데이터 전송 중에는 풀업에 의해 버스가 High 상태를 유지해야 합니다. 풀업이 활성화된 동안에는 1-Wire 버스에서 다른 작업을 수행할 수 없습니다.
DS18B20은 그림과 같이 외부 전원 공급 장치를 VDD 핀에 연결하는 기존 방식으로도 전원을 공급할 수 있습니다. 이 방법의 장점은 MOSFET 풀업이 필요하지 않고, 온도 변환 시간 동안 1-Wire 버스가 다른 트래픽을 전송할 수 있다는 것입니다.
DS18B20은 이러한 온도에서 발생할 수 있는 높은 누설 전류로 인해 통신을 유지하지 못할 수 있으므로, +100°C 이상의 온도에서는 기생 전원을 사용하는 것이 권장되지 않습니다.
라이브러리 크기를 줄이세요
REQUIRESNEWa 와 definition을 포함했습니다 REQUIRESALARMS. 코드를 간소화하려면 다음 중 하나를 사용하여 자유롭게 사용할 수 있습니다. DallasTemperature.h의 맨 위에
#define REQUIRESNEW
또는
#define REQUIRESALARMS
Code
여러 장치를 사용하는 경우 각 장치를 명확하게 식별하는 것이 중요합니다. ds18b20에는 UUID로 사용할 수 있는 내부 주소가 있다는 점을 기억해야 합니다.
esp8266의 경우 핀 22를 D2로만 변경하거나 직접 4로 변경해야 합니다.
네트워크에 연결된 모든 센서 검색
다음은 핀 간격에 연결된 모든 OneWire 장치를 검색하고 ds18b20을 관리하는 데 사용할 수 있는 주소 목록을 생성하는 간단한 예입니다.
/**
* OneWire Library example
* Find all device (select starting end ending pin)
*
* Renzo Mischianti <www.mischianti.org>
*/
#define STARTING_PIN 22
#define ENDING_PIN 22
uint8_t findDevices(int pin);
#include <OneWire.h>
void setup()
{
Serial.begin(115200);
Serial.println("//\n// Start oneWire search \n//");
for (uint8_t pin = STARTING_PIN; pin <= ENDING_PIN; pin++)
{
findDevices(pin);
}
Serial.println("\n//\n// End oneWire search \n//");
}
void loop()
{
}
uint8_t findDevices(int pin)
{
OneWire ow(pin);
uint8_t address[8];
uint8_t count = 0;
if (ow.search(address))
{
Serial.print("\nDeviceAddress pin");
Serial.print(pin, DEC);
Serial.println("[] = {");
do {
count++;
Serial.print(" {");
for (uint8_t i = 0; i < 8; i++)
{
Serial.print("0x");
if (address[i] < 0x10) Serial.print("0");
Serial.print(address[i], HEX);
if (i < 7) Serial.print(", ");
}
Serial.println(" },");
} while (ow.search(address));
Serial.println("};");
Serial.print("// nr devices found: ");
Serial.println(count);
}
return count;
}
제 경우, 직렬 출력은 다음과 같습니다.
//
// Start oneWire search
//
DeviceAddress pin22[] = {
{0x28, 0xFF, 0x64, 0x0E, 0x6C, 0x63, 0xD0, 0x15 },
{0x28, 0xFF, 0x64, 0x0E, 0x6C, 0x6F, 0x7A, 0x89 },
{0x28, 0xFF, 0x64, 0x0E, 0x6D, 0x64, 0x7F, 0x3E },
{0x28, 0xFF, 0x64, 0x0E, 0x6D, 0x5C, 0x1A, 0x3F },
{0x28, 0xFF, 0x64, 0x0E, 0x6D, 0x5D, 0x66, 0xA0 },
};
// nr devices found: 5
//
// End oneWire search
//
5개의 ds18b20을 올바르게 찾아 주소 배열을 생성했습니다.
esp8266의 경우 결과는 다음과 같습니다.
// Start oneWire search
//
DeviceAddress pin4[] = {
{0x28, 0xFF, 0x64, 0x0E, 0x6C, 0x63, 0xD0, 0x15 },
{0x28, 0xFF, 0x64, 0x0E, 0x6C, 0x6F, 0x7A, 0x89 },
{0x28, 0xFF, 0x64, 0x0E, 0x6D, 0x64, 0x7F, 0x3E },
{0x28, 0xFF, 0x64, 0x0E, 0x6D, 0x5C, 0x1A, 0x3F },
{0x28, 0xFF, 0x64, 0x0E, 0x6D, 0x5D, 0x66, 0xA0 },
};
// nr devices found: 5
//
// End oneWire search
//
주소 배열에서 정보와 온도를 가져옵니다.

ESP32 WeMos Lolin32 다중 DS18B20 온도 센서
이전 스케치의 배열을 사용하여 온도를 읽는 스케치를 만들어 보겠습니다.
/**
* From a list of thermostat address
* generated with the previous search sketch
* we are going to get the
* temperature of every device
*
* by Renzo Mischianti <www.mischianti.org>
*
* https://mischianti.org
*
*/
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 22
#define ONE_WIRE_BUS 22
#define TEMPERATURE_PRECISION 9
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// The array generated from the search sketch
DeviceAddress pin22[] = {
{0x28, 0xFF, 0x64, 0x0E, 0x6C, 0x63, 0xD0, 0x15 },
{0x28, 0xFF, 0x64, 0x0E, 0x6C, 0x6F, 0x7A, 0x89 },
{0x28, 0xFF, 0x64, 0x0E, 0x6D, 0x64, 0x7F, 0x3E },
{0x28, 0xFF, 0x64, 0x0E, 0x6D, 0x5C, 0x1A, 0x3F },
{0x28, 0xFF, 0x64, 0x0E, 0x6D, 0x5D, 0x66, 0xA0 },
};
void setup(void)
{
// start serial port
Serial.begin(115200);
Serial.println("Dallas Temperature IC Control ");
// Start up the library
sensors.begin();
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" devices.");
// report parasite power requirements
Serial.print("Parasite power is: ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");
// set the temperature accurancy
for (int i = 0; i < 5; i++) {
// set the resolution to 9 bit per device
sensors.setResolution(pin22[i], TEMPERATURE_PRECISION);
}
}
// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
// zero pad the address if necessary
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if(tempC == DEVICE_DISCONNECTED_C)
{
Serial.println("Error: Could not read temperature data");
return;
}
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(" Temp F: ");
Serial.print(DallasTemperature::toFahrenheit(tempC));
}
/*
Main function, calls the temperatures in a loop.
*/
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures();
Serial.println("DONE");
for (int i = 0; i < 5; i++) {
// print the device information
Serial.print("Device Address: ");
printAddress(pin22[i]);
Serial.print(" of ");
Serial.print(i);
Serial.print(" sensor -> ");
printTemperature(pin22[i]);
Serial.println();
}
delay(2000);
}
직렬 출력의 결과:
Dallas Temperature IC Control
Locating devices...Found 5 devices.
Parasite power is: OFF
Requesting temperatures...DONE
Device Address: 28FF640E6C63D015 of 0 sensor -> Temp C: 21.12 Temp F: 70.03
Device Address: 28FF640E6C6F7A89 of 1 sensor -> Temp C: 21.37 Temp F: 70.47
Device Address: 28FF640E6D647F3E of 2 sensor -> Temp C: 21.25 Temp F: 70.25
Device Address: 28FF640E6D5C1A3F of 3 sensor -> Temp C: 21.25 Temp F: 70.25
Device Address: 28FF640E6D5D66A0 of 4 sensor -> Temp C: 21.19 Temp F: 70.14
Requesting temperatures...DONE
Device Address: 28FF640E6C63D015 of 0 sensor -> Temp C: 21.19 Temp F: 70.14
Device Address: 28FF640E6C6F7A89 of 1 sensor -> Temp C: 21.37 Temp F: 70.47
Device Address: 28FF640E6D647F3E of 2 sensor -> Temp C: 21.25 Temp F: 70.25
Device Address: 28FF640E6D5C1A3F of 3 sensor -> Temp C: 21.25 Temp F: 70.25
Device Address: 28FF640E6D5D66A0 of 4 sensor -> Temp C: 21.19 Temp F: 70.14
센서 인덱싱 및 온도 얻기
그다지 현실적인 해결책은 아니지만, 센서를 인덱싱하여 온도를 구하는 것입니다. 이 방법은 어떤 센서가 0, 1 등으로 표시되는지 알 수 없기 때문에 그다지 유용하지 않습니다.
단순화를 위해 센서 수를 4개로 줄였습니다.
/**
* Indexing thermometer and read the temperature
*
* by Renzo Mischianti <www.mischianti.org>
*
* https://mischianti.org
*/
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 22
#define ONE_WIRE_BUS 22
#define TEMPERATURE_PRECISION 9
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
DeviceAddress firstThermometer, secondThermometer, thirdThermometer, fourthThermometer;
void setup(void)
{
// start serial port
Serial.begin(115200);
Serial.println("Dallas Temperature IC Control Library Demo");
// Start up the library
sensors.begin();
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" devices.");
// report parasite power requirements
Serial.print("Parasite power is: ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");
// assigns the first address found to insideThermometer
if (!oneWire.search(firstThermometer)) Serial.println("Unable to find 1 address for insideThermometer");
// assigns the second address found to insideThermometer
if (!oneWire.search(secondThermometer)) Serial.println("Unable to find 2 address for insideThermometer");
// assigns the third address found to insideThermometer
if (!oneWire.search(thirdThermometer)) Serial.println("Unable to find 3 address for insideThermometer");
// assigns the fourth address found to insideThermometer
if (!oneWire.search(fourthThermometer)) Serial.println("Unable to find 4 address for insideThermometer");
// show the addresses we found on the bus
Serial.print("Device 0 Address: ");
printAddress(firstThermometer);
Serial.println();
Serial.print("Device 1 Address: ");
printAddress(secondThermometer);
Serial.println();
Serial.print("Device 2 Address: ");
printAddress(thirdThermometer);
Serial.println();
Serial.print("Device 3 Address: ");
printAddress(fourthThermometer);
Serial.println();
// set the resolution to 9 bit per device
sensors.setResolution(firstThermometer, TEMPERATURE_PRECISION);
sensors.setResolution(secondThermometer, TEMPERATURE_PRECISION);
sensors.setResolution(thirdThermometer, TEMPERATURE_PRECISION);
sensors.setResolution(fourthThermometer, TEMPERATURE_PRECISION);
Serial.print("Device 0 Resolution: ");
Serial.print(sensors.getResolution(firstThermometer), DEC);
Serial.println();
Serial.print("Device 1 Resolution: ");
Serial.print(sensors.getResolution(secondThermometer), DEC);
Serial.println();
Serial.print("Device 2 Resolution: ");
Serial.print(sensors.getResolution(thirdThermometer), DEC);
Serial.println();
Serial.print("Device 3 Resolution: ");
Serial.print(sensors.getResolution(fourthThermometer), DEC);
Serial.println();
}
// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
// zero pad the address if necessary
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if(tempC == DEVICE_DISCONNECTED_C)
{
Serial.println("Error: Could not read temperature data");
return;
}
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(" Temp F: ");
Serial.print(DallasTemperature::toFahrenheit(tempC));
}
// function to print a device's resolution
void printResolution(DeviceAddress deviceAddress)
{
Serial.print("Resolution: ");
Serial.print(sensors.getResolution(deviceAddress));
Serial.println();
}
// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
Serial.print("Device Address: ");
printAddress(deviceAddress);
Serial.print(" ");
printTemperature(deviceAddress);
Serial.println();
}
/*
Main function, calls the temperatures in a loop.
*/
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures();
Serial.println("DONE");
// print the device information
printData(firstThermometer);
printData(secondThermometer);
printData(thirdThermometer);
printData(fourthThermometer);
delay(2000);
}
검색할 때마다 새로운 인덱스가 생성되어 할당되고, 다른 센서가 발견되지 않으면 검색에서 1이 반환되고, 다른 센서가 발견되지 않으면 0이 반환됩니다.
// assigns the first address found to insideThermometer
if (!oneWire.search(firstThermometer)) Serial.println("Unable to find 1 address for insideThermometer");
// assigns the second address found to insideThermometer
if (!oneWire.search(secondThermometer)) Serial.println("Unable to find 2 address for insideThermometer");
// assigns the third address found to insideThermometer
if (!oneWire.search(thirdThermometer)) Serial.println("Unable to find 3 address for insideThermometer");
// assigns the fourth address found to insideThermometer
if (!oneWire.search(fourthThermometer)) Serial.println("Unable to find 4 address for insideThermometer");
// assigns the fifth address found to insideThermometer
if (!oneWire.search(fifthThermometer)) Serial.println("Unable to find 5 address for insideThermometer");
// assigns the sixth address found to insideThermometer
if (!oneWire.search(sixthThermometer)) Serial.println("Unable to find 6 address for insideThermometer");
따라서 Serial 출력의 관련성 있고 최신 부분이 강조 표시됩니다.
Dallas Temperature IC Control Library Demo
Locating devices...Found 4 devices.
Parasite power is: OFF
Unable to find 5 address for thermometer
Device 0 Address: 28FF640E6C6F7A89
Device 1 Address: 28FF640E6D647F3E
Device 2 Address: 28FF640E6D5C1A3F
Device 3 Address: 28FF640E6D5D66A0
Device 0 Resolution: 12
Device 1 Resolution: 12
Device 2 Resolution: 12
Device 3 Resolution: 12
Requesting temperatures...DONE
Device Address: 28FF640E6C6F7A89 Temp C: 21.31 Temp F: 70.36
Device Address: 28FF640E6D647F3E Temp C: 21.19 Temp F: 70.14
Device Address: 28FF640E6D5C1A3F Temp C: 21.31 Temp F: 70.36
Device Address: 28FF640E6D5D66A0 Temp C: 21.19 Temp F: 70.14
Requesting temperatures...DONE
Device Address: 28FF640E6C6F7A89 Temp C: 21.31 Temp F: 70.36
Device Address: 28FF640E6D647F3E Temp C: 21.19 Temp F: 70.14
Device Address: 28FF640E6D5C1A3F Temp C: 21.25 Temp F: 70.25
Device Address: 28FF640E6D5D66A0 Temp C: 21.19 Temp F: 70.14
유용한 튜토리얼의 원문을 참고하시려면 링크를 따라가세요.
Thanks
- ESP32: pinout, specs and Arduino IDE configuration
- ESP32: integrated SPIFFS Filesystem
- ESP32: manage multiple Serial and logging
- ESP32 practical power saving
- ESP32 practical power saving: manage WiFi and CPU
- ESP32 practical power saving: modem and light sleep
- ESP32 practical power saving: deep sleep and hibernation
- ESP32 practical power saving: preserve data, timer and touch wake up
- ESP32 practical power saving: external and ULP wake up
- ESP32 practical power saving: UART and GPIO wake up
- ESP32: integrated LittleFS FileSystem
- ESP32: integrated FFat (Fat/exFAT) FileSystem
- ESP32-wroom-32
- ESP32-CAM
- ESP32: use ethernet w5500 with plain (HTTP) and SSL (HTTPS)
- ESP32: use ethernet enc28j60 with plain (HTTP) and SSL (HTTPS)
- How to use SD card with esp32
- esp32 and esp8266: FAT filesystem on external SPI flash memory
- Firmware and OTA update management
- Firmware management
- OTA update with Arduino IDE
- OTA update with Web Browser
- Self OTA uptate from HTTP server
- Non-standard Firmware update
- Integrating LAN8720 with ESP32 for Ethernet Connectivity with plain (HTTP) and SSL (HTTPS)
- Connecting the EByte E70 to ESP32 c3/s3 devices and a simple sketch example
- ESP32-C3: pinout, specs and Arduino IDE configuration
- Integrating W5500 with ESP32 Using Core 3: Native Ethernet Protocol Support with SSL and Other Features
- Integrating LAN8720 with ESP32 Using Core 3: Native Ethernet Protocol Support with SSL and Other Features
- Dallas ds18b20:
- Guide to I2C on ESP32: Communication with Heterogeneous 5V and 3.3V Devices, Additional Interface Management and Scanner
- Display
- Complete Guide: Using an ILI9341 Display with the TFT_eSPI Library
- Integrating Touch Screen Functionality with Your ILI9341 TFT Display
- SSD1683 eInk Display with GxEPD and ESP32 (and CrowPanel 4.2″ HMI): basics and configuration
- SSD1683 eInk Display with GxEPD and ESP32 (and CrowPanel 4.2″ HMI): fonts, shapes, and images
- ESP32 e Display eInk SSD1683: come realizzare una Semplice Stazione Meteo (anche su CrowPanel 4.2″ HMI) con le API di OpenWeatherMap
- ESP32 and ESP8266: Sending Emails with Attachments (EMailSender v4.0.0 Library) with complete STARTTLS Support
- ESP32 High Performance FTP Server: A Deep Dive into the MultiFTPServer Library (v3.x)
- HC-SR04 Ultrasonic Sensor with ESP32 and Arduino: Complete Guide
- How to connect multiple HC-SR04 sensors with PCF8574 (3 methods)
- Fix slow HC-SR04 sensors with PCF8574: the hybrid approach trick [Guide]
'ESP32' 카테고리의 다른 글
| ESP32 FreeRTOS 튜토리얼 가이드 6부작 6 (0) | 2025.11.21 |
|---|---|
| FreeRTOS를 사용한 ESP32: 소프트웨어 타이머/타이머 인터럽트 (0) | 2025.11.21 |
| ESP32 FreeRTOS 튜토리얼 가이드 6부작 5 (1) | 2025.11.21 |
| ESP32 ESP-NOW 양방향 커뮤니케이션 (0) | 2025.11.20 |
| ESP32 FreeRTOS 튜토리얼 가이드 6부작 4 (1) | 2025.11.19 |
| ESP32 FreeRTOS 튜토리얼 가이드 6부작 3 (0) | 2025.11.19 |
| ESP32 ADXL345 Accelerometer Interfacing (0) | 2025.11.18 |
| ESP32 FreeRTOS 튜토리얼 가이드 6부작 2 (0) | 2025.11.18 |
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
캐어랩