Arduino利用温湿度传感器在OELD屏幕上显示
DHT11温湿度传感器
安装第三方库SimpleDHT,一般DHT库都提供了dht11,dht21等库函数。安装完成后我们通过串口来测试一下温湿度传感器。下面是示例代码:
#include <SimpleDHT.h>
int pinDHT11 = 2; //温度传感器的输出引脚接到Arduino板子的2引脚上。
SimpleDHT11 dht11(pinDHT11);
void setup()
{
Serial.begin(9600); //设置串口波特率为9600;
Serial.println(F("DHT11 test!"));
}
void loop()
{
Serial.println("wait a time!");
delay(1000);
Serial.println("DHT11 is running!");
byte temperature = 0;
byte humidity = 0;
//设置报错,这段可以注释掉
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess)
{
Serial.print("Read DHT11 failed, err=");
Serial.println(err);
delay(1000);
}
//在串口打印温湿度
Serial.println("DHT11 is ok...");
Serial.print("temperature: ");
Serial.print((int)temperature);
Serial.println(" *C ");
Serial.print("humidity: ");
Serial.print((int)humidity);
Serial.println(" H ");
delay(1500);
}
串口调试:
好了,温湿度传感器调试成功,现在我们要将串口的数据传到ssd1306 oled上。
SSD1603 128×64 OLED屏幕上,博主用的是spi的接线方法,这个接线方法折腾了我一晚上,终于点亮屏幕,如何区分OELD是SPI/IIC,可以看屏幕背面的信息,如果博主这块屏幕是IIC的话,R15,R13要连接,显然,R15,R13是断开的,所以博主这块屏幕要采用SPI方法来接线。当然,也可以动手焊锡将R17上的电阻移到R15上,博主还没有动手。
OLED 128x64 SPI接口
要想点亮oled,接线一定要接对!
12864 | Arduino |
---|---|
CS | 12 |
DC | 11 |
RES | 13 |
SDA/D1 | 9 |
SCL/SCK/D0 | 10 |
VCC | 3.3V |
GND | GND |
安装SSD1306库函数
这里我们选择安装Adafruit SSD1306库函数,当然安装u8g2也是可以,但是u8g2过于“强大”,容易给我们带来不必要的麻烦,所以我们选择安装Adafruit SSD1306库,另外我们还要安装Adafruit GFX库函数。
接着,我们来点亮OLED屏幕,打开示例→第三方库→Adafruit SSD1306 选择ssd1306_128x64_spi,烧录,等待点亮。如果没有点亮,我们需要在我们的项目文件夹中找到Adafruit_SSD1306.h,我们需要去掉#define SSD1306_128_64
,并注释#define SSD1306_128_32
,如下
代码:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SimpleDHT.h>
//设置oled分辨率
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
//设置SPI引脚
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
//设置温湿度传感器引脚
int pinDHT11 = 2;
SimpleDHT11 dht11(pinDHT11);
//温度和湿度变量
byte temperature = 0;
byte humidity = 0;
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup()
{
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x64)
display.display();
delay(2000);
//清屏
display.clearDisplay();
//starting
display.setTextSize(1);
display.setTextColor(WHITE);
display.println("system is starting...");
display.display();
delay(1000);
display.println("please wait a time...");
display.display();
delay(5000);
display.clearDisplay();
}
void loop()
{
//running
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Arduio is running!");
delay(2000);
display.display();
dht_err();
delay(2000);
display.display();
}
void dht_err(void)
{
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess)
{
display.setTextSize(1);
display.setTextColor(WHITE);
display.print("Read DHT11 failed, err=");
display.println(err);
display.display();
delay(1000);
display.clearDisplay();
}
display.println("DHT11 is ok!");
delay(5000);
dht_data();
}
void dht_data(void)
{
display.setTextSize(1);
display.setTextColor(WHITE);
display.print("temperature: ");
display.print((int)temperature);
display.println(" ^, C ");
display.print("humidity: ");
display.print((int)humidity);
display.println(" H ");
display.display();
delay(2000);
}
演示:
总结
点亮oled需要耐心,如果没点亮不要灰心,尝试多去寻找问题的原因。博主在程序中用了挺多的延时,主要是想让界面能够看到过度,另外程序还有一点问题,就是残影问题,下次改好了我再上传,演示视频也会上传。