Arduino利用温湿度传感器在OELD屏幕SPI接口上显示

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);
	}

串口调试:
dht11串口调试
好了,温湿度传感器调试成功,现在我们要将串口的数据传到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库函数。
SSD1306
gfx库
接着,我们来点亮OLED屏幕,打开示例→第三方库→Adafruit SSD1306 选择ssd1306_128x64_spi,烧录,等待点亮。如果没有点亮,我们需要在我们的项目文件夹中找到Adafruit_SSD1306.h,我们需要去掉#define SSD1306_128_64,并注释#define SSD1306_128_32 ,如下更改SSD1306的分辨率

代码:

#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需要耐心,如果没点亮不要灰心,尝试多去寻找问题的原因。博主在程序中用了挺多的延时,主要是想让界面能够看到过度,另外程序还有一点问题,就是残影问题,下次改好了我再上传,演示视频也会上传。

发布了31 篇原创文章 · 获赞 22 · 访问量 9510

猜你喜欢

转载自blog.csdn.net/richowe/article/details/102591907