前几天入手了一个使用ESP8266微控制器的带有WIFI功能的开发板-NodeMcu (名字好长,其实就是下图这么一个板子): nodemcuv3.png

ESP8266是个相当好的微控制器,如果你也对它感兴趣,可以看看这里,它直接连接到Wi-Fi进行使用。 它价格十分便宜,它的后辈还有ESP32,其除了能够直接链接Wi-FI,还可以连接蓝牙。他们都是由总部位于上海的中国公司乐鑫科技开发。(这点国产还是比较厉害的,据我所知,这两款芯片除中国外其他地区也是挺有名的)

然后又买了DHT11温湿度传感器。DHT11是一款基本的低成本数字温度和湿度传感器。详细看:DHT11DHT11_new.png

接下来就是,两个放一起搞点事情了。 我使用了Arduino,它是一个专门用在各种开发板的代码编辑器,它还有串口监视器等一系列功能,对于这种简单的学习使用还是相当方便的。 对于ESP8266,只要下载相关的库就可以很方便的编写、编译、烧录程序了。


1. ESP8266开发板

像熟练使用这些,如果不是专业的工程师,只需了解一下各个引脚是干什么用的就能在很基础的使用它们,我先放一个Node MCU的引脚解释图: ESP8266-NodeMCU引脚功能 在以上图片中深蓝底白色字的标识就是GPIO引脚编号。如“NodeMCU-GPIO4 ”。而开发板上所印刷的D2,D3等等就是NodeMCU开发板引脚名称。如下图所示。 NodeMCU的GPIO名 如下图所示,NodeMCU的D2引脚是与GPIO4相互连接的。以此类推,通过以下说明图您就可以找到D2与GPIO的对应关系了。 关系图 那么,我们为什么要花这么多时间讲解开发板引脚名和GPIO号的对应关系呢?

将来我们在编写NodeMCU开发板的控制程序时,经常会进行引脚操作。如以下程序语句。

digitalWrite4HIGH)

以上语句通过digitalWrite函数将引脚4设置为高电平。那么您知道这个数字4到底是指GPIO4还是指开发板D4引脚呢?

答案是GPIO4而不是D4。

通过下面这个GPIO编号与开发板引脚对应图我们不难看出。以上语句实际是将NodeMCU开发板的D2引脚设置为高电平。因为D2对应的时GPIO4。

如果要对D2引脚设置为高电平,您可以使用以下语句。

digitalWrite(D2, HIGH)

ESP8266芯片有17个GPIO引脚(GPIO0~GPIO16)。这些引脚中的GPIO6~GPIO 11被用于连接开发板的闪存(Flash Memory)。如果在实验电路中使用GPIO6~GPIO11,NodeMCU开发板将无法正常工作。因此建议您不要使用GPIO6~GPIO 11。 不用的引脚们

2. DHT11温湿度传感器

DHT11是一种单线数字式湿度和温度传感器,它以单线协议串行提供湿度和温度值。 DHT11传感器提供以百分比表示的相对湿度值(20至90%RH)和以摄氏度表示的温度值(0至50 °C)。 DHT11传感器采用电阻式湿度测量元件和NTC温度测量元件。 DHT11是一个4引脚传感器,这些引脚是VCC,DATA,GND和一个引脚未使用,如下图所示: 1_DHT11_Pins

引脚编号 Pin名称 引脚描述 注意事项
1 VCC 电源输入 (3.3-5.5V直流电) 建议使用3.3V供电
2 数据 数字输出引脚 用于控制外设(如LED、传感器)
3 NC 不使用引脚 禁止连接任何电路
4 GND 接地引脚 必须可靠接地

电源:3.3至5V DC 电流消耗:最大2.5mA 工作范围:20-80% RH,0-50°C 湿度测量范围:20- 90%RH 湿度测量精度:±5% RH 温度测量范围:0-50°C 温度测量精度:±2°C 响应时间:1s 采样率:1Hz(每秒1次采样) 数据输出格式:单总线数字信号 数据传输距离:20- 30米(露天) 尺寸:15 mm x 12 mm x 5.5mm 重量:2.5g 数字信号传输协议:1个起始信号+40位数据+1个校验和

如果需要获取更精确的数据可以换用DHT22 原理我就不在这儿写了,如果你感兴趣可以看这儿 :DHT11


了解完基本知识,接下来就是连线、写代码了O(∩_∩)O 如下图所示: 连线图 我把DHT11的数据交互引脚与开发板的D1(GPI05)相连,VCC、GND引脚与开发板的对应供电接地引脚相连

然后写代码(这一步就相当折磨了,刚开始不是忘了行尾分号就是混了引脚数字(●ˇ∀ˇ●)) 这个是我的代码,写了相当详细的注释:

#include <DHT.h>

// 定义 DHT11 的引脚和数据类型
#define DHTPIN 5     // DHT11 数据引脚连接到 ESP8266 的 D1 GPIO5
#define DHTTYPE DHT11 // 传感器类型为 DHT11 要是DH12 改成DHT12

// 初始化 DHT 传感器
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  // 启动串口通信
  Serial.begin(9600);
  Serial.println("DHT11 温湿度传感器测试");

  // 初始化 DHT 传感器
  dht.begin();
}

void loop() {
  // 延迟 2 秒,DHT11 的读取间隔至少为 1 秒
  delay(2000);

  // 读取湿度
  float humidity = dht.readHumidity();
  // 读取温度(摄氏度)
  float temperature = dht.readTemperature();

  // 检查读取是否成功
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("无法从 DHT11 传感器读取数据");
    return;
  }

  // 打印温湿度数据
  // 在这里 
  // Serial.print 将数据通过串口发送出去,但不会在数据末尾添加换行符  多个 print 都会输出在一行
  // Serial.println 将数据通过串口发送出去,并在数据末尾添加换行符(\r\n) 自动换行的
  Serial.print("湿度: ");
  Serial.print(humidity);
  Serial.print(" %\t");
  Serial.print("温度: ");
  Serial.print(temperature);
  Serial.println(" °C");
}

然后编译上传代码至开发板,不出意外,就能看到这样的输出(在你指定的串口,我这里是9600): 运行结果

就这样,虽然结果有点简单,但是学习它,通过写代码实现这么个过程,还是相当给人一种成就感的。


写后感受:第一次在自己的博客上正儿八经写东西,看了一下时间,用了快一个半小时O(∩_∩)O,虽然耗费了这么长时间,但是也获得了好多感受,重温了一下之前略过的知识,感觉常常以这种笔记或者类似的方式来记录自己所学过的知识还是相当好的,今后一定保持这个习惯。

:一些图片来自太极创客 & ElectronicWings,相关版权归原作者持有。