这可能是最简单的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就开始显示被测环境的的温度数值。