让STM32蓝丸板读取DS18B20感测的温度信息

今日头条

1113人已加入

描述

这可能是最简单的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

 

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

 

DS18B20

 

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;
}

 

DS18B20

 

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分