ESP8266-Arduino编程实例-OLED显示DS18B20传感器数据

OLED显示DS18B20传感器数据

1、应用实例介绍

本次实例将演示如何在OLED中显示DS18B20温度传感器的数据。实例主要分两步来完成:

  1. DS18B20传感器驱动,采集温度
  2. OLED驱动,显示采集到的温度值。

在前面的文章中,对DS18B20的应用和驱动做了介绍,请参考:

在前面的文章中,对OLED的应用和驱动做了介绍,请参考:

2、硬件准备

  • ESP8266 NodeMCU开发板一块
  • DS18B20传感器模块一个
  • OLED(SSD1306)模块一个
  • 面板板一个
  • 杜邦线若干
  • 数据线一条

硬件接线如下:

在这里插入图片描述

3、软件准备

  • Arduino IDE或VSCode + PlatformIO

在前面的文章中,对如何搭建ESP8266开发环境做了详细的介绍,请参考:

ESP8266 NodeMCU的引脚介绍在前面的文章中做了详细的介绍,请参考:

4、代码实现

本次使用的OLED驱动库如下:

本次使用的OneWire驱动库如下:

1)导入依赖库头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <OneWire.h>
#include <SPI.h>
#include <SFE\_MicroOLED.h>

// DS18B20传感器
OneWire ds(D0);

#define PIN\_RESET D3
#define PIN\_DC D4
#define PIN\_CS D8

MicroOLED oled(PIN_RESET, PIN_DC, PIN_CS);

2)设备初始化

1
2
3
4
5
6
7
8
void setup(void) 
{
Serial.begin(9600); // 串口初始化
oled.begin(); // OLED初始化
oled.clear(ALL); // 清屏
oled.display();
}

3)数据采集与显示

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
void loop(void) 
{
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;

if ( !ds.search(addr))
{
ds.reset\_search();
delay(250);
return;
}

if (OneWire::crc8(addr, 7) != addr[7])
{
Serial.println("CRC is not valid!");
return;
}

// the first ROM byte indicates which chip
switch (addr[0])
{
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}

ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000);
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad

for ( i = 0; i < 9; i++)
{
data[i] = ds.read();
}

// Convert the data to actual temperature
int16\_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10)
{
raw = (raw & 0xFFF0) + 12 - data[6];
}
}
else
{
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms

}
oled.clear(PAGE);
oled.setFontType(0); // set font type 0, please see declaration in SFE\_MicroOLED.cpp
oled.setCursor(1, 3);
celsius = (float)raw / 16.0;
fahrenheit = celsius \* 1.8 + 32.0;
oled.print("Cels = ");
oled.setCursor(1, 12);
oled.print(celsius);
oled.print(" \*C");
oled.setCursor(1, 21);
oled.print("Fahr =");
oled.setCursor(1, 30);
oled.print(fahrenheit);
oled.print(" \*F");
oled.display();

}

文章来源: https://iotsmart.blog.csdn.net/article/details/127699372