一 、0.96寸OLED屏
0.96寸OLED12864显示屏的像素矩阵的划分是比较特殊的, 整个屏幕:
- 共8页page(page0~page7)
- 每页水平方向划分为8 行
- 垂直方向则是按像素划分为128个 column
- 每个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();
}
演示视频
参考资料