一、前言
上回FastBond2阶段1的文档中,展示了使用Scheme-it绘制的原理图,介绍了基于esp32和DHT22温湿度监测设计的原理,也说明了项目中所使用到的活动规定厂家的芯片-乐鑫ESP32。
想了解阶段1的具体内容可以通过链接跳转:https://www.eetree.cn/project/detail/2045
本文的内容将介绍使用kicad绘制原理图及PCB,成品的调试和程序的说明。
二、原理图及PCB介绍
流程图及原理图初步设计都是由Scheme-it网页绘制,十分方便,使用了FastBond活动中要求的厂商的芯片-乐鑫的无线SoC ESP32。
这里是分享链接:https://www.digikey.cn/schemeit/project/基于esp32的温湿度监测设计-611354ccaaf94243be44dcc91b84cce1
如框图所示,esp32通过单个IO驱动温湿度传感器DHT22,DHT22也称AM2302,是一款含有已校准数字信号输出的温湿度复合传感器,湿度量程范围0~99.9%RH,精度±2%RH,而温度量程范围是-40℃~80℃,精度±0.5℃。
通过I2C接口驱动OLED12864。
DHT22是单总线通信的,驱动它只需三根线:电源线、信号线和地线,因此其电路也很简单,esp32外部只需在EN脚连接上电复位电阻电容就能工作,IO0是下载控制脚,上电时如果是低电平就会进入串口下载模式。
DHT22连接到了IO4;
OLED12864连接到了默认的I2C接口GPIO21和GPIO22;
串口0用于下载程序和打印日志;
整个系统的供电通过排针VCC进行,需要的电压是3.3V;
设计的PCB如下,需要注意的是esp32的天线下面不能铺铜,使用kicad很流畅,自带了很多元件的库:
三、板子功能调试
板子焊接好如下,12864液晶通过排针插到上面,DHT22也通过排针插到上面,esp32跑起来最小只需一个电阻和一个电容,十分简单。
下载的时候需要先断电,将IO0通过跳冒短接到GND,arduino提示正在下载的时候上电,这样就能进入下载模式了。
四、程序功能说明
使用arduino开发十分简单,只需要下载安装dht22和oled12864的驱动库,以及esp32的库支持。
程序中首先初始化串口打印、GPIO模式配置、12864驱动配置等功能。
定义了DHT22温度传感器使用的管脚,使用默认的i2c管脚无需额外定义管脚。
然后在主循环中读取温湿度传感器的数据后送到液晶上面显示。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#define SCREEN_WIDTH 128 // 液晶像素宽度
#define SCREEN_HEIGHT 64 // 液晶像素高度
//定义ssd1306对象
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define DHTPIN 4 // 定义DHT22传感器管脚
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//定义DHT22对象
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);//初始化串口
dht.begin();//初始DHT22传感器
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);
}
void loop() {
delay(5000);
//读取温湿度数据
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
}
display.clearDisplay();
//显示温度
display.setTextSize(1);
display.setCursor(0,0);
display.print("Temperature: ");
display.setTextSize(2);
display.setCursor(0,10);
display.print(t);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");
//显示湿度
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Humidity: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(h);
display.print(" %");
display.display();
}
以上就是主要程序的说明,实现的一个简单的传感器数据读取和显示。
五、活动总结
感谢硬禾学堂举办的FastBond2活动,让我有机会进行DIY并分享给大家,希望明年的FastBond3更加精彩。