在本项目中,我们将开发一个家庭气象站,将显示室内信息,如温度和空气湿度。
那么 ,我们开始吧。
目录
第一步 准备材料
- NodeMCU ESP8266-12E开发板
- 0.96“I2C IIC SPI串行128X64白色OLED显示模块
- DHT22 AM2302温湿度传感器
- USB数据线
- 若干杜邦线
- 外部5V电源或电池
第三步 硬件搭建
SSD1306,其主要特点是:
显示尺寸:0.96“
I2C IIC SPI串行
128X64
白色OLED
将OLED引脚连接到NodeMCU,如上面的电路图所示:
SDA ==> D1(5)
SCL * ==> D2(4)
VCC ==> SSD1306可以直接从NodeMCU模块用5V(外部)或3.3V供电。
GND ==> GND
显示器连接完整之后,就需要进入编程的时间了。
第四步 开始编程
首先,这个项目的SSD1306需要使用一个针对ESP8266的库来进行驱动,你需要把它下载下来并且安装上去。
下载地址:
该库支持I2C协议,使用内置的Wire.h库访问OLED显示器:
#include
#include "SSD1306.h"
SSD1306 display(ADDRESS, SDA, SDC);
接下来将列出一些一些将与我们的OLED显示器一起使用的重要API:
A.显示控制:
B.像素绘图:
C.文本操作:
D.框架(“UI库”):
Ui库用于提供一组基本的Ui元素,称为帧和叠加。Frame用于提供信息,默认行为是在定义的时间内显示Frame,然后移动到下一个(如“Pages”)。该库还提供了相应更新的指标。另一方面,覆盖是始终在相同位置显示的一条信息(例如,时钟)。
一旦安装了OLED库,我们可以编写一个简单的“Hello World”程序来测试它。在IDE上输入以下代码,结果应该是显示,如下图所示:
/* Hello World OLED Test */
#include // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`
SSD1306 display(0x3c, 5, 4); // Initialise the OLED display using Wire library
void setup()
{
Serial.begin(115200);
display.init(); // Initialising the UI will init the display too.
display.flipScreenVertically();
display.clear();
drawHelloWorld();
display.display();
}
void loop()
{
}
void drawHelloWorld()
{
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_10);
display.drawString(0, 0, "Hello world");
display.setFont(ArialMT_Plain_16);
display.drawString(0, 10, "Hello world");
display.setFont(ArialMT_Plain_24);
display.drawString(0, 26, "Hello world");
}
上传程序之前,需要把程序里面的OLED的引脚连接改过来:
// Initialise the OLED display using Wire library
SSD1306 display(0x3c, 5, 4);
上面的结果输出正确的话,我们就可以开始进入真正的项目了。
第四步 获取室内数据
首先,你需要把其它几个传感器连接好:
我们将安装数字温度/湿度型传感器。可以是DHTxx(DHT11或DHT22)系列的温湿度传感器。
连接方式请看上图。
原理说明:
概观
低成本的DHT温度和湿度传感器非常普通,而且速度也比较慢,但对于想要进行基本数据记录的业余爱好者来说非常棒。DHT传感器由两部分组成,电容式湿度传感器和热敏电阻。内部还有一个非常简单的芯片可以进行模拟到数字量的转换,并在检测温度和湿度下发出数字信号。使用任何微控制器都可以轻松读取数字信号。
DHT11与DHT22
我们有两个版本的DHT传感器,它们看起来有点相似并具有相同的引脚排列,但具有不同的特性。以下是规格:
DHT11:
- 超低成本
- 3至5V电源和I / O.
- 转换期间使用2.5mA最大电流(同时请求数据)
- 适用于20-80%湿度读数,准确度为5%
- 适用于0-50°C温度读数±2°C精度
- 采样率不超过1 Hz(每秒一次)
- 尺寸15.5mm x 12mm x 5.5mm
- 4个引脚,间距为0.1“
DHT22:
- 低成本
- 3至5V电源和I / O.
- 转换期间使用2.5mA最大电流(同时请求数据)
- 适用于0-100%湿度读数,精度为2-5%
- 适用于-40至125°C的温度读数±0.5°C精度
- 采样率不超过0.5 Hz(每2秒一次)
- 尺寸15.1mm x 25mm x 7.7mm
- 4个引脚,间距为0.1“
正如您所看到的,DHT22在更大的范围内更准确,更好。两者都使用单个数字引脚并且数据检测“缓慢”,因为您不能每秒查询一次(DHT11)或两次(DHT22)。
两个传感器都能正常工作,以便在我们的家庭气象站上显示室内信息。
DHTxx有4个引脚(面向传感器,引脚1最左边):
- VCC(我们可以从NodeMCU连接外部5V或3.3V);
- 数据输出;
- 未连接
- 接地。
数据和VCC引脚之间应连接一个10K欧姆的电阻。输出引脚将连接到NodeMCU引脚D3(参见上图)。
让我们定义我们的传感器参数及其相关变量(我们将首先使用DHT22):
/* DHT22 */
#include "DHT.h"
#define DHTPIN D3
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
int localHum = 0;
int localTemp = 0;
现在,让我们创建一个函数来读取它的数据:
获得数据后,让我们将它们呈现在OLED显示屏上:
/***************************************************
* Draw Indoor Page
****************************************************/
void drawDHT()
{
int x=0;
int y=0;
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0 + x, 5 + y, "Hum");
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(43 + x, y, "INDOOR");
display.setFont(ArialMT_Plain_24);
String hum = String(localHum) + "%";
display.drawString(0 + x, 15 + y, hum);
int humWidth = display.getStringWidth(hum);
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(95 + x, 5 + y, "Temp");
display.setFont(ArialMT_Plain_24);
String temp = String(localTemp) + "°C";
display.drawString(70 + x, 15 + y, temp);
int tempWidth = display.getStringWidth(temp);
}
下面的图片显示了数据在显示屏上的显示方式。
完整的程序代码:
这个可以用DH11来实现么?
可以哦 DHT11也是可以的 不懂的话看一下教程里的DHT11的怎么获取温度 替换一下就可以
用的什么软件编的程?求解,qq:1556932279
用的Arduino IDE,网站有很多的这方面的教程,欢迎加入学习!
找不到SSD1306库怎么办
在arduino的库管理里面下载,nodemcu的这个库,可能会有版本的问题,多换几个库试试
可以用51实现吗
可以,但是联网部分,还是要采用esp8266之类的,本身esp8266就可以作为mcu,再加上51有点多此一举。
大佬,如果我用的是1.3寸屏幕,程序该怎么改呀
IIC地址搞对,程序传上去看看对不对,我忘了1.3寸的行不行,只用0.96的屏幕试过,不行的话你就换个arduino IDE自带的OLED例程去改改,我记得例程里有可以配置屏幕大小的
我昨天成功把显示屏点亮了,然后不知道怎么该把dht11显示到的数据显示在屏幕上,我试着套了下您的代码,然后在display哪里没运行下去,不知道为啥
是因为st7789的库不能用display 函数嘛