Подключение датчика температуры ds18b20 к atmega8 и вывод температуры на lcd hd44780

Способ 2: чтение датчика DS18B20 по адресу

Мы знаем, что каждому DS18B20 назначен уникальный 64-битный адрес, чтобы отличать их друг от друга. В этом методе мы найдем этот адрес для соответствующей маркировки каждого датчика. Затем этот адрес можно использовать для считывания каждого датчика в отдельности.

Поиск адресов датчиков DS18B20s на шине

Следующий скетч обнаруживает все DS18B20, присутствующие на шине, и печатает их адреса на 1-Wire в монитор последовательного порта.

Вы можете подключать только один датчик за раз, чтобы определить его адрес (или последовательно добавлять по одному новому датчику, чтобы вы могли идентифицировать каждый из них по его адресу). Затем вы можете пометить каждый датчик.

Теперь откройте монитор последовательного порта. Вы должны получить что-то подобное:

Рисунок 6 – Нахождение адресов 1-Wire всех датчиков DS18B20 на шине

Скопируйте все адреса, так как они нам понадобятся в следующем скетче.

Чтение показаний датчиков DS18B20 по адресу

Следующий скетч считывает температуру датчиков DS18B20 по их адресам. Прежде чем приступить к загрузке скетча, вам нужно изменить адреса датчиков DS18B20 на те, которые вы определили в предыдущем скетче.

Вывод вышеприведенного эскиза выглядит так

Рисунок 7 – Вывод показаний нескольких датчиков DS18B20 методом адреса

Объяснение кода

Как обычно, скетч начинается с включения библиотек, объявления вывода, к которому подключена шина датчиков, и создания объекта библиотеки .

Далее мы вводим адреса, которые были найдены ранее для каждого датчика температуры. В нашем случае имеем следующее.

Во фрагменте настройки мы инициализируем библиотеку путем вызова функции и инициализируем последовательную связь с ПК.

В цикле мы просто посылаем команду всем датчикам для преобразования температуры, используя функцию .

Затем, чтобы напечатать температуру датчика, мы вызываем пользовательскую функцию , для которой передается в качестве параметра.

Вышеприведенная функция просто вызывает библиотечные функции для отображения температуры в градусах Цельсия и для отображения температуры в градусах Фаренгейта.

Подключение одного DS18B20 к ATmega8

Самый простой способ подключения термодатчика DS18B20 к микроконтроллеру, конечно же, подключение одного датчика. В таком случае нет необходимости искать адрес подключённого датчика, а можем напрямую с ним общаться и считывать данные. Всё это возможно благодаря команды SKIP ROM — Пропуск ROM

Обратите внимание, что команда ЧТЕНИЕ ПАМЯТИ может следовать за командой Пропуска ROM, только если на шине присутствует одно подчиненное устройство. Команда Пропуска ROM, сопровождаемая командой ЧТЕНИЕ ПАМЯТИ вызовет конфликт на уровне данных на шине, если на шине более одного подчиненного устройства, так как все устройства будут пытаться одновременно передавать данные

main.cpp

#include «config.h»

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include «OneWire.h»
#include «LCD.h»

// 123.4
// numbers = 123
// numbers = 4
inline void explodeDoubleNumber(int* numbers, double flt) {
numbers = abs((int) flt);
numbers = abs((int) ((flt — ((int) flt)) * 10));
}

inline void printTemp(double d) {
char text = «T = «;
int fs;
char num;

explodeDoubleNumber(fs, d);
if (d < 0) {
strcat(text, «-«);
}
itoa(fs, num, 10);
strcat(text, num);
strcat(text, «.»);
itoa(fs, num, 10);
strcat(text, num);
strcat(text, «‘C»);
lcdClear();
lcdGotoXY(0, 0);
lcdPuts(text);
}

double getTemp(void) {
uint8_t temperatureL;
uint8_t temperatureH;
double retd = 0;

skipRom();
writeByte(CMD_CONVERTTEMP);

_delay_ms(750);

skipRom();
writeByte(CMD_RSCRATCHPAD);

temperatureL = readByte();
temperatureH = readByte();

retd = ((temperatureH << 8) + temperatureL) * 0.0625;

return retd;
}

int main(void) {
_delay_ms(100);
lcdInit();
lcdClear();
lcdSetDisplay(LCD_DISPLAY_ON);
lcdSetCursor(LCD_CURSOR_OFF);

oneWireInit(PINB0);

double temperature;

while (1) {
temperature = getTemp();
printTemp(temperature);
_delay_ms(500);
}
}

// site: http://micro-pi.ru

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

#include «config.h»
 
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include «OneWire.h»
#include «LCD.h»
 
 
// 123.4
// numbers = 123
// numbers = 4

inlinevoidexplodeDoubleNumber(int*numbers,doubleflt){

numbers=abs((int)flt);

numbers1=abs((int)((flt-((int)flt))*10));

}
 

inlinevoidprintTemp(doubled){

chartext17=»T = «;

intfs2;

charnum5;

explodeDoubleNumber(fs,d);

if(d<){

strcat(text,»-«);

}

itoa(fs,num,10);

strcat(text,num);

strcat(text,».»);

itoa(fs1,num,10);

strcat(text,num);

strcat(text,»‘C»);

lcdClear();

lcdGotoXY(,);

lcdPuts(text);

}
 

doublegetTemp(void){

uint8_t temperatureL;

uint8_t temperatureH;

doubleretd=;

skipRom();

writeByte(CMD_CONVERTTEMP);

_delay_ms(750);

skipRom();

writeByte(CMD_RSCRATCHPAD);

temperatureL=readByte();

temperatureH=readByte();

retd=((temperatureH<<8)+temperatureL)*0.0625;

returnretd;

}
 

intmain(void){

_delay_ms(100);

lcdInit();

lcdClear();

lcdSetDisplay(LCD_DISPLAY_ON);

lcdSetCursor(LCD_CURSOR_OFF);

oneWireInit(PINB0);

doubletemperature;

while(1){

temperature=getTemp();

printTemp(temperature);

_delay_ms(500);

}

}
 
// site: http://micro-pi.ru

— возвращает данные температуры в градусах Цельсия. — отображает на экран температуру. — преобразует вещественное число flt в два целых, которые записываются в numbers.
Вместо функций  и  можно использовать sprintf(), но она жрёт слишком много памяти.

Скетч для Arduino и сенсора DS18B20

Установливаем библиотеку OneWire Library

После того как вы скачали архив с библиотекой, ее надо импортировать. Для этого в Arduino IDE выберите пункт “Sketch” — “Import Library” — “Add Library” и выберите архив, который вы скачали. Если у вас возникли проблемы, с установкой библиотеки, ознакомьтесь с инструкцией по установке библиотек в Arduino.

Загружаем скетч на Arduino

Скетч, который представлен ниже, есть в библиотеке OneWire, в категории examples. Перейдите в “File” — “Examples” — “OneWire” и выберите пример “DS18x20_Temperature”. Код программы представлен ниже.

Данный пример использует библиотеку OneWire Library, для того, чтобы собрать данные со всех подключенных датчиков температуры DS28B20 (как подключить несколько сенсоров описано в конце статьи) и отобразить их в окне серийного монитора Arduino IDE.

В окне серийного монитора вы увидите примерно следующее:

ROM = 28 88 84 82 5 0 0 6A

Chip = DS18B20

Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Temperature = 21.37 Celsius, 70.47 Fahrenheit

No more addresses.

ROM = 28 88 84 82 5 0 0 6A

Chip = DS18B20

Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Temperature = 21.37 Celsius, 70.47 Fahrenheit

No more addresses.

ROM = 28 88 84 82 5 0 0 6A

Chip = DS18B20

Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Temperature = 21.37 Celsius, 70.47 Fahrenheit

No more addresses.

Обычное или паразитное питание?

DS18B20 может работать в обычном или в так называемом «паразитном» режиме. В обычном режиме для подключения используется 3 коннектора, в «паразитном» режиме — в его лишь 2.

Вам надо настроить правильный режим в скетче, чтобы снять достоверные показания с датчика:

  • Для «паразитного» режима в строке 65 надо указать: ds.write(0x44, 1);
  • Для обычного режима в строке 65 указывается: ds.write(0x44);

Убедитесь, что вы указали корректные пины!

В строке 10, где указано “OneWire ds(2);” устанавливается пин, к которому подключен контакт data с сенсора.

В этом примере использован пин 2, но значения пина по умолчанию в примере OneWire стоит на 10. Можно использовать и его.

#include &ltOneWire.h&gt

// пример использования библиотеки OneWire DS18S20, DS18B20, DS1822

OneWire ds(2); // на пине 10 (нужен резистор 4.7 КОм)

void setup(void) {

Serial.begin(9600);

}

void loop(void) {

byte i;

byte present = 0;

byte type_s;

byte data;

byte addr;

float celsius, fahrenheit;

if ( !ds.search(addr)) {

Serial.println(«No more addresses.»);

Serial.println();

ds.reset_search();

delay(250);

return;

}

Serial.print(«ROM =»);

for( i = 0; i

Serial.write(‘ ‘);

Serial.print(addr, HEX);

}

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

Serial.println(«CRC is not valid!»);

return;

}

Serial.println();

// первый байт определяет чип

switch (addr) {

case 0x10:

Serial.println(» Chip = DS18S20″); // или более старый 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); // начинаем преобразование, используя ds.write(0x44,1) с «паразитным» питанием

delay(1000); // 750 может быть достаточно, а может быть и не хватит

// мы могли бы использовать тут ds.depower(), но reset позаботится об этом

present = ds.reset();

ds.select(addr);

ds.write(0xBE);

Serial.print(» Data = «);

Serial.print(present, HEX);

Serial.print(» «);

for ( i = 0; i

data = ds.read();

Serial.print(data, HEX);

Serial.print(» «);

}

Serial.print(» CRC=»);

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

Serial.println();

// конвертируем данный в фактическую температуру

// так как результат является 16 битным целым, его надо хранить в

// переменной с типом данных «int16_t», которая всегда равна 16 битам,

// даже если мы проводим компиляцию на 32-х битном процессоре

int16_t raw = (data

if (type_s) {

raw = raw

if (data == 0x10) {

raw = (raw & 0xFFF0) + 12 — data;

}

} else {

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 мс

//// разрешение по умолчанию равно 12 бит, время преобразования — 750 мс

}

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»);

}

Как работают современные датчики температуры

Блок-схема датчика температуры типа DS18B20 выглядит следующим образом:

Исходя из вышеприведенной структуры, рассматриваемый датчик состоит из:

  • регистра конфигурации, программируемого пользователем (9–12 разрядов);
  • датчика температуры;
  • верхнего Th и нижнего Tl порога срабатывания сигнала тревоги;
  • 64-битной памяти типа ROM и блока обработки протокола 1-Wire;
  • внутреннего источника питания, способного работать как от внешнего источника, так и от «паразитных» импульсов.

Принцип работы

Основная функция микросхемы DS18B20 — трансформация показаний встроенного датчика температуры в цифровой код. Это преобразование зависит от разрешения преобразования, установленного пользователем, которое варьируется от 9 до 12 бит (0,5°–0,625°С). Если настройки не производились, то установка регистра конфигурации соответствует 12 битам.

В начальном состоянии DS18B20 находится в состоянии покоя или иными словами в низком энергетическом уровне. Для начала измерений микроконтроллер подает сигнал , после чего полученные данные сохраняются в регистр, а сам датчик переходит в режим «покоя».

При работе цифрового датчика температуры DS18B20 от независимого источника питания микроконтроллер способен контролировать процесс выполнения команды , которая осуществляет измерение температуры. Таким образом, датчик температуры DS18B20 сформирует логический «0» во время трансформации показаний температурного режима и логическую «1» в случае окончания процесса преобразования.

Если питание микросхемы осуществляется при помощи «паразитного метода», то контроль логических «0» и «1» невозможен, поскольку на шине будет постоянно дежурить высокий уровень напряжения питания.

После снятия и обработки сигнала с датчика температуры в микросхеме DS18B20 полученные данные в градусах Цельсия сохраняются в виде 16-битного числа с признаком (S), который отвечает за знак «+» или «-» температуры. Структура регистра температуры будет выглядеть так, как показано ниже.

Если показания температуры выше «0», то показатель S=0, если же значение температуры отрицательное, то S=1. Ниже представлена таблица соответствия данных и температуры.

Что вам понадобится для контроля температуры с помощью Arduino и DS18B20

Программное обеспечение

  • Естественно, вам необходима Arduino IDE;
  • Библиотека OneWire library, которая значительно облегчает работу с Arduino и датчиком DS18B20;
  • Скетч…

Оборудование

  • Как минимум один цифровой датчик температуры DS18B20;
  • Контроллер Arduino (в данном примере используется Arduino Uno);
  • 3 коннектора;
  • Монтажная плата (Breadboard);
  • USB кабель для подключения Arduino к персональному компьютеру.

Ссылки для заказа необходимого оборудования из Китая

USB кабель необходим для программирования нашего Arduino. После того, как вы «зальете» скетч на плату, можно подключать ее к отдельному источнику питания.

Описание работы термореле

В термореле датчиком температуры служит интегральная микросхема DS1820. Выход термодатчика DS1820 допускает втекающий ток до 4 мА, поскольку выход является ключом с открытым стоком. В связи с этим конструкция термореле получается предельно простой.

Специфика данного датчика в том, что измерение температуры производится в цифровом виде.  Датчик DS1820 способен измерять температуру от -55 до 125 гр. Так же  датчик способен работать в режиме термостата. У него имеются два цифровых регистра, в которые заносятся значения верхнего порога температуры (TH) и нижнего (TL).

В режиме термостатирование,  контроль за температурой происходит непрерывно. Датчик с частотой в 1 секунду производит сравнение фактической температуры с пороговыми значениями прописанные в регистры TL и TH.

В данной схеме, если текущее значение температуры превысит TH, то на выходе датчика DS1820  будет лог.1 что приведет к отключению нагрузки от сети. Если же температура опустится ниже TL то на выходе DS1820 появится лог. 0 и нагрузка будет включена.

Примечание. Если применить данную схему электронного термореле для управления работой компрессора холодильника, то выходной сигнал нужно будет инвертировать.

Питание DS1820 осуществляется от простого бестрансформаторного блока  питания через гасящий резистор Rl. Сигнал с выхода управляет оптосимистором через цепь R2, VT1, R3. В свою очередь оптосимистор VD1, управляет симистором VS1. Данный мощный симистор, для эффективной работы, необходимо разместить на радиаторе площадью не менее 40 кв. см.

Для устранения радиопомех, возникающих при включении симистора, в схему включены R5, С1 выполняющие роль фильтра НЧ. Свечение зеленого светодиода говорит о включении термореле к сети, а свечение красного светодиода свидетельствует о включении нагревателя.

Для записи температурных порогов в память датчика  необходимо использовать простой программатор. В роли температурного датчика так же возможно применить схожие по параметрам DS1821, DS18S20. В термореле применены конденсаторы К10-17 (СЗ), К52-1 (С4), К73-17В (Cl, С2).

Датчик DS1820 размещен внутри корпуса прибора, в связи с этим термореле обладает довольно большой инерционностью. В случае если такая инертность прибора не устраивает, тогда датчик DS1820 необходимо вынести наружу. Испытания термореле в балконном овощехранилище, которое длилось более двух лет, подтвердили его надежную работу. В роли нагревателя применялась электролампа накаливания в 250 Вт.

Примеры работы для Arduino

Один датчик

Рассмотрим простой пример — подключения одного датчика.

Сенсор подключается к управляющей плате через один сигнальный пин.
При подключении к Arduino в компактном формфакторе, например Arduino Micro или Iskra Nano Pro, воспользуйтесь макетной платой и парочкой нажимных клеммников.

Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.


При коммуникации сенсора со стандартными платами Arduino формата Rev3, Arduino Uno или Iskra Neo, используйте Troyka Slot Shield совместно с модулем подтяжки.

Код программы

Выведем температуру сенсора в Serial-порт.

simple.ino
// библиотека для работы с протоколом 1-Wire
#include <OneWire.h>
// библиотека для работы с датчиком DS18B20
#include <DallasTemperature.h>
 
// сигнальный провод датчика
#define ONE_WIRE_BUS 5
 
// создаём объект для работы с библиотекой OneWire
OneWire oneWire(ONE_WIRE_BUS);
 
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensor(&oneWire);
 
void setup(){
  // инициализируем работу Serial-порта
  Serial.begin(9600);
  // начинаем работу с датчиком
  sensor.begin();
  // устанавливаем разрешение датчика от 9 до 12 бит
  sensor.setResolution(12);
}
 
void loop(){
  // переменная для хранения температуры
  float temperature;
  // отправляем запрос на измерение температуры
  sensor.requestTemperatures();
  // считываем данные из регистра датчика
  temperature = sensor.getTempCByIndex();
  // выводим температуру в Serial-порт
  Serial.print("Temp C: ");
  Serial.println(temperature);
  // ждём одну секунду
  delay(1000);
}

Серия датчиков

Каждый сенсор DS18B20 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.

Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.

Код программы

Просканируем все устройства на шине и выведем температуру каждого сенсора отдельно в Serial-порт.

multipleSensors.ino
// библиотека для работы с протоколом 1-Wire
#include <OneWire.h>
// библиотека для работы с датчиком DS18B20
#include <DallasTemperature.h>
 
// сигнальный провод датчика
#define ONE_WIRE_BUS 5
 
// создаём объект для работы с библиотекой OneWire
OneWire oneWire(ONE_WIRE_BUS);
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensors(&oneWire);
// создаём указатель массив для хранения адресов датчиков
DeviceAddress *sensorsUnique;
// количество датчиков на шине
int countSensors;
 
// функция вывода адреса датчика
void printAddress(DeviceAddress deviceAddress){
  for (uint8_t i = ; i < 8; i++){
    if (deviceAddressi < 16) Serial.print("0");
    Serial.print(deviceAddressi, HEX);
  }
}
 
void setup(){
  // инициализируем работу Serial-порта
  Serial.begin(9600);
  // ожидаем открытия Serial-порта
  while(!Serial);
  // начинаем работу с датчиком
  sensors.begin();
  // выполняем поиск устройств на шине
  countSensors = sensors.getDeviceCount();
  Serial.print("Found sensors: ");
  Serial.println(countSensors);
  // выделяем память в динамическом массиве под количество обнаруженных сенсоров
  sensorsUnique = new DeviceAddresscountSensors;
 
  // определяем в каком режиме питания подключены сенсоры
  if (sensors.isParasitePowerMode()) {
    Serial.println("Mode power is Parasite");
  } else {
    Serial.println("Mode power is Normal");
  }
 
  // делаем запрос на получение адресов датчиков
  for (int i = ; i < countSensors; i++) {
    sensors.getAddress(sensorsUniquei, i);
  }
  // выводим полученные адреса
  for (int i = ; i < countSensors; i++) {
    Serial.print("Device ");
    Serial.print(i);
    Serial.print(" Address: ");
    printAddress(sensorsUniquei);
    Serial.println();
  }
  Serial.println();
  // устанавливаем разрешение всех датчиков в 12 бит
  for (int i = ; i < countSensors; i++) {
    sensors.setResolution(sensorsUniquei, 12);
  }
}
 
void loop(){
  // переменная для хранения температуры
  float temperature10;
  // отправляем запрос на измерение температуры всех сенсоров
  sensors.requestTemperatures();
  // считываем данные из регистра каждого датчика по очереди
  for (int i = ; i < countSensors; i++) {
    temperaturei = sensors.getTempCByIndex(i);
  }
  // выводим температуру в Serial-порт по каждому датчику
  for (int i = ; i < countSensors; i++) {
    Serial.print("Device ");
    Serial.print(i);
    Serial.print(" Temp C: ");
    Serial.print(temperaturei);
    Serial.println();
  }
  Serial.println();
  // ждём одну секунду
  delay(1000);
}

Proteus

Программа поддерживает два модуля:

  1. ISIS – для создания и имитации работы электронной схемы;
  2. ARES – для удобного размещения компонентов на плате, выбирая из широкого списка возможных компонентов во встроенной библиотеке.

Программа имеет в себе до шести тысяч эл. компонентов со всеми необходимыми справками на них и рекомендациями. Ресурсы программы позволяет визуализировать созданную плату и опробовать ее в работе в виртуальной среде. Там же найдя все уязвимости и неполадки, не перенося их на чистовую плату.

В этой программе создали уже не одну тысячу, а может и миллион программ, схем, плат. По ней обучаются студенты мировых инженерных вузов. Она максимально проста и эффективна.

В своей библиотеке она имеет, и ds18s20 с помощью которого создать ваше будущее творение становиться, возможно.

Рекомендуем купить

Характеристики и подключение датчиков DHT11 и DHT22

Датчик состоит из двух частей – емкостного датчика температуры и гигрометра. Первый используется для измерения температуры, второй – для влажности воздуха. Находящийся внутри чип может выполнять аналого-цифровые преобразования и выдавать цифровой сигнал, который считывается посредством микроконтроллера.

В большинстве случаев DHT11 или DHT22 доступен в двух вариантах: как отдельный датчик в виде пластикового корпуса с металлическими контактами или как готовый модуль с датчиком и припаянными элементами обвязки. Второй вариант гораздо проще использовать в реальных проектах и крайне рекомендуется для начинающих.

Датчик DHT11

  • Потребляемый ток – 2,5 мА (максимальное значение при преобразовании данных);
  • Измеряет влажность в диапазоне от 20% до 80%. Погрешность может составлять до 5%;
  • Применяется при измерении температуры в интервале от 0 до 50 градусов (точность – 2%)
  • Габаритные размеры: 15,5 мм длина; 12 мм широта; 5,5 мм высота;
  • Питание – от 3 до 5 Вольт;
  • Одно измерение в единицу времени (секунду). То есть, частота составляет 1 Гц;
  • 4 коннектора. Между соседними расстояние в 0,1 ”.

Датчик DHT22

  • Питание – от 3 до 5 Вольт;
  • Максимальный ток при преобразовании – 2,5 мА;
  • Способен измерять влажность в интервале от 0% до 100%. Точность измерений колеблется от 2% до 5%;
  • Минимальная измеряемая температура – минус 40, максимальная – 125 градусов по Цельсию (точность измерений – 0,5);
  • Устройство способно совершать одно измерение за 2 секунд. Частота – до 0,5 ГЦ;
  • Габаритные размеры: 15,1 мм длина; 25 мм широта; 5,5 мм высота;
  • Присутствует 4 коннектора. Расстояние между соседними – 0,1 ‘;

Очевидно, что при использовании в ардуино датчика температуры и влажности DHT11 устройство выдаст менее точные значения, чем DHT22. У аналога больший диапазон измеряемых значений, но и цена соответствующая. Датчик температуры и влажности DHT22, как и его аналог, имеет один цифровой выход, соответственно снимать показания можно не чаще, чем один раз в 1-2 секунды.

Examples of use:

Single DS1820 sensor

/*
 * Simple DS1820 sensor demo
 *
 * Note: Don't forget to connect a 4.7k Ohm resistor 
 *       between the DS1820's data pin and the +3.3V pin
 *
 */
 
#include "mbed.h"
#include "DS1820.h"
 
Serial serial(USBTX, USBRX);
 
int main() {
    DS1820  ds1820(D8);    // substitute D8 with actual mbed pin name connected to the DS1820 data pin    
                             
    if(ds1820.begin()) {
        while(1) {
            ds1820.startConversion();     // start temperature conversion
            ThisThread::sleep_for(1000);  // let DS1820 complete the temperature conversion
            serial.printf("temp = %3.1f\r\n", ds1820.read());     // read temperature
        }
    } else
        serial.printf("No DS1820 sensor found!\r\n");
}
 

Single DS1820 sensor. Data integrity is assured by performing CRC.

/*
 * Simple DS1820 sensor demo
 *
 * Note: Don't forget to connect a 4.7k Ohm resistor 
 *       between the DS1820's data pin and the +3.3V pin
 *
 */
 
#include "mbed.h"
#include "DS1820.h"
 
Serial serial(USBTX, USBRX);
 
int main() {
    DS1820  ds1820(D8);    // substitute D8 with actual mbed pin name connected to the DS1820 data pin   
    float   temp = 0;
    int     error = 0; 
                             
    if(ds1820.begin()) {
        while(1) {
            ds1820.startConversion();    // start temperature conversion
            ThisThread::sleep_for(1000); // let DS1820 complete the temperature conversion
            error = ds1820.read(temp);   // read temperature from DS1820 and perform cyclic redundancy check (CRC)
            switch(error) {
            case 0:    // no errors -> 'temp' contains the value of measured temperature
                serial.printf("temp = %3.1f\r\n", temp);
                break;
            case 1:    // no sensor present -> 'temp' is not updated
                serial.printf("no sensor present\n\r");
                break;
            case 2:    // CRC error -> 'temp' is not updated
                serial.printf("CRC error\r\n");
            } 
        }
    } else
        serial.printf("No DS1820 sensor found!\r\n");
}
 

Several DS1820 sensors connected to the same 1-wire bus.

/*
 * Multiple DS1820 sensor demo
 *
 * Note: Don't forget to connect a 4.7k Ohm resistor 
 *       between the 1-wire bus data line and the +3.3V rail
 *
 */
#include "mbed.h"
#include "DS1820.h"

#define     MAX_SENSOSRS   32   // max number of DS1820 sensors to be connected to the 1-wire bus (max 256)

DS1820*     ds1820;
Serial      pc(USBTX, USBRX);
DigitalOut  led(LED1);
OneWire     oneWire(D8);        // substitute D8 with the actual pin name connected to the 1-wire bus
int         sensorsFound = 0;   // counts the actually found DS1820 sensors

int main()
{
    pc.printf("\r\n--Starting--\r\n");
    
    //Enumerate (i.e. detect) DS1820 sensors on the 1-wire bus
    for (sensorsFound = 0; sensorsFound < MAX_SENSOSRS; sensorsFound++) {
        ds1820 = new DS1820(&oneWire);
        if (!ds1820->begin()) {
            delete ds1820;
            break;
        }
    }

    switch (sensorsFound) {
        case 0:
            pc.printf("No DS1820 sensor found!\r\n");
            return -1;

        case 1:
            pc.printf("One DS1820 sensor found.\r\n");
            break;

        default:
            pc.printf("Found %d DS1820 sensors.\r\n", sensorsFound);
    }

    while (1) {
        pc.printf("----------------\r\n");
        for (int i = 0; i < sensorsFound; i++)
            ds1820->startConversion();        // start temperature conversion from analog to digital
        ThisThread::sleep_for(1000);             // let DS1820 sensors complete the temperature conversion
        for (int i = 0; i < sensorsFound; i++) {
            if (ds1820->isPresent())
                pc.printf("temp = %3.1f%cC\r\n", i, ds1820->read(), 176); // read temperature
        }
    }
}

Оцените статью:
Оставить комментарий