도구 온도 센서 ds18b20을 Arduino에 연결합니다. Arduino 및 DS18B20 디지털 온도 센서

온도 센서 ds18b20을 Arduino에 연결합니다. Arduino 및 DS18B20 디지털 온도 센서

이 튜토리얼에서는 Arduino UNO와 함께 DS18B20 온도 센서를 사용하여 온도계를 만듭니다. DS18B20 센서는 좋은 옵션, 다음과 같은 프로젝트에 있을 때 높은 명중률좋은 반응이 필요합니다. DS18B20을 사용자 장치에 연결하고 16x2 LCD 디스플레이에 온도 데이터를 표시하는 방법을 보여 드리겠습니다.

DS18B20 센서 개요

DS18B20 센서는 1선 버스를 통해 Arduino와 통신합니다. 정의에 따르면 Arduino와 통신하려면 하나의 데이터 라인(및 접지)만 필요합니다.

각 DS18B20에는 여러 DS18B20이 동일한 단일 와이어 버스에서 작동할 수 있도록 하는 고유한 64비트 직렬 코드 또는 주소가 있습니다. 따라서 마이크로프로세서를 사용하면 분산된 여러 DS18B20의 관리가 단순화됩니다. 넓은 영역. 이 기능의 응용 분야에는 환경 모니터링, 건물 및 기계 장비의 온도 제어 시스템이 포함됩니다.

DS18B20의 특징

  • 마이크로컨트롤러와 센서 간의 통신에는 단 하나의 단일 와이어 인터페이스만 필요합니다.
  • 외부 구성 요소는 4.7kΩ 저항 하나만 필요합니다.
  • 데이터 라인에서 직접 전원을 공급받을 수 있으며 3.0~5.5V의 전압이 필요합니다.
  • 각 장치에는 내장 ROM에 저장된 고유한 64비트 직렬 코드가 있습니다.
  • -55°C ~ +125°C(-67°F ~ +257°F)의 온도를 측정할 수 있습니다.
  • -10°C ~ + 85°C 범위에서 정확도 ± 0.5°C

이 프로젝트에서는 방수 온도 프로브 형태로 제공되는 DS18B20을 사용합니다. 방수 센서를 사용하면 가능성이 확장됩니다. 온도 센서는 물, 화학 물질, 차, 커피와 같은 액체의 온도를 측정할 수 있습니다.

구성 요소 요구 사항

온도계의 장비 요구 사항은 매우 표준적이므로 다음이 필요합니다.

  • LCD 디스플레이 16x2
  • 온도 센서 DS18B20
  • 점퍼선
  • 저항기 1K
  • 빵판

연결 다이어그램

아래 다이어그램에 따라 연결하십시오.

센서와 Arduino 연결

  • VCC -> Arduino 5V 및 VCC에서 데이터로 가는 4.7K 저항
  • 데이터 -> 핀 7 Arduino
  • GND -> GND 아두이노

LCD 및 Arduino UNO 연결

  • 핀 1 -> GND
  • 핀 2 -> VCC
  • 핀 3 -> Arduino 핀 3
  • 핀 4 -> Arduino 핀 33
  • 핀 5 -> GND
  • 핀 6 -> Arduino 핀 31
  • 핀 7-10 -> GND
  • 핀 11 -> Arduino 핀 22
  • 핀 12 -> Arduino 핀 24
  • 핀 13 -> Arduino 핀 26
  • 핀 14 -> Arduino 핀 28
  • 핀 15 -> 220Ω 저항을 통한 VCC
  • 핀 16 -> GND

대비를 제어하려면 위 그림과 같이 전위차계를 LCD의 핀 3에 연결하세요.

이 프로젝트는 최대 125°C의 온도에서 작동합니다. 온도 판독값에 차이가 있는 경우 DS18B20에 연결된 저항기의 연결을 다시 확인하세요. 위에서 설명한 모든 것을 연결한 후 프로그래밍으로 넘어갈 수 있습니다.

온도계 소스 코드

다운로드하기 전에 소스 코드 Arduino 환경에서 이 코드를 실행하는 데 필요한 두 개의 라이브러리를 설정해야 합니다.

  • 첫 번째 라이브러리는 OneWire()입니다.
  • 두 번째 라이브러리는 DallasTemperature()입니다.

두 라이브러리를 모두 다운로드한 후 파일을 폴더로 이동합니다. Arduino 라이브러리기본. 그런 다음 코드를 복사하여 센서가 올바르게 연결되었는지 다시 확인한 후 업로드하세요.

//코드 시작 #include #포함하다 #포함하다 #define ONE_WIRE_BUS 7 OneWire oneWire(ONE_WIRE_BUS); 달라스온도 센서(&oneWire); 부동 온도C = 0; 부동 온도F = 0; LiquidCrystal LCD(12,11,5,4,3,2); 무효 설정() ( 센서.begin(); lcd.begin(16,2); lcd.clear(); pinMode(3, OUTPUT); 아날로그Write(3, 0); Serial.begin(9600); ) 무효 루프 () ( 센서.requestTemperatures(); tempC = 센서.getTempCByIndex(0); tempF = 센서.toFahrenheit(tempC); 지연(1000); Serial.println(tempC); lcd.setCursor(0,0); lcd. print("C: "); lcd.print(" 각도"); lcd.setCursor(0,1);

대략 다음과 같습니다.

이 센서로 최대 100°C까지 온도를 측정할 수 있었습니다! 그는 매우 반응이 좋습니다.

프로젝트를 생성한 후에는 센서를 뜨거운 물과 차가운 물에 담가서 장치를 테스트하십시오.

어떻게 생각해보자 Arduino 도움말 DS18B20 또는 DS18S20 디지털 온도 센서의 판독값을 읽습니다. 현재 댈러스의 m/s DS18B20은 가장 일반적이고 저렴한 디지털 온도 센서입니다. 프로토콜에 따라 작동합니다. 센서 데이터시트:

Arduino에 대한 DS18B20 센서의 연결 다이어그램은 다음과 같습니다. 4.7kOhm(5kOhm) 풀업 저항은 DQ(데이터) 핀과 Vdd 센서 공급 장치 사이에 연결됩니다.

작업 스케치가 아래에 나와 있습니다. OneWire 라이브러리 필요 최신 버전다운로드할 수 있습니다.

라이브러리를 설치하면 사용할 수 있는 작업 예제가 메뉴에 나타납니다.

#include "OneWire.h" // OneWire DS18S20, DS18B20, DS1822 온도 예 // // http://www.pjrc.com/teensy/td_libs_OneWire.html // // DallasTemperature 라이브러리가 이 모든 작업을 수행할 수 있습니다. ! // http://milesburton.com/Dallas_Temperature_Control_Library OneWire ds(10); // 핀 10(4.7K 저항 필요) void setup(void) ( Serial.begin(9600); ) void loop(void) ( byte i; byte 현재 = 0; byte type_s; byte data; byte addr; float 섭씨, 화씨; if (!ds.search(addr)) ( Serial.println("더 이상 주소가 없습니다."); Serial.println(); ds.reset_search(); 지연(250); return; ) 직렬. print("ROM ="); for(i = 0; 나는< 8; i++) { Serial.write(" "); Serial.print(addr[i], HEX); } if (OneWire::crc8(addr, 7) != addr) { Serial.println("CRC is not valid!"); return; } Serial.println(); // the first ROM byte indicates which chip switch (addr) { case 0x10: Serial.println(" Chip = DS18S20"); // or old DS1820 type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad Serial.print(" Data = "); Serial.print(present, HEX); Serial.print(" "); for (i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); // Convert the data to actual temperature // because the result is a 16 bit signed integer, it should // be stored to an "int16_t" type, which is always 16 bits // even when compiled on a 32 bit processor. int16_t raw = (data << 8) | data; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data == 0x10) { // "count remain" gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - data; } } else { byte cfg = (data & 0x60); // at lower res, the low bits are undefined, so let"s zero them if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms //// default is 12 bit resolution, 750 ms conversion time } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print(" Temperature = "); Serial.print(celsius); Serial.print(" Celsius, "); Serial.print(fahrenheit); Serial.println(" Fahrenheit"); }

이전 강의에서 우리는 이미 DHT11 온도 및 습도 센서와 서미스터를 사용해 작업했습니다. 이번에는 또 다른 인기 있는 온도 센서인 DS18B20을 알아보겠습니다. 이 장치를 사용하면 -55°C ~ +125°C 범위의 온도를 ±0.5°C의 정확도로 측정할 수 있습니다(온도: –10°C ~ +85°C). DS18B20은 3.3V 또는 5V에서 전원을 공급받을 수 있습니다. 센서 자체는 다양한 하우징에서 볼 수 있는 초소형 회로입니다. 또한 센서, 풀업 저항기 및 커넥터가 배치되는 기성 모듈도 인기가 있습니다.
또 다른 옵션은 와이어가 포함된 밀봉된 강철 캡슐에 들어 있는 센서입니다.

1. DS18B20-ROC 모듈을 Arduino에 연결하기

이 튜토리얼에서는 RobotClass에서 개발된 온도 센서 모듈을 사용하여 작업합니다. Arduino Uno 컨트롤러에 연결하겠습니다. DHT11과 마찬가지로 DS18B20 센서는 단일 와이어 버스(1-wire)를 사용하여 컨트롤러와 데이터를 교환합니다. 따라서 센서를 Arduino에 연결하려면 와이어 3개만 필요합니다. 개략도 레이아웃 모양
메모.모듈이 아닌 별도의 미세 회로를 사용하는 경우 4.7 KOhm 저항을 통해 미세 회로의 OUT 핀을 전원 접점에 연결해야합니다. 위 모듈에는 이 저항이 이미 설치되어 있습니다.

2. DS18B20 센서로부터 데이터를 수신하는 프로그램

매초마다 센서에서 온도 판독값을 읽고 이를 COM 포트로 출력하는 프로그램을 작성해 보겠습니다. #포함하다 원와이어 ds(2); void setup() ( Serial.begin(9600); ) void loop() ( byte i; byte data; byte addr; float celsius; // 센서 주소 검색 if (!ds.search(addr)) ( ds.reset_search ( ); return; ds.select(addr); // 온도 측정을 위한 명령(1000); ds.write(0xBE); // (i = 0; i에 대해 센서의 내부 메모리에서 온도 판독값을 읽습니다.< 9; i++) { data[i] = ds.read(); } int16_t raw = (data << 8) | data; // датчик может быть настроен на разную точность, выясняем её byte cfg = (data & 0x60); if (cfg == 0x00) raw = raw & ~7; // точность 9-разрядов, 93,75 мс else if (cfg == 0x20) raw = raw & ~3; // точность 10-разрядов, 187,5 мс else if (cfg == 0x40) raw = raw & ~1; // точность 11-разрядов, 375 мс // преобразование показаний датчика в градусы Цельсия celsius = (float)raw / 16.0; Serial.print("t="); Serial.println(celsius); } Процедура на первый взгляд может показать совершенно непонятной. На самом деле, все эти 0xBE, 0x44 и т.п. взяты из спецификации к датчику. Для удобства мы можем всю процедуру вычисления выделить в отдельную функцию или даже в отдельный модуль. Загружаем программу на Ардуино и запускаем монитор COM-порта. В окне терминала мы должны увидеть данные о температуре, обновляющиеся раз в секунду: t=23.15 t=23.47 t=23.32 Вот и всё, датчик работает!

결론

온도 센서를 이용하면 아파트나 온실에 간단한 자동 환기 시스템을 만들 수 있습니다. 온도가 특정 값에 도달했는지 확인하고 릴레이를 사용하여 팬을 켜는 조건 연산자를 프로그램에 추가하는 것으로 충분합니다. 우리도 같은 방식으로 일했어요

DS18B20은 디지털 온도 센서입니다. 센서는 사용이 매우 쉽습니다.

첫째, 디지털이고 둘째, 유용한 신호를 수신하는 접점이 하나뿐입니다. 즉, 수많은 센서를 하나의 Arduino에 동시에 연결할 수 있습니다. 핀이 충분할 것입니다. 뿐만 아니라 Arduino의 하나의 핀에 여러 센서를 연결할 수도 있습니다! 하지만 가장 먼저 해야 할 일이 있습니다.

DS18B20은 다양한 폼 팩터로 제공됩니다. 따라서 어느 것을 사용할지는 귀하의 선택입니다. 8핀 SO(150mils), 8핀 µSOP, 3핀 TO-92의 세 가지 옵션을 사용할 수 있습니다. eBay 또는 Aliexpress 서핑을 통해 중국인이 방수 케이스에 TO-92 버전을 제공하는 것으로 나타났습니다. 즉, 그러한 기적을 물에 안전하게 담그거나 비 속에서 사용할 수 있습니다. 등등. 이 센서는 3개의 출력 핀(검은색 - GND, 빨간색 - Vdd 및 흰색 - 데이터)으로 제조됩니다.

DS18B20 센서의 다양한 폼 팩터가 아래 그림에 나와 있습니다.

방수 케이스의 모델 DS18B20:


DS18B20은 사용하기 쉽습니다. 데이터 접점을 통해 전원을 공급할 수 있습니다(이 경우 연결에는 세 개의 접점 중 두 개만 사용합니다!). 센서는 3.0~5.5V의 전압 범위에서 작동하고 ±0.5°C(-10°C)의 정확도로 -55°C~+125°C(-67°F~+257°F)의 온도를 측정합니다. ) 최대 +85°C).

또 다른 멋진 기능: 최대 127개의 센서를 병렬로 연결할 수 있습니다! 그리고 각각의 온도 판독값을 개별적으로 읽습니다. 어떤 프로젝트에 이것이 필요할지는 확실하지 않지만 두 개의 센서를 연결하고 냉장고와 냉동고의 온도를 제어할 수 있습니다. 동시에 Arduino에 핀 묶음을 무료로 남겨 둘 수 있습니다.... 일반적으로 이것은 좋은 기능입니다.

Arduino와 DS18B20을 사용하여 온도를 제어하려면 무엇이 필요합니까?

소프트웨어

  • 당연히 Arduino IDE가 필요합니다.
  • Arduino 및 DS18B20 센서 작업을 크게 촉진하는 OneWire 라이브러리
  • 스케치...

Arduino에 스케치 업로드하기

아래 스케치는 OneWire 라이브러리의 예제 카테고리에 있습니다. "파일" - "예제" - "OneWire"로 이동하여 "DS18x20_Temperature" 예를 선택합니다. 프로그램 코드는 아래와 같습니다.

이 예에서는 OneWire 라이브러리를 사용하여 연결된 모든 DS28B20 온도 센서에서 데이터를 수집하고(여러 센서를 연결하는 방법은 기사 끝 부분에 설명되어 있음) 이를 Arduino IDE 직렬 모니터 창에 표시합니다.

직렬 모니터 창에 다음과 같은 내용이 표시됩니다.

ROM = 28 88 84 82 5 0 0 6A

더 이상 주소가 없습니다.

ROM = 28 88 84 82 5 0 0 6A

데이터 = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

온도 = 섭씨 21.37도, 화씨 70.47도

더 이상 주소가 없습니다.

ROM = 28 88 84 82 5 0 0 6A

데이터 = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

온도 = 섭씨 21.37도, 화씨 70.47도

더 이상 주소가 없습니다.

올바른 핀을 입력했는지 확인하세요!

10번째 줄에 "OneWire ds(2);"라고 적혀 있습니다. 센서의 데이터 접점이 연결된 핀이 설정됩니다.

이 예에서는 핀 2를 사용하지만 OneWire 예의 기본 핀은 10입니다. 이 핀도 사용할 수 있습니다.

#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 라이브러리 사용 예

원와이어 ds(2); // 핀 10(4.7kOhm 저항 필요)

무효 설정(void) (

Serial.begin(9600);

무효 루프(void) (

현재 바이트 = 0;

섭씨, 화씨 부동;

if (!ds.search(addr)) (

Serial.println("더 이상 주소가 없습니다.");

Serial.println();

ds.reset_search();

Serial.print("ROM=");

Serial.write(" ");

Serial.print(addr[i], HEX);

if (OneWire::crc8(addr, 7) != addr) (

Serial.println("CRC가 유효하지 않습니다!");

Serial.println();

// 첫 번째 바이트는 칩을 식별합니다.

Serial.println("칩 = DS18S20"); // 또는 이전 DS1820

Serial.println("칩 = DS18B20");

Serial.println("칩 = DS1822");

Serial.println("장치는 DS18x20 제품군 장치가 아닙니다.");

ds.select(addr);

지연(1000); // 750이면 충분할 수도 있고 충분하지 않을 수도 있음

// 여기에서 ds.depower()를 사용할 수 있지만 재설정하면 해당 작업이 처리됩니다.

현재 = ds.reset();

ds.select(addr);

Serial.print(" 데이터 = ");

Serial.print(현재, HEX);

Serial.print(" ");

데이터[i] = ds.read();

Serial.print(data[i], HEX);

Serial.print(" ");

Serial.print(" CRC=");

Serial.print(OneWire::crc8(data, 8), HEX);

Serial.println();

//실제 온도로 변환

// 결과는 16비트 정수이므로 다음 위치에 저장해야 합니다.

// 항상 16비트와 동일한 데이터 유형 "int16_t"를 갖는 변수,

// 32비트 프로세서에서 컴파일하더라도

int16_t 원시 = (데이터

if (데이터 == 0x10) (

원시 = (원시 & 0xFFF0) + 12 - 데이터;

바이트 cfg = (데이터 & 0x60);

// 작은 값의 경우 작은 비트가 정의되지 않으므로 0으로 재설정하겠습니다.

if (cfg == 0x00) raw = raw & ~7; // 분해능 9비트, 93.75ms

else if (cfg == 0x20) raw = raw & ~3; // 분해능 10비트, 187.5ms

else if (cfg == 0x40) raw = raw & ~1; // 분해능 11비트, 375ms

//// 기본 분해능은 12비트, 변환 시간은 750ms입니다.

섭씨 = (float)raw / 16.0;

화씨 = 섭씨 * 1.8 + 32.0;

Serial.print(" 온도 = ");

Serial.print(섭씨);

Serial.print(" 섭씨, ");

Serial.print(화씨);

Serial.println("화씨");

여러 DS18B20 센서를 Arduino에 연결하는 방법은 무엇입니까?

여러 개의 DS18B20 디지털 온도 센서를 병렬로 연결할 수 있습니다. 동시에 OneWire 라이브러리를 사용하면 모든 센서의 데이터를 동시에 읽을 수 있습니다.

센서를 연결하는 두 가지 방법이 아래에 설명되어 있습니다.

센서 수가 많은 경우(10개 이상) 저항이 더 낮은(예: 1.6KΩ 이하) 저항기를 사용해야 합니다.

또한, 10개 이상의 센서를 병렬로 연결하면 문제(판독 오류)가 발생할 수 있습니다. 따라서 Arduino의 데이터 핀과 각 센서의 데이터 핀 사이에 저항이 100~120Ω인 추가 저항을 설치하는 것이 좋습니다!

두 개의 연결된 센서를 사용한 이전 스케치의 결과는 다음과 같습니다.

ROM = 28 88 84 82 5 0 0 6A

데이터 = 1 51 1 4B 46 7F FF F 10 FE CRC=FE

온도 = 섭씨 21.06도, 화씨 69.91도

ROM = 28 DA CA 27 5 0 0 49

데이터 = 1 4E 1 4B 46 7F FF 2 10 D9 CRC=D9

온도 = 섭씨 20.87도, 화씨 69.57도

더 이상 주소가 없습니다.

올바른 센서 선택

여러 센서를 병렬로 사용할 때 어떤 센서에서 데이터를 얻고 있는지 알아두면 좋을 것 같습니다. 어떻게 하나요?

일련번호

센서는 디지털이므로 각 센서에는 특정 센서를 식별하는 데 사용할 수 있는 개별 일련 번호가 있습니다. 모든 것이 간단한 것 같습니다. 하지만... 센서를 식별하는 데 사용하기 전에 먼저 일련번호를 식별해야 합니다. 그렇죠?

위의 예에서 스케치가 64비트 일련 번호("ROM" 값) 형식으로 데이터를 제공한다는 것을 알 수 있습니다. 예를 들어:

위 예에서는 28 88 84 82 5 0 0 6A 또는 28 DA CA 27 5 0 0 49입니다.

동시에 많은 수의 센서(10개 이상)를 사용하는 경우 DS18B20 센서의 데이터 핀과 Arduino의 데이터 핀 사이에 100 ~ 120Ω 저항을 추가해야 한다는 점을 잊지 마십시오( 각 센서마다!).

아래는 세 개의 접점을 사용하여 여러 센서를 병렬 연결하는 다이어그램입니다.


아래에 의견과 질문을 남기고 개인적인 경험을 공유해 주세요. 새로운 아이디어와 프로젝트는 종종 토론을 통해 탄생합니다!

이제 농장에서 더 유용한 것으로 넘어갈 시간입니다. 예를 들어 디지털 온도계 등을 만들어보세요. 더욱이 Arduino를 사용하면 "컨트롤러 이전 시대"만큼 어렵지 않습니다. 그 당시 전자 온도계는 12개의 마이크로 회로, 여전히 교정이 필요한 아날로그 센서, 여러 출력 전압을 위한 변압기 전원 공급 장치로 구성된 복잡한 구조였습니다. 글쎄, 그리고-이 모든 것을 수집하려는 라디오 아마추어를위한 적절한 훈련. 이제 이것으로 모든 것이 훨씬 간단해졌습니다.

부르주아 회사인 "Dallas Semiconductor" DS18B20의 디지털 온도 센서를 소개하겠습니다.

섭씨 -55~+120도 범위에서 정확한(소수점 이하 몇 자리까지) 온도 측정을 위한 모든 기능을 갖춘 장치입니다. 게다가 유용한 것을 기억하는 "뇌"(기억 세포)도 몇 개 있습니다. 하지만 지금은 사용하지 않을 것입니다. 사진에서 볼 수 있듯이 다양한 변형이 가능합니다. 우리에게 가장 일반적이고 편리한 것은 "TO-92"입니다.

센서에는 3개의 핀만 있으며 그 중 2개는 5V 공급 전압을 공급받고 중간 핀은 데이터 전송용입니다. 센서의 모든 제어(명령 전송, 측정된 온도 읽기)는 단일 도체를 통해 이루어지므로 이 전체 기술 및 전송 프로토콜을 "1-Wire" 또는 "One-Wire"라고 합니다.

이론에 너무 얽매이지 않기 위해 센서를 사용하여 온도를 측정하는 과정을 간략하게 살펴보겠습니다.

각 데이터 전송 또는 수신 세션은 초기화 명령으로 시작됩니다. 다시 한번 말하지만, 낯선 사람들이 우리를 위해 이 작업을 수행한 Arduina와 온도계 간의 통신에 대해 자세히 설명하지는 않겠습니다(우리는 그들에게 정신적으로 감사할 것입니다). 우리는 그녀에게 "초기화"라는 명령 하나만 내리면 그녀는 무엇을 해야 할지 알아낼 것입니다.

다음으로 초기화 후 제어 명령을 실행하기 시작합니다. 여기서는 이론적으로 하나의 제어 배선에 "1-Wire" 제품군의 여러 장치가 있을 수 있다는 점에 유의해야 합니다. 또한 온도 센서 뿐만이 아닙니다. 따라서 각각의 고유한 일련번호로 접근이 가능합니다. 그러나 우리는 와이어에 단일 센서를 가지고 있기 때문에 원칙적으로 다른 것으로 전환할 수 없습니다. 따라서 이러한 전주곡은 명령("0xCC" 바이트로 전송됨)에 의해 건너뜁니다. 말하는 것을 잊었습니다. 여기와 아래에는 이진수(바이트)의 16진수 표기법이 사용됩니다.

수신자를 결정한 후 "온도 측정"( "0x44") 명령을 보냅니다. 그런 다음 센서가 작동하는 동안 약 1초 동안 센서를 그대로 두어야 합니다.

이 시간 동안 "ds"는 온도를 측정하고 결과를 2바이트로 기록합니다. 여기서 이를 추출하여 인간 형식으로 변환해야 합니다. 언제나처럼 통신 세션을 초기화하는 것부터 시작합니다. 그런 다음 "주소 전송 재설정"("0xSS") 명령을 다시 전송합니다. 그런 다음 즉시 측정 결과(“0xBE”)를 수락할 준비가 되었음을 알려드립니다.

그 후 Arduino는 결과와 함께 순차적으로 2바이트(또는 원하는 대로 2바이트 숫자)를 받습니다. 이러한 결과가 무엇인지, 그리고 어떻게 이를 소화 가능한 형태로 만들 수 있는지 살펴보겠습니다.

다시 한 번, 너무 바쁘지 않도록 우리에게 중요한 것이 무엇인지 결정합시다. 즉, 하위 및 부분적으로 상위 바이트에는 소수점 4자리까지 정확한 온도 측정 결과가 있습니다(우리에게는 이러한 정밀도가 필요하지 않습니다). 온도 기호("+" 또는 "-")는 상위 바이트의 최상위 비트 값에 따라 결정됩니다.

하지만 말로는 충분합니다. 이제 디자인을 시작할 시간입니다. Arduino에 대한 DS18B20의 연결 다이어그램은 간단할 뿐만 아니라 간단합니다.

센서의 전원 핀은 해당 Arduino 핀에 연결되고 데이터 출력은 디지털 출력 "10"에 연결됩니다. 또한 데이터 출력은 3~5킬로옴 저항기(소위 "풀업" 저항기)를 통해 +5V 버스에 연결됩니다. 디지털 출력 "10"은 출력과 입력 모두로 작동하지만 이전 LED 예에서처럼 더 이상 구성할 필요가 없습니다. "1-Wire" 라이브러리 개발자들은 우리를 더러운 작업에서 조심스럽게 해방시켜 주었습니다. 이에 대해 감사드립니다!

일반적으로 나는 다음과 같이 끝났습니다.

예! 나는 완전히 잊었다! "1-Wire" 라이브러리는 기본 Arduino IDE 패키지에 포함되어 있지 않으므로 여기 등에서 다운로드해야 합니다. 아카이브의 압축을 풀고 Arduino IDE가 설치된 폴더에 있는 \libraries 디렉터리에 라이브러리가 있는 폴더를 넣습니다. 다음에 개발 환경을 시작하면 라이브러리를 사용할 수 있습니다. 찾을 수 있는 곳은 다음과 같습니다:

그러나 우리는 "Samples"의 스케치를 사용하지 않을 것입니다. 거기에는 멋진 것들이 많이 있습니다. 이 스케치를 Arduino IDE에 복사하는 것이 더 좋습니다.

#포함하다

원와이어 ds(10); //

무효 설정(void) (
Serial.begin(9600); //결과를 출력하기 위해 직렬 포트를 설정합니다.
}

무효 루프() (
바이트 데이터; // 2바이트 배열 선언
ds.reset(); // 센서 초기화
ds.write(0xCC); // 특정 센서에 대한 주소 지정 건너뛰기(하나 있음)
ds.write(0x44); // 온도를 측정하라는 명령을 내립니다.
지연(1000); // 온도가 측정되는 동안 1초 동안 기다립니다.

ds.reset(); // 센서를 다시 초기화합니다.
ds.write(0xCC); // 주소 지정을 다시 건너뜁니다.
ds.write(0xBE); // 온도를 읽는 명령을 내립니다.
데이터 = ds.read(); //낮게 읽기
데이터 = ds.read(); // 그리고 높은 바이트
int 온도 = (데이터<< 8) + data; // преобразуем считанную информацию
온도 = 온도 >> 4; // 원하는 뷰로 이동합니다.
Serial.println(임시); // 결과를 직렬 포트로 출력합니다.

여기서 무엇을 볼 수 있습니까? 먼저 "OneWire" 라이브러리가 스케치에 연결됩니다. 센서가 Arduino의 핀 "10"에 연결되어 있음을 나타냅니다.그런 다음 측정 결과를 출력하도록 직렬 포트가 구성됩니다. 이제 준비 작업이 완료되고 측정이 시작됩니다. 온도 측정 결과를 쓸 2바이트를 준비(예약 및 이름 지정)합니다. 그런 다음 위에서 설명한 대로 명령을 실행하고 마지막으로 온도와 함께 2바이트를 받습니다. 그런 다음 소수점 없이 전체 온도 값을 얻기 위해 읽은 정보가 변환되고 추가 소수점 자리가 제거됩니다. 이 정보는 직렬 포트를 통해 출력됩니다. 그녀를 어디서 볼 수 있나요? 그리고 여기 있습니다:

따라서 이 스케치를 Arduino에 업로드하고 "직렬 포트 모니터"를 열고 매초 측정된 온도를 관찰하십시오.

만세! 작동 중이에요! 센서로부터 수신된 2바이트를 정수 온도 숫자로 변환하는 과정에 대해서는 자세히 설명하지 않겠습니다. 이는 별도의 대규모 기사에서 다루겠습니다. 결과 숫자는 정수 유형의 Temp 변수라고 말씀드리겠습니다. 즉, 양수 값과 음수 값을 모두 사용할 수 있습니다. 추운 날씨에 장치의 작동을 확인해 보겠습니다.

음, 음의 온도도 표시됩니다. 심지어 바로 표지판과 함께. 앞으로 다양한 표시기에 온도를 표시할 때 프로그램의 이 기능을 기억해야 합니다. 그리고 긍정적인 온도 신호에 대한 추가 표시를 제공합니다. 하지만 이에 대한 자세한 내용은 다음 기사에서 확인하세요.



사이트의 새로운 내용

>

가장 인기 많은