Главная страница

ардуино. OneWire ds(8) Создаем объект OneWire для шины 1Wire, с помощью которого будет осуществляться работа с датчиком


Скачать 78.44 Kb.
НазваниеOneWire ds(8) Создаем объект OneWire для шины 1Wire, с помощью которого будет осуществляться работа с датчиком
Анкорардуино
Дата06.03.2023
Размер78.44 Kb.
Формат файлаdocx
Имя файла111.docx
ТипДокументы
#970899

OneWire ds(8); // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком

 

void setup(){

  Serial.begin(9600);

}

 

void loop(){

  // Определяем температуру от датчика DS18b20

  byte data[2]; // Место для значения температуры

   

  ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров

  ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство

  ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память

   

  delay(1000); // Микросхема измеряет температуру, а мы ждем. 

   

  ds.reset(); // Теперь готовимся получить значение измеренной температуры

  ds.write(0xCC);

  ds.write(0xBE); // Просим передать нам значение регистров со значением температуры

 

  // Получаем и считываем ответ

  data[0] = ds.read(); // Читаем младший байт значения температуры

  data[1] = ds.read(); // А теперь старший

 

  // Формируем итоговое значение:

  //    - сперва "склеиваем" значение,

  //    - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625)

  float temperature =  ((data[1] << 8) | data[0]) * 0.0625;

   

  // Выводим полученное значение температуры в монитор порта

  Serial.println(temperature);

    

}

Скетч для работы с датчиком ds18b20 без delay

Можно немного усложнить программу для ds18b20, чтобы избавиться от функции delay(), тормозящей выполнение скетча.

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

#include

 

OneWire ds(8); // Объект OneWire

 

int temperature = 0; // Глобальная переменная для хранения значение температуры с датчика DS18B20

 

long lastUpdateTime = 0; // Переменная для хранения времени последнего считывания с датчика

const int TEMP_UPDATE_TIME = 1000; // Определяем периодичность проверок

 

void setup(){

  Serial.begin(9600);

}

 

void loop(){

  detectTemperature(); // Определяем температуру от датчика DS18b20

  Serial.println(temperature); // Выводим полученное значение температуры

  // Т.к. переменная temperature имеет тип int, дробная часть будет просто отбрасываться

}

 

int detectTemperature(){

 

  byte data[2];

  ds.reset();

  ds.write(0xCC);

  ds.write(0x44);

 

  if (millis() - lastUpdateTime > TEMP_UPDATE_TIME)

  {

    lastUpdateTime = millis();

    ds.reset();

    ds.write(0xCC);

    ds.write(0xBE);

    data[0] = ds.read();

    data[1] = ds.read();

 

    // Формируем значение

    temperature = (data[1] << 8) + data[0]; temperature = temperature >> 4;

  }

}

Библиотека DallasTemperature и DS18b20

В своих скетчах мы можем использовать библиотеку DallasTemperature, упрощающую некоторые аспекты работы с датчиком ds18b20 по 1-Wire. Пример скетча:

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

85

86

#include

#include

 

// Номер пина Arduino с подключенным датчиком

#define PIN_DS18B20 8

 

// Создаем объект OneWire

OneWire oneWire(PIN_DS18B20);

 

// Создаем объект DallasTemperature для работы с сенсорами, передавая ему ссылку на объект для работы с 1-Wire.

DallasTemperature dallasSensors(&oneWire);

 

// Специальный объект для хранения адреса устройства

DeviceAddress sensorAddress;

 

void setup(void){

  Serial.begin(9600);

  Serial.println("Пример работы с датчиком температуры ds18b20 с помощью библиотеки DallasTemperature");

 

  // Выполняем поиск устрйоств на линии

  Serial.print("Ищем устройства...");

  dallasSensors.begin();

  Serial.print("Найдено ");

  Serial.print(dallasSensors.getDeviceCount(), DEC);

  Serial.println(" устройств.");

 

  // Определяем режим питания (по отдельной линии или через паразитное питание по линии данных)

  Serial.print("Режим паразитного питания: ");

  if (dallasSensors.isParasitePowerMode()) Serial.println("ВКЛЮЧЕН");

  else Serial.println("ВЫКЛЮЧЕН");

 

  // Раскомментируйте, если хотите задать адрес устройства вручную

  //sensorAddress = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };

 

  // Поиск устройства:

  // Ищем адрес устройства по порядку (индекс задается вторым параметром функции)

  if (!dallasSensors.getAddress(sensorAddress, 0)) Serial.println("Не можем найти первое устройство");

 

  // Второй вариант поиска с помощью библиотеки OnewWire.

  // Перезапускаем поиск

  //oneWire.reset_search();

  // Находим первое устройство и запоминаем его адрес в sensorAddress

  //if (!oneWire.search(sensorAddress)) Serial.println("Unable to find address for sensorAddress");

 

  // Отображаем адрес ds18b20, который мы нашли

  Serial.print("Адрес устройства: ");

  printAddress(sensorAddress);

  Serial.println();

 

  // Устанавливаем разрешение датчика в 12 бит (мы могли бы установить другие значения, точность уменьшится, но скорость получения данных увеличится

  dallasSensors.setResolution(sensorAddress, 12);

 

  Serial.print("Разрешение датчика: ");

  Serial.print(dallasSensors.getResolution(sensorAddress), DEC);

  Serial.println();

}

 

void loop(void){

  // Запрос на измерения датчиком температуры

 

  Serial.print("Измеряем температуру...");

  dallasSensors.requestTemperatures(); // Просим ds18b20 собрать данные

  Serial.println("Выполнено");

 

  //  Запрос на получение сохраненного значения температуры

  printTemperature(sensorAddress);

 

  // Задержка для того, чтобы можно было что-то разобрать на экране

  delay(1000);

}

 

// Вспомогательная функция печати значения температуры для устрйоства

void printTemperature(DeviceAddress deviceAddress){

  float tempC = dallasSensors.getTempC(deviceAddress);

  Serial.print("Temp C: ");

  Serial.println(tempC);

}

 

// Вспомогательная функция для отображения адреса датчика ds18b20

void printAddress(DeviceAddress deviceAddress){

  for (uint8_t i = 0; i < 8; i++)

  {

    if (deviceAddress[i] < 16) Serial.print("0");

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

  }

}

 

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

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

Основные команды библиотеки 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 к Ардуино

Все датчики DS18B20 подключаются параллельно, для них всех достаточно одного резистора.  При помощи библиотеки OneWire можно одновременно считать все данные со всех датчиков. Если количество подключаемых датчиков более 10, нужно подобрать резистор с сопротивлением не более 1,6 кОм. Также для более точного измерения температуры нужно поставить дополнительный резистор на 100…120 Ом между выходом data на плате Ардуино и data на каждом датчике. Узнать, с какого датчика получено то или иное значение, можно с помощью уникального серийного 64-битного кода, который будет выдан в результате выполнения программы.

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



В режиме паразитного питания схема выглядит иначе. Контакт Vdd практически не задействован, питание идет через выход data.



 

Выводы


написать администратору сайта