Андрей Смирнов
Время чтения: ~19 мин.
Просмотров: 4

Взаимодействие нескольких ds18b20, цифровых датчиков температуры, с arduino

Просадка напряжения

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

Первым делом решил добавить 2 конденсатора по 1000 мкф в надежде, что они уменьшат просадку напряжения при срабатывании реле. Первый поставил параллельно выходу с блока питания (там кстати уже был свой конденсатор, но второй лишним не будет, подумал я), а второй — установил параллельно выходу +5V на плате ардуино, откуда как раз берется питание для реле. С этого же выхода питается и сам микроконтроллер. Складывается логичная ситуация — когда все реле включаются одновременно, микроконтроллеру не хватает напряжения и он зависает.

После добавление конденсаторов зависания практически прекратились, но все же, 1 раз в месяц могло и зависнуть.

Подготавливаем программную часть на ПК с помощью Arduino IDE

Если у вас есть уже плата Arduino UNO и рассматриваемые датчики, то настало время настроить компьютер для того, чтобы он смог работать с микроконтроллером. Для этой задачи нам потребуется программный пакет Arduino IDE. Загрузить этот пакет можно на официальном сайте www.arduino.cc. На момент написания статьи последней версией пакета является ARDUINO 1.6.10. Сам же IDE мы будем использовать на ПК с операционной системой Windows 10. После загрузки IDE запустим установочный файл.

В стартовом окне установщика принимаем условия лицензионного соглашения и переходим к следующему окну.

В этом окне оставляем все как есть и продолжаем установку нажатием кнопки «Next >».

В этом окне можно выбрать путь установки для Arduino IDE, в нашем случае это папка по умолчанию. Выбрав путь, нажимаем кнопку «Install», которая запустит процесс установки.

После завершения установки на рабочем столе появится ярлык с именем Arduino.

Как видно из примера, установка Arduino IDE не многим отличается от установки других программ, единственное, что может смутить пользователя, это англоязычный интерфейс.

Пояснения к коду

  • Директивы для подключения библиотек включаются в начало программы.
  • В этом эксперименте мы подключаем библиотеку для того, чтобы использовать функцию взятия натурального логарифма x .
  • В переменных типа можно хранить дробные числа, числа с плавающей точкой.
  • При использовании переменных данного типа имейте в виду:
    • при операциях с их использованием, указывайте нулевую дробную часть у целых констант, как в примере
    • они могут принимать значения от -3.4028235×1038 до 3.4028235×1038,
    • при этом количество значащих цифр может быть 6-7: всех цифр, не только после запятой!
    • точность вычислений с такими данными невелика, у вас могут возникнуть неожиданные ошибки, например, при использовании в условном операторе. Не полагайтесь на точность!
    • вычисления с происходят медленнее, чем с целыми числами
  • Показания термистора связаны с температурой нелинейно, поэтому нам приходится использовать такую громоздкую формулу.

Подключаем датчик TMP36 к плате Arduino UNO

Датчик температуры TMP36 является бюджетной моделью компании Analog Devices. Поскольку для этого примера у нас отсутствовал сам датчик, то мы воспользовались интернет сервисом Autodesk Circuits, который позволяет эмулировать платы Ардуино. Этот пример будет особенно интересен тем пользователям, которые хотят попробовать Arduino до его покупки. Чтобы попасть в сервис Autodesk Circuits, необходимо перейти на интернет страницу https://circuits.io. На этой странице необходимо пройти процедуру быстрой регистрации, после чего вы попадете на главную страницу сервиса.

Чтобы создать новый проект, необходимо нажать кнопку «New Electronics Lab» на этой странице. После этого действия мы попадем в окно проекта.

Из окна проекта видно, что у нас присутствует только макетная плата. Чтобы добавить необходимые нам компоненты откроем панель «Components». Из этой панели мы добавим и соединим компоненты, как это показано на изображении ниже.

После сборки пакета перейдем в панель «Code Editor» и вставим текст, изображенный ниже.

Также обратите внимание на код. В нем имеются описания функций всех операций

Теперь попробуем запустить нашу плату. Для этого нажмем кнопку «Start Simulation», после чего мы увидим, как загорится зеленый светодиод. Чтобы проверить, что наш проект работает, мы откроем «Serial Monitor».

Из окна монитора видно, что наш виртуальный датчик измеряет показатели температуры.

Из примера видно, что сделать проект с датчиком TMP36 в Autodesk Circuits совсем несложно. Настоятельно рекомендуем новичкам перед реальным использованием Ардуино UNO и компонентов воспользоваться эмулятором Autodesk Circuits.

Исходный код программы

Сначала мы произведем подключение библиотек для работы с ЖК дисплеем и датчиком температуры (dht), а затем инициализируем контакты для подключения ЖК дисплея, датчика температуры и вентилятора.

Затем инициализируем все остальные нужные нам вещи в секции setup. А затем в секции loop мы будем использовать dht-функции для считывания значений с датчика температуры, извлекать из этих значений температуру, переводить ее в температуру по шкале Цельсия и отображать ее значение на ЖК дисплее.

После этого мы будем сравнивать значение температуры с заранее установленными нами температурными порогами (выше приведенная в тексте статьи таблица) и исходя из результатов сравнения будем генерировать соответствующее значение ШИМ на выходном контакте, к которому подключен транзистор, управляющий скоростью вращения вентилятора.

Для генерации ШИМ мы будем использовать функцию analogWrite(pin, PWM value). Мы будем использовать все 8 бит. Значение ШИМ будет эквивалентно аналоговому значения напряжения. То есть, к примеру, если мы хотим сгенерировать ШИМ с коэффициентом заполнения 20%, то мы в эту функцию (analogWrite) должны передать значение 255/5.

Далее приведен полный текст программы.

Arduino

#include<dht.h> // подключаем библиотеку для работы с датчиком
#include<LiquidCrystal.h> // подключаем библиотеку для работы с ЖК дисплеем

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
#define dht_dpin 12
dht DHT;
#define pwm 9
byte degree = // символ градуса для отображения на ЖК дисплее
{
0b00011,
0b00011,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
void setup()
{
lcd.begin(16, 2);
lcd.createChar(1, degree);
lcd.clear();
lcd.print(» Fan Speed «);
lcd.setCursor(0,1);
lcd.print(» Controlling «);
delay(2000);
analogWrite(pwm, 255);
lcd.clear();
lcd.print(«Circuit Digest «);
delay(2000);
}
void loop()
{
DHT.read11(dht_dpin); // считываем значение с выхода датчика температуры
int temp=DHT.temperature; // извлекаем из него температуру
lcd.setCursor(0,0);
lcd.print(«Temperature:»);
lcd.print(temp); // показываем значение температуры на ЖК дисплее
lcd.write(1);
lcd.print(«C»);
lcd.setCursor(0,1);
if(temp <26 )
{
analogWrite(9,0);
lcd.print(«Fan OFF «);
delay(100);
}

else if(temp==26)
{
analogWrite(pwm, 51);
lcd.print(«Fan Speed: 20% «); // скорость вращения 20%
delay(100);
}

else if(temp==27)
{
analogWrite(pwm, 102);
lcd.print(«Fan Speed: 40% «); // скорость вращения 40%
delay(100);
}

else if(temp==28)
{
analogWrite(pwm, 153);
lcd.print(«Fan Speed: 60% «); // скорость вращения 60%
delay(100);
}

else if(temp==29)
{
analogWrite(pwm, 204);
lcd.print(«Fan Speed: 80% «); // скорость вращения 80%
delay(100);
}
else if(temp>29)
{
analogWrite(pwm, 255);
lcd.print(«Fan Speed: 100% «); // скорость вращения 100%
delay(100);
}
delay(3000);
}

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
80
81
82
83
84

#include<dht.h>      // подключаем библиотеку для работы с датчиком
#include<LiquidCrystal.h> // подключаем библиотеку для работы с ЖК дисплеем
 

LiquidCrystallcd(7,6,5,4,3,2);

#define dht_dpin 12

dhtDHT;

#define pwm 9

bytedegree8=// символ градуса для отображения на ЖК дисплее

{

0b00011,

0b00011,

0b00000,

0b00000,

0b00000,

0b00000,

0b00000,

0b00000

};

voidsetup()

{

lcd.begin(16,2);

lcd.createChar(1,degree);

lcd.clear();

lcd.print(»   Fan Speed  «);

lcd.setCursor(,1);

lcd.print(»  Controlling «);

delay(2000);

analogWrite(pwm,255);

lcd.clear();

lcd.print(«Circuit Digest «);

delay(2000);

}

voidloop()

{

DHT.read11(dht_dpin);// считываем значение с выхода датчика температуры

inttemp=DHT.temperature;// извлекаем из него температуру

lcd.setCursor(,);

lcd.print(«Temperature:»);

lcd.print(temp);// показываем значение температуры на ЖК дисплее

lcd.write(1);

lcd.print(«C»);

lcd.setCursor(,1);

if(temp<26)

{

analogWrite(9,);

lcd.print(«Fan OFF            «);

delay(100);

}

elseif(temp==26)

{

analogWrite(pwm,51);

lcd.print(«Fan Speed: 20%   «);// скорость вращения 20%

delay(100);

}

elseif(temp==27)

{

analogWrite(pwm,102);

lcd.print(«Fan Speed: 40%   «);// скорость вращения 40%

delay(100);

}

elseif(temp==28)

{

analogWrite(pwm,153);

lcd.print(«Fan Speed: 60%   «);// скорость вращения 60%

delay(100);

}

elseif(temp==29)

{

analogWrite(pwm,204);

lcd.print(«Fan Speed: 80%    «);// скорость вращения 80%

delay(100);

}

elseif(temp>29)

{

analogWrite(pwm,255);

lcd.print(«Fan Speed: 100%   «);// скорость вращения 100%

delay(100);

}

delay(3000);

}

Библиотека OneWire для работы с DS18B20

DS18B20 использует для обмена информацией с ардуино протокол 1-Wire, для которого уже написана отличная библиотека. Можно и нужно использовать ее, чтобы не реализовывать все функции вручную. Скачать OneWire можно здесь. Для установки библиотеки скачайте архив, распакуйте в папку library вашего каталога Arduino. Подключается библиотека с помощью команды #include <OneWire.h>

Основные команды библиотеки OneWire:

  • search(addressArray) – ищет температурный датчик, при нахождении в массив addressArray записывается его код, в ином случае – false.
  • reset_search() – производится поиск на первом приборе.
  • reset() – выполнение сброса шины перед тем, как связаться с устройством.
  • select(addressArray) – выбирается устройство после операции сброса, записывается его ROM код.
  • write(byte) – производится запись байта информации на устройство.
  • write(byte, 1) – аналогично write(byte), но в режиме паразитного питания.
  • read() – чтение байта информации с устройства.
  • crc8(dataArray, length) – вычисление CRC кода. dataArray – выбранный массив, length – длина кода.

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

Для внешнего питания в строке 65 должно быть записано ds.write(0x44).

Write позволяет передать команду на термодатчик. Основные команды, подаваемые в виде битов:

  • 0x44 – измерить температуру, записать полученное значение в SRAM.
  • 0x4E – запись 3 байта в третий, четвертый и пятый байты SRAM.
  • 0xBE – последовательное считывание 9 байт SRAM.
  • 0х48 – копирование третьего и четвертого байтов SRAM в EEPROM.
  • 0xB8 – копирование информации из EEPROM в третий и четвертый байты SRAM.
  • 0xB4 – возвращает тип питания (0 – паразитное, 1 – внешнее).

Подключение DS18B20 к Arduino

DS18B20 является цифровым датчиком. Цифровые датчики передают значение измеряемой температуры в виде определенного двоичного кода, который поступает на цифровые или аналоговые пины ардуино и затем декодируется. Коды могут быть самыми разными, ds18b20 работает по протоколу данных 1-Wire. Мы не будем вдаваться в подробности этого цифрового протокола, укажем лишь необходимый минимум для понимания принципов взаимодействия.

Обмен информацией в 1-Wire происходит благодаря следующим операциям:

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

Для работы с датчиком нам понадобится программное обеспечение:

  • Arduino IDE;
  • Библиотека OneWire, если используется несколько датчиков на шине, можно использовать библиотеку DallasTemperature. Она будет работать поверх OneWire.

Из оборудования понадобятся:

  • Один или несколько датчиков DS18B20;
  • Микроконтроллер Ардуино;
  • Коннекторы;
  • Резистор на 4,7 кОм (в случае подключения одного датчика пойдет резистор номиналом от 4 до 10K);
  • Монтажная плата;
  • USB-кабель для подключения к компьютеру.

К плате Ардуино UNO датчик подключается просто: GND с термодатчика присоединяется к GND Ардуино, Vdd подключается к 5V, Data – к любому цифровому пину.

Простейшая схема подключения цифрового датчика DS18B20 представлена на рисунке.

В режиме паразитного питания контакт Vdd с датчика подключается к GND на Ардуино – в этом случае пригодятся только два провода. Работу в паразитном режиме лучше не использовать без необходимости, так как могут ухудшиться быстродействие и стабильность.

Монтажная схема

Соберите схему согласно монтажной схеме.

Подключение дисплея:

Контакт ЖК-дисплея Обозначение контакта ЖК-дисплея Место подключения
1 Vss плата Arduino: Земля, GND
2 Vdd плата Arduino: Питание, +5В, 5V
3 Vo Средний контакт потенциометра
4 Rs плата Arduino: 2ой цифровой контакт
5 RW плата Arduino: Земля, GND
6 En плата Arduino: 3ий цифровой контакт
7 D0 Линия передачи данных 0 (не используется)
8 D1 Линия передачи данных 1 (не используется)
9 D2 Линия передачи данных 2 (не используется)
10 D3 Линия передачи данных 3 (не используется)
11 D4 плата Arduino: 4ый цифровой контакт
12 D5 плата Arduino: 5ый цифровой контакт
13 D6 плата Arduino: 6ой цифровой контакт
14 D7 плата Arduino: 7ой цифровой контакт
15 A плата Arduino: Питание, +5В, 5V
16 K плата Arduino: Земля, GND

Распиновка параллельного ЖК-дисплея

Контакт Обозначение Назначение
1 Vss Земля
2 Vdd Питание, +5В
3 Vo Настройка контрастности
4 Rs Выбор режима(командный или отображение данных)
5 RW Чтение/запись
6 En Готовность данных
7 D0 Линия передачи данных 0 (не используется)
8 D1 Линия передачи данных 1 (не используется)
9 D2 Линия передачи данных 2 (не используется)
10 D3 Линия передачи данных 3 (не используется)
11 D4 Линия передачи данных 4
12 D5 Линия передачи данных 5
13 D6 Линия передачи данных 6
14 D7 Линия передачи данных 7
15 A Анод подсветки
16 K Катод подсветки

Распиновка I2C-датчика температуры TC74A0-5.0VAT

Работа с библиотекой DallasTemperature

Библиотека для Arduino DallasTemperature Sensors OneWire значительно облегчает и упрощает работу с сенсором DS18B20. Описание библиотеки DallasTemperature.h на русском говорит, что датчик управляется несколькими простыми функциями, которые представлены в следующем скетче. Схема подключения датчика не меняется, а скачать библиотеку DallasTemperature.h для Ардуино можно на нашем сайте здесь.

Скетч для датчика ds18b20 Ардуино

#include <OneWire.h>
#include <DallasTemperature.h>
 
OneWire oneWire(15);  // порт подключения датчика (A1)
DallasTemperature ds(&oneWire);

void setup() {
  Serial.begin(9600);   // инициализация монитора порта
  ds.begin();                 // инициализация датчика ds18b20
}

void loop() {
  ds.requestTemperatures();                       // считываем температуру с датчика
  
  Serial.print(ds.getTempCByIndex(0));   // выводим температуру на монитор
  Serial.println("C");
}

Скетч для нескольких датчиков на одной шине

Подключите несколько термодатчиков DS18B20 к микроконтроллеру согласно схеме, и загрузите скетч для датчика температуры ds18b20 к Arduino UNO.

#include <OneWire.h>
#include <DallasTemperature.h>
 
OneWire oneWire(15);  // порт подключения датчиков (A1)
DallasTemperature ds(&oneWire);

byte num;              // количество подключенных датчиков

void setup() {
  Serial.begin(9600);   // инициализация монитора порта
  ds.begin();                 // инициализация датчика ds18b20

  num = ds.getDeviceCount();   // узнаем количество датчиков 
  Serial.print("Number: ");           // выводим полученное количество
  Serial.println(num);
}

void loop() {
// выполняем цикл столько, сколько найдено датчиков на шине
 for (byte i = 0; i < num; i++){
    Serial.print("Sensor ");
    Serial.print(i);
    Serial.print(": ");
    ds.requestTemperatures();                       // считываем температуру с датчика
    Serial.print(ds.getTempCByIndex(i));
    Serial.println("C");
  } 
Serial.println(""); 
}

Исходный код программы

Полный код программы представлен в конце статьи, здесь же сначала рассмотрим его наиболее важные фрагменты.

Для выполнения математических операций в программе мы должны подключить заголовочный файл библиотеки “#include <math.h>”, а для работы с ЖК дисплеем – подключить библиотеку “#include <LiquidCrystal.h>«. Далее в функции setup() мы должны инициализировать ЖК дисплей.

Arduino

Void setup(){
lcd.begin(16,2);
lcd.clear();
}

1
2
3
4

Voidsetup(){

lcd.begin(16,2);

lcd.clear();

}

Значение температуры мы будем рассчитывать в программе с помощью рассмотренного выше уравнения Стейнхарта-Харта.

Arduino

float a = 1.009249522e-03, b = 2.378405444e-04, c = 2.019202697e-07;
float T,logRt,Tf,Tc;
float Thermistor(int Vo) {
logRt = log(10000.0*((1024.0/Vo-1)));
T = (1.0 / (A + B*logRt + C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Stein-Hart
Tc = T — 273.15; // переводим температуру из кельвинов в градусы Цельсия
Tf = (Tc * 1.8) + 32.0; // переводим температуру в шкалу Фаренгейта
return T;
}

1
2
3
4
5
6
7
8
9

floata=1.009249522e-03,b=2.378405444e-04,c=2.019202697e-07;

floatT,logRt,Tf,Tc;

floatThermistor(intVo){

logRt=log(10000.0*((1024.0Vo-1)));

T=(1.0(A+B*logRt+C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Stein-Hart

Tc=T-273.15;// переводим температуру из кельвинов в градусы Цельсия

Tf=(Tc*1.8)+32.0;// переводим температуру в шкалу Фаренгейта

returnT;

}

Также в программе мы считываем значение с аналогового входа платы Arduino.

Arduino

lcd.print((Thermistor(analogRead(0))));

1 lcd.print((Thermistor(analogRead())));

Внешний вид работы нашего проекта показан на следующем рисунке – на ЖК дисплее выводятся значения температуры в кельвинах, градусах Цельсия и по шкале Фаренгейта.

Схему можно запитать по кабелю USB или использовать адаптер на 12 В.

Далее представлен полный текст программы.

Arduino

#include <math.h>
#include «LiquidCrystal.h»
LiquidCrystal lcd(44,46,40,52,50,48);
float A = 1.009249522e-03, B = 2.378405444e-04, C = 2.019202697e-07;
float T,logRt,Tf,Tc;
float Thermistor(int Vo) { // функция для расчета значения температуры
logRt = log(10000.0*((1024.0/Vo-1)));
T = (1.0 / (A + B*logRt + C*logRt*logRt*logRt)); // рассчитываем значение температуры в кельвинах по формуле Стейнхарта-Харта
Tc = T — 273.15; // переводим температуру из кельвинов в градусы
Tf = (Tc * 1.8) + 32.0; // переводим температуру в шкалу Фаренгейта
return T;
}
void setup(){
lcd.begin(16,2);
lcd.clear();
}
void loop()
{
lcd.setCursor(0,0);
lcd.print(«Temp:»);
lcd.print((Thermistor(analogRead(0))));
lcd.print(«k «);

lcd.setCursor(0,1);
lcd.print((Tc));
lcd.print(» C ;»);
lcd.setCursor(9,1);
lcd.print((Tf));
lcd.print(» F»);
delay(800);
}

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

#include <math.h>
#include «LiquidCrystal.h»

LiquidCrystallcd(44,46,40,52,50,48);

floatA=1.009249522e-03,B=2.378405444e-04,C=2.019202697e-07;

floatT,logRt,Tf,Tc;

floatThermistor(intVo){// функция для расчета значения температуры

logRt=log(10000.0*((1024.0Vo-1)));

T=(1.0(A+B*logRt+C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Стейнхарта-Харта

Tc=T-273.15;// переводим температуру из кельвинов в градусы

Tf=(Tc*1.8)+32.0;// переводим температуру в шкалу Фаренгейта

returnT;

}

voidsetup(){

lcd.begin(16,2);

lcd.clear();

}

voidloop()

{

lcd.setCursor(,);

lcd.print(«Temp:»);

lcd.print((Thermistor(analogRead())));

lcd.print(«k «);

lcd.setCursor(,1);

lcd.print((Tc));

lcd.print(» C ;»);

lcd.setCursor(9,1);

lcd.print((Tf));

lcd.print(» F»);

delay(800);

}

Скетч для 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»);

}

Связанные материалы

Компрессор для покраски из холодильного агрегата…
Изготовление компрессора послужила статья из журнала «Моделист-Конструктор» Статья прилагается….

USB адаптер для чтения и программирования цифровых термостатов MAXIM/DALLAS DS1821…
В статье описано, как за час сделать простой USB-адаптер для чтения/записи цифровых термометров…

Термостат для отопления дачи инфракрасными обогревателями Иколайн. Дежурный режим, часы. DS1307, DS1631, Atmega8, энкодер…
Как говорит мой коллега, что бы Гаврилов ни делал — все равно термометр получается… Новая статья об…

Автоматическое включение/выключение сабвуфера на микроконтроллере PIC12F675…
Проект разрабатывался для сабвуфера, предполагалось его автоматическое включение при появлении…

Простейший кодовый замок на реле, для начинающих…
Начну с того, что на работе у меня стоял какой-то древний самодельный кодовый замок, который уже не…

Немного про шину 1-Wire и цифровой термометр DS18b20…
Здравствуйте, друзья. Хочу предложить вашему вниманию несколько простых функций для работы с шиной…

Блок автоматического селектора входов и управления питанием усилителя на PIC12F675…
Хочу предложить продолжение проекта Автоматическое включение/выключение сабвуфера на…

Простой цифровой термометр на ATmega8535 + DS18B20…
Доброго времени суток! Представляю простой, цифровой термометр на индикаторе ИЖЦ21-4/7,…

Фото-реле на микроконтроллере ATTiny13…
Привет датагорцам! Я затеял ремонтные работы дома, и мне понадобилась система автоматического…

Блок управления на PIC12F629 для дневных ходовых огней (ДХО) автомобиля…
Делал я как-то раз одну систему для автомашины, не своей правда. Так вот, эта система определяла…

Схемка в блокнот. Реле времени на КМОП микросхемах…
Иногда возникает необходимость отключать (или включать) нагрузку по истечении определенного…

Простой Soft-start для усилителя мощности ЗЧ…
Это простое приспособление позволяет повысить надежность УМЗЧ и уменьшить помехи в сети в момент…

Пищевая и энергетическая ценность:

Выводы

Микросхема Dallas DS18B20 является очень интересным устройством. Датчики температуры и термометры, созданные на ее основе, обладают приемлемыми для большинства задач характеристиками, развитым функционалом, относительно не дороги. Особенную популярность датчик DS18B20 снискал как влагозащищенное устройство для измерения температуры жидкостей.

За дополнительные возможности приходится платить относительной сложностью работы с датчиком. Для подключения DS18B20 нам обязательно понадобится резистор с номиналом около 5К. Для работы с датчиком в скетчах ардуино нужно установить дополнительную библиотеку и получить определенные навыки для работы с ней – там все не совсем тривиально. Впрочем, можно купить уже готовый модуль, а для скетча в большинстве случаев хватит простых примеров, приведенных в этой статье.

Подводим итог

В этой статье мы рассмотрели два примера подключения физических датчиков измерения DS18B20, LM35 к печатной плате Arduino UNO. Кроме этого, мы рассмотрели вариант виртуальной сборки схемы с использованием датчика TMP36. Во всех примерах мы представили вывод температурных показателей только через «Монитор порта». Это было сделано специально, чтобы максимально упростить схему сборки. На просторах сети можно найти сотни примеров, где можно использовать такие варианты подключения:

  • Превращение смартфона в термометр, благодаря снятию температурных показателей на его экране или ПК с различных датчиков, используя Wi-Fi модуль для Arduino;
  • Превращение смартфона в термометр, благодаря снятию температурных показателей на его экране или ПК с различных датчиков, используя Bluetooth модуль для Arduino;
  • Создание термостата со светодиодной индикацией;
  • Создание термометра на базе Arduino и TFT дисплея;
  • Получение температурных показателей с помощью Arduino через интернет.

Это лишь малая доля примеров, с помощью которых пользователь может получать температурные показатели через плату Arduino. Используя Ардуино, в наше время каждый может воплотить в реальность концепцию умного дома. Надеемся, наш материал будет полезным для вас, и благодаря ему, вы сможете подключить температурные датчики к своей плате Arduino.

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации