В этой статье мы рассмотрим подключение датчика температуры DS18B20 к плате STM32F103C8 (Blue Pill). Библиотека Arduino Dallas и библиотека OneWire не поддерживаются DS18B20. По этой причине нам приходится писать код без использования этих библиотек. В связи с этим код для работы с датчиком DS18B20 для STM32F103C8 немного длинный и сложный, а все режимы адресации определены в коде.
DS18B20 — это однопроводной водонепроницаемый датчик, используемый для измерения температуры жидкости (и не только) в диапазоне от -55 до 125°C. Питание для чтения, записи и выполнения преобразований температуры может быть получено от самой линии передачи данных без необходимости во внешнем источнике питания. Поскольку каждый DS18B20 содержит уникальный серийный номер, несколько датчиков DS18B20 могут работать на одной и той же шине 1-Wire.
Также ранее на нашем сайте мы рассматривали подключение датчика температуры DS18B20 к другим микроконтроллерам и платам:
Необходимые компоненты
- Плата STM32F103C8 (STM32 Blue Pill) (купить на AliExpress).
- Maxim Integrated DS18B20 Programmable Resolution (цифровой датчик температуры DS18B20) (купить на AliExpress).
- Резистор 4,7 кОм (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Водонепроницаемый цифровой датчик температуры DS18B20
Это предварительно подключенная и водонепроницаемая версия датчика DS18B20. Удобно, когда вам нужно измерить что-то на большом расстоянии или во влажных условиях. Датчик может измерять температуру в диапазоне от -55 до 125 °C (от -67 °F до +257 °F). Кабель покрыт оболочкой из ПВХ.
Поскольку он цифровой, нет ухудшения сигнала даже на больших расстояниях. Эти 1-проводные цифровые датчики температуры довольно точны, т. е. ±0,5°C в большей части диапазона. Он может выдавать до 12 бит точности от встроенного цифро-аналогового преобразователя. Они отлично работают с любым микроконтроллером, использующим один цифровой вывод.
Единственный недостаток в том, что они используют протокол Dallas 1-Wire, который довольно сложен и требует кучу кода для разбора коммуникации. Мы добавляем резистор 4,7 кОм, который требуется в качестве подтягивающего от линии DATA к линии VCC при использовании датчика.
Дополнительную информацию об этом датчике можно найти в техническом описании датчика DS18B20 .
Взаимодействие датчика температуры DS18B20 с STM32
Схема подключения датчика температуры DS18B20 к плате STM32F103C8 представлена на следующем рисунке.
Датчик питается от контакта 3,3 В STM32, а GND датчика подключен к GND STM32. Аналогично цифровой контакт подключен к контакту PA8 платы. Цифровой контакт подключен через резистор 4,7 кОм.
Исходный код программы
Загрузите следующий код на плату STM32F103C8 для считывания температуры, измеренной DS18B20. Вы можете использовать любой метод для загрузки кода. Я использовал последовательный метод и загрузил код с помощью модуля преобразователя USB-TTL.
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 87 88 89 90 |
int DSPIN = PA8; void setup() { // put your setup code here, to run once: Serial.begin(115200); } void loop() { // put your main code here, to run repeatedly: double temp = TempRead(); temp = temp * 0.0625; // conversion accuracy is 0.0625 / LSB Serial.print("Temperature: "); Serial.print(temp); Serial.println(" °C"); Serial.println(""); delay(500); } boolean DS18B20_Init() { pinMode(DSPIN, OUTPUT); digitalWrite(DSPIN, HIGH); delayMicroseconds(5); digitalWrite(DSPIN, LOW); delayMicroseconds(750);//480-960 digitalWrite(DSPIN, HIGH); pinMode(DSPIN, INPUT); int t = 0; while (digitalRead(DSPIN)) { t++; if (t > 60) return false; delayMicroseconds(1); } t = 480 - t; pinMode(DSPIN, OUTPUT); delayMicroseconds(t); digitalWrite(DSPIN, HIGH); return true; } void DS18B20_Write(byte data) { pinMode(DSPIN, OUTPUT); for (int i = 0; i < 8; i++) { digitalWrite(DSPIN, LOW); delayMicroseconds(10); if (data & 1) digitalWrite(DSPIN, HIGH); else digitalWrite(DSPIN, LOW); data >>= 1; delayMicroseconds(50); digitalWrite(DSPIN, HIGH); } } byte DS18B20_Read() { pinMode(DSPIN, OUTPUT); digitalWrite(DSPIN, HIGH); delayMicroseconds(2); byte data = 0; for (int i = 0; i < 8; i++) { digitalWrite(DSPIN, LOW); delayMicroseconds(1); digitalWrite(DSPIN, HIGH); pinMode(DSPIN, INPUT); delayMicroseconds(5); data >>= 1; if (digitalRead(DSPIN)) data |= 0x80; delayMicroseconds(55); pinMode(DSPIN, OUTPUT); digitalWrite(DSPIN, HIGH); } return data; } int TempRead() { if (!DS18B20_Init()) return 0; DS18B20_Write (0xCC); // Send skip ROM command DS18B20_Write (0x44); // Send reading start conversion command if (!DS18B20_Init()) return 0; DS18B20_Write (0xCC); // Send skip ROM command DS18B20_Write (0xBE); // Read the register, a total of nine bytes, the first two bytes are the conversion value int temp = DS18B20_Read (); // Low byte temp |= DS18B20_Read () << 8; // High byte return temp; } |
После загрузки кода откройте окно монитора последовательной связи и в нем немедленно начнет отображаться температура в комнате.