Arduino 项目笔记 | DH11温度传感器0.96OLED 屏幕(温度传感器全系列使用详解)

在这里插入图片描述

一 、0.96寸OLED屏

0.96寸OLED12864显示屏的像素矩阵的划分是比较特殊的, 整个屏幕:

  • 8page(page0~page7)
  • 每页水平方向划分为8
  • 垂直方向则是按像素划分为128column
  • 每个page-column包含8个像素pixel, 通过一个十六进制数(其实就是一个byte, 8个bit)来控制, 每个bit控制一个像素。

在这里插入图片描述

二、 DHT11简介

DHT11是一款含有已校准系数的数字信号输出的温湿度复合传感器,采用专用的数字模块采集技术温湿度传感技术,具有极高的可靠性与卓越的长期稳定性,内部包含一个电阻式感湿元件和一个NTC测温元件。DHT11传感器都经过实验室校准,校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数,采用单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上。在这里插入图片描述

三、DH11温度程序示例

/**********************************************************
*程序课题:温湿度传感器&OLED屏幕应用 
*程序功能:监测环境温度显示在OLED 屏幕
*编写:Navai
*时间:2020年09月15日
**********************************************************/

#include"display.h"
#include <dht.h>       			//温湿度传感器头文件


dht DHT;  
#define DHT11_PIN A0			//定义传感器数据引脚DHT11_PIN为A0



unsigned int temperature = 0;
unsigned int humidity = 0;
/**********************************************************
                       初始化setup函数
**********************************************************/
void setup()  
{  
    Serial.begin(9600); 
}  
/**********************************************************
                       主循环loop函数
**********************************************************/ 
void loop()  
{  
      int chk = DHT.read11(DHT11_PIN);
      temperature = DHT.temperature; 		//将温度赋值
      humidity = DHT.humidity;				//将湿度赋值  

      Serial.print("温度:");
      Serial.println(temperature);
} 

中文字库 display.h

/**********************************************************
                        中文字库
**********************************************************/  
/*--  文字:  温  --*/
static const unsigned char PROGMEM str_1[] =  {  
0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00
}; 
/*--  文字:  湿  --*/
static const unsigned char PROGMEM str_2[] =  {  
0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,
0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00
}; 
/*--  文字:  度  --*/
static const unsigned char PROGMEM str_3[] =  {  
0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E
}; 
/*--  文字:  显  --*/
static const unsigned char PROGMEM str_4[] =  {  
0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,
0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00,0x00
}; 
/*--  文字:  示  --*/
static const unsigned char PROGMEM str_5[] =  {  
0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,
0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00
}; 
/*--  文字:  ℃  --*/
static const unsigned char PROGMEM str_6[] =  { 
0x60,0x00,0x91,0xF4,0x96,0x0C,0x6C,0x04,0x08,0x04,0x18,0x00,0x18,0x00,0x18,0x00,
0x18,0x00,0x18,0x00,0x18,0x00,0x08,0x00,0x0C,0x04,0x06,0x08,0x01,0xF0,0x00,0x00
}; 

主函数 DH11_OLED.ino


#include"display.h"           //中文字库
#include <dht.h>             //温湿度传感器头文件

#include <Wire.h> //I2C 头文件
#include <Adafruit_GFX.h> //OLED 液晶头文件
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

dht DHT;  
#define DHT11_PIN A0      //定义传感器数据引脚DHT11_PIN为A0
unsigned int temperature = 0;
unsigned int humidity = 0;

void display_println(); //显示函数
void sensor_handle();  //传感器处理函数
/******************************************************************************
液晶初始化
******************************************************************************/
void OLED_init(void){
  //液晶 128*64 I2C 初始化地址 0X3C
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay(); //清屏
}


/*****************************************************************************
初始化 setup()函数
*****************************************************************************/
void setup() {
  OLED_init(); //液晶初始化
}
/******************************************************************************
主循环 loop()函数
******************************************************************************/
void loop() {

 // display_println(); //调用屏幕显示字符子函数
 // display.clearDisplay(); //清屏
  //display.println(count);//输出字符并换行
  
    sensor_handle();    //调用传感器处理函数
    display_println();    //调用屏幕显示字符子函数
    delay(100);
}

/**********************************************************
                       传感器处理函数
**********************************************************/

void sensor_handle(){   
    int chk = DHT.read11(DHT11_PIN);
    temperature = DHT.temperature; //将温度赋值
    humidity = DHT.humidity;//将湿度赋值   

}

/**********************************************************
                       显示函数
**********************************************************/
void display_println(){ 
    //中文字符显示 :温湿度显示
    //在坐标X:18 Y:0的位置显示中文字符杭 
    //第一个16为软件取模的高度
    //第二个16为软件取模的宽度
     
    display.clearDisplay(); //清屏
    display.drawBitmap(18, 0, str_1, 16, 16, 1); 
    display.drawBitmap(34, 0, str_2, 16, 16, 1); 
    display.drawBitmap(50, 0, str_3, 16, 16, 1);
    display.drawBitmap(66, 0, str_4, 16, 16, 1);  
    display.drawBitmap(82, 0, str_5, 16, 16, 1);  

    //温度
    display.drawBitmap(0, 20, str_1, 16, 16, 1); 
    display.drawBitmap(16, 20, str_3, 16, 16, 1);
    //摄氏度符号 -℃,str_6
    display.drawBitmap(80, 20, str_6, 16, 16, 1);
    //湿度
    display.drawBitmap(0, 40, str_2, 16, 16, 1); 
    display.drawBitmap(16, 40, str_3, 16, 16, 1);    
    //英文字符显示 Length: 
    display.setTextSize(2);             //设置字体大小  
    display.setTextColor(WHITE);        //设置字体颜色白色  
   
    
//*************************************************************//
//    temperature = DHT.temperature;    //将温度赋值
//    humidity = DHT.humidity;          //将湿度赋值 humidity为全局变量,无符号整型
    
    display.setCursor(32,20);           //设置字体的起始位置  
    display.print(":");               //输出字符,不换行  
    //display.println(DHT.temperature);
    display.print(temperature);
    //display.println("℃");             //输出摄氏度℃符号并换行,中文字符需要取模
    
    display.setCursor(32,40);            //设置字体的起始位置  
    display.print(":");                 //输出字符并换行  
    //display.println(DHT.humidity);
    display.print(humidity);
    display.setCursor(80,40);            //设置字体的起始位置           
    display.println("%");                 //输出%符号并换行
  
    display.display(); //显示所有缓存的  
    delay(100);
}



#include"display.h"           //中文字库
//#include <dht.h>             //温湿度传感器头文件

#include <Wire.h> //I2C 头文件
#include <Adafruit_GFX.h> //OLED 液晶头文件
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

//dht DHT;  
//#define DHT11_PIN A1     //定义传感器数据引脚DHT11_PIN为A0
 int temperature = 24;//
unsigned int humidity = 76;

void display_println(); //显示函数
void sensor_handle();   //传感器处理函数
/******************************************************************************
液晶初始化
******************************************************************************/
void OLED_init(void){
  //液晶 128*64 I2C 初始化地址 0X3C
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay(); //清屏
}


/*****************************************************************************
初始化 setup()函数
*****************************************************************************/
void setup() {
  OLED_init(); //液晶初始化
  Serial.begin(9600);
}
/******************************************************************************
主循环 loop()函数
******************************************************************************/
void loop() {

 // display_println(); //调用屏幕显示字符子函数
 // display.clearDisplay(); //清屏
  //display.println(count);//输出字符并换行
//    temperature = 20; //将温度赋值
//    humidity = 75;//将湿度赋值  
    sensor_handle();    //调用传感器处理函数
    delay(100);
    
    while(1)//陷入死循环
      { temperature = 0;     
        display_println(); 
        delay(100);
      }
}

/**********************************************************
                       传感器处理函数
**********************************************************/
void sensor_handle(){  
    int i=8; 
    for(i;i>0;i--)
    {
      temperature = temperature -3;
     if(temperature  <= 10)     
    {humidity = 81;}  
          
      display_println();    //调用屏幕显示字符子函数
      Serial.println(temperature);
      delay(1000);
      }
      
      if(temperature < 0)
    {   temperature = 0; 
    }
 
}

/**********************************************************
                       显示函数
**********************************************************/
void display_println(){
    //中文字符显示 :温湿度显示
    //在坐标X:18 Y:0的位置显示中文字符杭 
    //第一个16为软件取模的高度
    //第二个16为软件取模的宽度
     
    display.clearDisplay(); //清屏
    display.drawBitmap(18, 0, str_1, 16, 16, 1); 
    display.drawBitmap(34, 0, str_2, 16, 16, 1); 
    display.drawBitmap(50, 0, str_3, 16, 16, 1);
    display.drawBitmap(66, 0, str_4, 16, 16, 1);  
    display.drawBitmap(82, 0, str_5, 16, 16, 1);  

    //温度
    display.drawBitmap(0, 20, str_1, 16, 16, 1); 
    display.drawBitmap(16, 20, str_3, 16, 16, 1);
    //摄氏度符号 -℃,str_6
    display.drawBitmap(80, 20, str_6, 16, 16, 1);
    //湿度
    display.drawBitmap(0, 40, str_2, 16, 16, 1); 
    display.drawBitmap(16, 40, str_3, 16, 16, 1);    
    //英文字符显示 Length: 
    display.setTextSize(2);             //设置字体大小  
    display.setTextColor(WHITE);        //设置字体颜色白色  
   
    
//*************************************************************//
//    temperature = DHT.temperature;    //将温度赋值
//    humidity = DHT.humidity;          //将湿度赋值 humidity为全局变量,无符号整型
    
    display.setCursor(32,20);           //设置字体的起始位置  
    display.print(":");               //输出字符,不换行  
    //display.println(DHT.temperature);
    display.print(temperature);
    //display.println("℃");             //输出摄氏度℃符号并换行,中文字符需要取模
    
    display.setCursor(32,40);            //设置字体的起始位置  
    display.print(":");                 //输出字符并换行  
    //display.println(DHT.humidity);
    display.print(humidity);
    display.setCursor(80,40);            //设置字体的起始位置           
    display.println("%");                 //输出%符号并换行
  
    display.display(); //显示所有缓存的  
    delay(100);
}



Arduino Nano 驱动OLED滚动显示关键代码:

/*
   0.91OLED滚动显示
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET     4
Adafruit_SSD1306 display(128, 32, &Wire, OLED_RESET);

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextColor(WHITE);//开像素点发光
  display.clearDisplay();//清屏

  display.setTextSize(2); //设置字体大小
  display.setCursor(0, 8);//设置显示位置
  display.println("TonyCode");
  display.display(); // 开显示
}

void loop() {
  display.startscrollright(0x00, 0x0F);
  delay(5000);
  display.stopscroll();
  display.startscrollleft(0x00, 0x0F);
  delay(1000);
  display.stopscroll();
}



演示视频


参考资料

  • 6
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: DS18B20温度传感器是一种数字温度传感器,能够测量环境温度并将其以数字形式输出。而OLED屏幕则是一种显示技术,具有高亮度、对比度高,能够显示生动、清晰的图像。下面是一个使用DS18B20温度传感器的示例应用: 假设我们需要使用DS18B20温度传感器OLED屏幕来实现一个温度显示器。首先,我们需要将DS18B20传感器与主控模块(如Arduino)连接。接线完成后,我们可以编写代码来读取传感器数据。 通过编程,可以使用Arduino读取DS18B20传感器的数据,并将其转换为摄氏度或华氏度。然后,将转换后的数据传送给OLED屏幕进行显示。 在OLED屏幕上,我们可以使用Arduino库函数来显示温度值。我们可以设计一个简单的界面,显示当前温度和相应的温度单位。 当温度发生变化时,传感器会实时更新温度数据,并将其传送给主控模块。主控模块通过程序将更新后的温度值发送到OLED屏幕,从而使其实时显示新的温度。 通过这个示例,我们可以用DS18B20温度传感器读取环境温度,并通过OLED屏幕实时显示温度值。这可以在许多应用中使用,如室内温度监测、温室控制等。 总结:通过DS18B20温度传感器OLED屏幕,我们可以实现一个简单的温度显示器,能够读取环境温度并实时显示在屏幕上。这个示例应用可以扩展到更多的项目中,帮助我们监测和控制温度。 ### 回答2: DS18B20温度传感器是一种数字式温度传感器,能够准确测量环境温度,并通过一根三线串行总线与主控器连接。 在使用DS18B20温度传感器时,结合OLED屏幕可以更直观地显示温度数据。我们可以通过将DS18B20传感器OLED屏幕连接,并通过主控器来处理并显示温度数据。 首先,我们需要将DS18B20传感器的引脚与主控器的引脚连接。通常,DS18B20传感器的三个引脚分别为VCC(正电源)、GND(地)和DQ(数据线)。我们需要将VCC连接到主控器的正电源引脚,GND连接到主控器的地引脚,DQ连接到主控器的一个GPIO引脚,并通过上拉电阻连接到正电源引脚。 接下来,我们需要编写主控器的程序代码来读取DS18B20传感器温度数据,并将其显示到OLED屏幕上。主要步骤包括初始化DS18B20传感器、读取温度值、将温度数据转换为数字,并将其发送到OLED屏幕上进行显示。 在程序中,我们需要引入相应的库文件以便于操作DS18B20传感器OLED屏幕。并在主函数中初始化传感器屏幕,然后进入一个循环中,不断读取和显示温度数据。 最后,我们可以在OLED屏幕上看到实时的温度数据,通过程序可以对温度数据进行处理,比如进行单位转换、设置报警阈值等。 总而言之,通过将DS18B20温度传感器OLED屏幕连接,并编写相应的程序代码,我们可以实现用OLED屏幕来显示DS18B20传感器温度数据,从而更直观地了解环境的温度情况。 ### 回答3: DS18B20是一种数字温度传感器,可以测量环境的温度并将数据转换成数字信号输出。OLED屏幕是一种具有自发光特性的显示屏,可以在低电压下显示图像和文本。 通过使用DS18B20温度传感器OLED屏幕,我们可以实例化一个温度监测系统。首先,我们需要将DS18B20传感器连接到主控制器(比如Arduino等)。接下来,我们编写代码来读取传感器温度数据,并将其转换成摄氏度或华氏度。然后,将温度数据输出到OLED屏幕上。 我们可以设计一个简单的用户界面,在OLED屏幕上显示当前温度屏幕可以根据温度变化,使用不同的字体、颜色或图像来显示温度信息。例如,使用红色字体来表示高温,蓝色字体来表示低温等。 此外,我们还可以添加其他功能,如设置温度报警阈值。当温度达到设置的阈值时,屏幕可以显示警告信息或发出声音。 总之,通过将DS18B20温度传感器OLED屏幕结合使用,我们可以创建一个实时显示温度的监测系统。这对于家庭、办公室或工业环境中的温度监测非常有用。使用OLED屏幕,用户可以直观地了解环境温度的变化,从而采取相应的措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naiva

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值