原创 用DS18B20温度传感器和STM32蓝丸板实现远程测温

2022-6-2 09:08 1389 8 8 分类: 物联网 文集: 方案

这可能是最简单的STM32项目了,整个BOM只有DS18B20温度传感器、STM32蓝丸板和一个最平常的4.7k电阻器,外加一款面包板和几根杜邦线。也许有人说这简直就是浪费STM32资源,我说这是入门砖,了解了基本原理后面就是缤纷世界。


DS18B20智能型防水温度传感器


DS18B20是一款智能型防水温度传感器,用于测量-55 to 125°C之间液体温度。由于每个DS18B20包含一个独立IP序列号,多个DS18B20可共用同一条1-Wire总线。

DS18B20可以分别在93.75ms和750ms内完成9位和12位的数字量,信息读出或写入仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。

DS18B20传感器带有电缆和防水功能,可用来方便的测量潮湿环境,即使远距离测量也不会导致信号衰减,测量精度可达±0.5°C。DS18B20集成有12 bits ADC,可通过一个简单的数字引脚与任何MCU接口。



DS18B20传感器的不足之处是采用的Dallas 1-Wire协议有些复杂,需要较多代码才能通信。使用中,还要采用一个4.7k电阻器从VCC对数据进行上拉。


DS18B20与STM32F103C接口


DS18B20与STM32F103C蓝丸板的接口电路很简单,传感器由STM32蓝丸的3.3V引脚供电,GND引脚与蓝丸GND连接。数字引脚经过4.7K电阻器上拉后,连接于蓝丸板的PA8引脚。



DS18B20数字温度计提供9-12位(可编程设备温度读数)。由于DS18B20是单线通信,与STM32F103C MCU连接只有一条线,读写以及温度转换所需能量也可以从数据线本身获得。




DS18B20 -STM32代码


让STM32蓝丸板读取DS18B20感测的温度信息,可以各种方法上传如下代码,例如使用USB-TTL转换器模块以串口上传。


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;

}



上述代码上传后,Serial Monitor就开始显示被测环境的的温度数值。

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条