基于STM32的土壤湿度传感器(FC-28)+OLED屏显示(超详细)

目录

前言

 一、前期准备

(一)软件环境准备

(二)硬件准备

二、接线图表

(一)接线图

(二)接线示意表 

三、土壤湿度传感器(FC-28、四线制)

(一)原理

模块说明(本次实验采用AO口进行模数转换):

土壤湿度传感器模块电路图(本次实验用的模块为四线制):

 stm32ADC通道详细

stm32常见转换模式

土壤湿度计算公式

(二)主要代码

1. void AD_Init(void)函数

函数介绍

 代码(已添加注释)

2. uint16_t AD_GetValue(void)函数

函数介绍

代码

3. uint16_t GetHumidity(int times)函数

 代码(已添加注释)

 四、OLED显示屏驱动(主要函数、I2C协议)

1. OLED_ShowChar函数

2. OLED_ShowString函数

3. OLED_Pow函数

4. OLED_ShowNum函数

5. OLED_ShowCC_F16x16函数

 五、效果展示

六、总结

七、完整代码


前言

本文主要说明土壤湿度传感器在STM32下如何使用,并且结合OLED屏来达到显示的效果。喜欢的话可以点个赞和收藏噢!!以下内容均为查询相关资料撰写而成,如有侵权,请联系作者。


 一、前期准备

(一)软件环境准备

编译工具为Keil5,对应芯片为:STM32F103C8

(二)硬件准备

1. 土壤湿度检测模块

2. STM32开发板

3. 0.96寸OLED屏

4. ST-Link V2(USB口)仿真器

5. 适量杜邦线

大约13根


二、接线图表

(一)接线图

(二)接线示意表 

STM32 ST-LinkOLED屏FC-28
3V33.3V
SWOSWDIO
SWCLKSWCLK
GNDGND
PB9SDA
PB8SCL
3.3VCC
GGND
3.3+
B0AO
G-

三、土壤湿度传感器(FC-28、四线制)

(一)原理

模块说明(本次实验采用AO口进行模数转换):

1. 模块中蓝色的电位器是用于土壤湿度的阀值调节,顺时针调节,控制的湿度会越大,逆时针越小

2. 数字量输出 D0 可以与单片机直接相连,通过单片机来检测高低电平,由此来检测土壤湿度

3. 小板模拟量输出 AO 可以和 AD 模块相连,通过 AD 转换,可以获得土壤湿度更精确的数值

土壤湿度传感器模块电路图(本次实验用的模块为四线制):

 stm32ADC通道详细

本次实验使用了PB0引脚模拟AO引脚,使用了通道8(ADC_Channel_8)

stm32常见转换模式

        本次实验采用的是连续转换非扫描模式

1. 连续转换模式(Continuous Conversion Mode):
        在连续转换模式下,ADC会持续地进行转换,即使没有新的转换请求也会保持转换状态。 这种模式适用于需要连续监测模拟信号变化的应用场景,例如实时数据采集、实时监测等。
2. 非连续转换模式(Single Conversion Mode)
        在非连续转换模式下,ADC只在接收到转换请求时才进行一次转换,转换完成后会停止转换,直到下一次请求到来。 这种模式适用于需要间歇性地进行模拟信号采集或者低功耗应用场景。
3. 扫描模式(Scan Mode)
        在扫描模式下,ADC会按照预定义的顺序依次转换多个通道的信号,直到转换完所有通道。这种模式适用于需要连续采集多个模拟信号的应用场景。
4. 非扫描模式:
        非扫描模式下,ADC只对单个通道进行转换,不会切换到其他通道进行转换。这种模式适用于仅需采集单一模拟信号的应用场景,可以提高采样速率和效率。

土壤湿度计算公式

M1 = 干燥时对应最大的ADC值        M0 = 湿润时对应最小的ADC值        m = 实时ADC值

湿度 = (M1 - m) / (M1 - M0) * 100        =>        计算出来的为百分比

M1和M0要根据实际环境情况设计,根据AD_GetValue函数获取ADC值。

(二)主要代码

1. void AD_Init(void)函数

函数介绍

ADC初始化函数,主要用于配置ADC1时钟,初始化ADC1,设置ADC转换通道和工作模式,工作模式为连续转换非扫描模式。

 代码(已添加注释)
void AD_Init(void)
{
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);		// 开启ADC1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		// 开启GPIOB时钟
    
    // GPIO初始化结构体
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;				// 配置为模拟输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;					// 指定引脚为GPIO_Pin_0
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			// 设置IO口速度为50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);						// 初始化GPIOB
    
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);												// 设置ADC时钟分频为PCLK2/6
    ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);	// ADC通道配置
	
    // ADC初始化结构体
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	// 设置转换触发模式为不使用外部触发
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;				// 设置数据对齐方式为右对齐
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;					// 设置工作模式为独立模式
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;					// 开启连续转换模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;						// 关闭扫描模式
    ADC_InitStructure.ADC_NbrOfChannel = 1;								// 设置转换的通道数目为1
    ADC_Init(ADC1, &ADC_InitStructure);									// 初始化ADC1
	
    
    ADC_Cmd(ADC1, ENABLE);									// 开启ADC电源
    
    ADC_ResetCalibration(ADC1);								// 复位校准
    while (ADC_GetResetCalibrationStatus(ADC1));			// 等待ADC复位校准完成
    
    ADC_StartCalibration(ADC1);								// 开始校准
    while (ADC_GetCalibrationStatus(ADC1));					// 等待ADC校准完成
	
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);					// 启动软件转换
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	// 等待转换完成
}

2. uint16_t AD_GetValue(void)函数

函数介绍

获取ADC值函数,主要用于获取ADC1通道模数转换的结果,方便与后面的函数调用。

代码
uint16_t AD_GetValue(void)
{
    return ADC_GetConversionValue(ADC1); // 返回转换结果
}

3. uint16_t GetHumidity(int times)函数

函数介绍

获取湿度值函数,通过多次获取模数转换结果求平均值,再根据计算公式进行计算土壤湿度,规定范围内后返回土壤湿度。

 代码(已添加注释)
uint16_t GetHumidity(int times)
{
    uint32_t H_all = 0;
    float H_arg = 0;
    uint8_t t;

    // 进行多次ADC转换并累加
    for (t = 0; t < times; t++) {
        H_all += AD_GetValue();
        Delay_ms(1); // 延时1毫秒
    }
    // 计算平均值
    H_arg = (H_all / times);
    // 根据转换公式计算湿度值
    uint16_t data = (4095 - H_arg) / 3292 * 100;
    // 确保湿度值在合理范围内(0~100)
    data = data > 100 ? 100 : (data < 0 ? 0 : data);
    return data;
}

 四、OLED显示屏驱动(主要函数、I2C协议)

1. OLED_ShowChar函数

函数介绍:

功能:在指定的行和列位置显示一个字符。
参数:

        Line:行位置,范围为1到4。
        Column:列位置,范围为1到16。
        Char:要显示的字符,范围为ASCII可见字符。
这个函数首先根据行和列位置设置光标的位置,然后根据字符的ASCII码在字库中查找对应的字形数据,并将上半部分和下半部分的数据分别写入OLED屏幕的两个页面,以完成字符的显示。

 代码:

void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char)
{      	
	uint8_t i;
	OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8);		//设置光标位置在上半部分
	for (i = 0; i < 8; i++)
	{
		OLED_WriteData(OLED_F8x16[Char - ' '][i]);			//显示上半部分内容
	}
	OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8);	//设置光标位置在下半部分
	for (i = 0; i < 8; i++)
	{
		OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]);		//显示下半部分内容
	}
}

2. OLED_ShowString函数

函数介绍:

功能:在指定的行和列位置显示一个字符串。
参数:

        Line:起始行位置,范围为1到4。
        Column:起始列位置,范围为1到16。
        String:要显示的字符串,范围为ASCII可见字符。

这个函数通过循环调用OLED_ShowChar()函数,逐个显示字符串中的字符。

代码:

void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i++)
	{
		OLED_ShowChar(Line, Column + i, String[i]);
	}
}

3. OLED_Pow函数

函数介绍:

功能:计算X的Y次方。
返回值:返回值等于X的Y次方。

这个函数实现了简单的幂函数计算,用于数字显示的处理。

 代码:

void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i++)
	{
		OLED_ShowChar(Line, Column + i, String[i]);
	}
}

4. OLED_ShowNum函数

函数介绍:

功能:在指定的行和列位置显示一个十进制的正整数。
参数:

        Line:起始行位置,范围为1到4。
        Column:起始列位置,范围为1到16。
        Number:要显示的数字,范围为0到4294967295。
        Length:要显示数字的长度,范围为1到10。

这个函数将数字按位数拆分,并逐个调用OLED_ShowChar()函数来显示每一位数字。

代码:  

void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i++)							
	{
		OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');
	}
}

5. OLED_ShowCC_F16x16函数

函数介绍:

功能:在指定的行和列位置显示一个汉字(16x16像素)。
参数:

        Line:行位置,范围为1到4。
        Column:列位置,范围为1到16。
        num:要显示的汉字在字库中的索引。
这个函数类似于OLED_ShowChar(),但是专门用于显示汉字,字库中每个汉字占16个字节,前8个字节表示汉字的上半部分,后8个字节表示下半部分。

代码: 

void OLED_ShowCC_F16x16(uint8_t Line, uint8_t Column, uint8_t num)
{      	
	uint8_t i;
	OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8);		//设置光标位置在上半部分
	for (i = 0; i < 16; i++)
	{
		OLED_WriteData(CC_F16x16[num*2][i]);			//显示上半部分内容
	}
	OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8);	//设置光标位置在下半部分
	for (i = 0; i < 16; i++)
	{
		OLED_WriteData(CC_F16x16[num*2][i + 16]);		//显示下半部分内容
	}
}

 五、效果展示

基于STM32的土壤湿度传感器(FC-28)操作视频


六、总结

本文章主要讲的是通过使用STM32实现了对FC-28土壤湿度传感器的数据采集和显示。通过获取ADC值然后进行计算得到土壤湿度,并成功显示再0.96寸的oled显示屏上。


七、完整代码

main.c 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "adc.h"

int main()
{
    OLED_Init();
    AD_Init();
    OLED_ShowCC_F16x16(2, 1, 1); // 土
    OLED_ShowCC_F16x16(2, 3, 2); // 壤
    OLED_ShowCC_F16x16(2, 5, 3); // 湿
    OLED_ShowCC_F16x16(2, 7, 4); // 度
    OLED_ShowChar(2, 9, ':');
    OLED_ShowCC_F16x16(2, 13, 0); // %

    while (1) {
        OLED_ShowNum(2, 10, GetHumidity(10), 3);
        Delay_ms(500);
    }
}

adc.h  

#ifndef __ADC_H
#define __ADC_H

void AD_Init(void);
uint16_t AD_GetValue(void);
uint16_t GetHumidity(int times);

#endif

adc.c  

#include "stm32f10x.h"                  // Device header
#include "adc.h"
#include "Delay.h"

// ADC初始化函数
void AD_Init(void)
{
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);		// 开启ADC1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		// 开启GPIOB时钟
    
    // GPIO初始化结构体
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;				// 配置为模拟输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;					// 指定引脚为GPIO_Pin_0
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			// 设置IO口速度为50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);						// 初始化GPIOB
    
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);												// 设置ADC时钟分频为PCLK2/6
    ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);	// ADC通道配置
	
    // ADC初始化结构体
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	// 设置转换触发模式为不使用外部触发
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;				// 设置数据对齐方式为右对齐
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;					// 设置工作模式为独立模式
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;					// 开启连续转换模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;						// 关闭扫描模式
    ADC_InitStructure.ADC_NbrOfChannel = 1;								// 设置转换的通道数目为1
    ADC_Init(ADC1, &ADC_InitStructure);									// 初始化ADC1
	
    
    ADC_Cmd(ADC1, ENABLE);									// 开启ADC电源
    
    ADC_ResetCalibration(ADC1);								// 复位校准
    while (ADC_GetResetCalibrationStatus(ADC1));			// 等待ADC复位校准完成
    
    ADC_StartCalibration(ADC1);								// 开始校准
    while (ADC_GetCalibrationStatus(ADC1));					// 等待ADC校准完成
	
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);					// 启动软件转换
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	// 等待转换完成
}

// 获取ADC值函数
uint16_t AD_GetValue(void)
{
    return ADC_GetConversionValue(ADC1); // 返回转换结果
}

// 获取湿度值函数
uint16_t GetHumidity(int times)
{
    uint32_t H_all = 0;
    float H_arg = 0;
    uint8_t t;

    // 进行多次ADC转换并累加
    for (t = 0; t < times; t++) {
        H_all += AD_GetValue();
        Delay_ms(1); // 延时1毫秒
    }
    // 计算平均值
    H_arg = (H_all / times);
    // 根据转换公式计算湿度值
    uint16_t data = (4095 - H_arg) / 3292 * 100;
    // 确保湿度值在合理范围内(0~100)
    data = data > 100 ? 100 : (data < 0 ? 0 : data);
    return data;
}

OLED.h  

#ifndef __OLED_H
#define __OLED_H

void OLED_Init(void);
void OLED_Clear(void);
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char);
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String);
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowCC_F16x16(uint8_t Line, uint8_t Column, uint8_t num);
uint32_t OLED_Pow(uint32_t X, uint32_t Y);

#endif

OLED.c  

#include "stm32f10x.h"
#include "OLED_Font.h"

/*引脚配置*/
#define OLED_W_SCL(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x))
#define OLED_W_SDA(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))

/*引脚初始化*/
void OLED_I2C_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    OLED_W_SCL(1);
    OLED_W_SDA(1);
}

/**
  * @brief  I2C开始
  * @param  无
  * @retval 无
  */
void OLED_I2C_Start(void)
{
    OLED_W_SDA(1);
    OLED_W_SCL(1);
    OLED_W_SDA(0);
    OLED_W_SCL(0);
}

/**
  * @brief  I2C停止
  * @param  无
  * @retval 无
  */
void OLED_I2C_Stop(void)
{
    OLED_W_SDA(0);
    OLED_W_SCL(1);
    OLED_W_SDA(1);
}

/**
  * @brief  I2C发送一个字节
  * @param  Byte 要发送的一个字节
  * @retval 无
  */
void OLED_I2C_SendByte(uint8_t Byte)
{
    uint8_t i;

    for (i = 0; i < 8; i++) {
        OLED_W_SDA(Byte & (0x80 >> i));
        OLED_W_SCL(1);
        OLED_W_SCL(0);
    }

    OLED_W_SCL(1);	//额外的一个时钟,不处理应答信号
    OLED_W_SCL(0);
}

/**
  * @brief  OLED写命令
  * @param  Command 要写入的命令
  * @retval 无
  */
void OLED_WriteCommand(uint8_t Command)
{
    OLED_I2C_Start();
    OLED_I2C_SendByte(0x78);		//从机地址
    OLED_I2C_SendByte(0x00);		//写命令
    OLED_I2C_SendByte(Command);
    OLED_I2C_Stop();
}

/**
  * @brief  OLED写数据
  * @param  Data 要写入的数据
  * @retval 无
  */
void OLED_WriteData(uint8_t Data)
{
    OLED_I2C_Start();
    OLED_I2C_SendByte(0x78);		//从机地址
    OLED_I2C_SendByte(0x40);		//写数据
    OLED_I2C_SendByte(Data);
    OLED_I2C_Stop();
}

/**
  * @brief  OLED设置光标位置
  * @param  Y 以左上角为原点,向下方向的坐标,范围:0~7
  * @param  X 以左上角为原点,向右方向的坐标,范围:0~127
  * @retval 无
  */
void OLED_SetCursor(uint8_t Y, uint8_t X)
{
    OLED_WriteCommand(0xB0 | Y);					//设置Y位置
    OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));	//设置X位置高4位
    OLED_WriteCommand(0x00 | (X & 0x0F));			//设置X位置低4位
}

/**
  * @brief  OLED清屏
  * @param  无
  * @retval 无
  */
void OLED_Clear(void)
{
    uint8_t i, j;

    for (j = 0; j < 8; j++) {
        OLED_SetCursor(j, 0);

        for (i = 0; i < 128; i++) {
            OLED_WriteData(0x00);
        }
    }
}

/**
  * @brief  OLED显示一个字符
  * @param  Line 行位置,范围:1~4
  * @param  Column 列位置,范围:1~16
  * @param  Char 要显示的一个字符,范围:ASCII可见字符
  * @retval 无
  */
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char)
{
    uint8_t i;
    OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8);		//设置光标位置在上半部分

    for (i = 0; i < 8; i++) {
        OLED_WriteData(OLED_F8x16[Char - ' '][i]);			//显示上半部分内容
    }

    OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8);	//设置光标位置在下半部分

    for (i = 0; i < 8; i++) {
        OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]);		//显示下半部分内容
    }
}

/**
  * @brief  OLED显示字符串
  * @param  Line 起始行位置,范围:1~4
  * @param  Column 起始列位置,范围:1~16
  * @param  String 要显示的字符串,范围:ASCII可见字符
  * @retval 无
  */
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{
    uint8_t i;

    for (i = 0; String[i] != '\0'; i++) {
        OLED_ShowChar(Line, Column + i, String[i]);
    }
}

/**
  * @brief  OLED次方函数
  * @retval 返回值等于X的Y次方
  */
uint32_t OLED_Pow(uint32_t X, uint32_t Y)
{
    uint32_t Result = 1;

    while (Y--) {
        Result *= X;
    }

    return Result;
}

/**
  * @brief  OLED显示数字(十进制,正数)
  * @param  Line 起始行位置,范围:1~4
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~4294967295
  * @param  Length 要显示数字的长度,范围:1~10
  * @retval 无
  */
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
    uint8_t i;

    for (i = 0; i < Length; i++) {
        OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');
    }
}

void OLED_ShowCC_F16x16(uint8_t Line, uint8_t Column, uint8_t num)
{
    uint8_t i;
    OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8);		//设置光标位置在上半部分

    for (i = 0; i < 16; i++) {
        OLED_WriteData(CC_F16x16[num * 2][i]);			//显示上半部分内容
    }

    OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8);	//设置光标位置在下半部分

    for (i = 0; i < 16; i++) {
        OLED_WriteData(CC_F16x16[num * 2][i + 16]);		//显示下半部分内容
    }
}

/**
  * @brief  OLED初始化
  * @param  无
  * @retval 无
  */
void OLED_Init(void)
{
    uint32_t i, j;

    for (i = 0; i < 1000; i++) {		//上电延时
        for (j = 0; j < 1000; j++);
    }

    OLED_I2C_Init();			//端口初始化
    OLED_WriteCommand(0xAE);	//关闭显示
    OLED_WriteCommand(0xD5);	//设置显示时钟分频比/振荡器频率
    OLED_WriteCommand(0x80);
    OLED_WriteCommand(0xA8);	//设置多路复用率
    OLED_WriteCommand(0x3F);
    OLED_WriteCommand(0xD3);	//设置显示偏移
    OLED_WriteCommand(0x00);
    OLED_WriteCommand(0x40);	//设置显示开始行
    OLED_WriteCommand(0xA1);	//设置左右方向,0xA1正常 0xA0左右反置
    OLED_WriteCommand(0xC8);	//设置上下方向,0xC8正常 0xC0上下反置
    OLED_WriteCommand(0xDA);	//设置COM引脚硬件配置
    OLED_WriteCommand(0x12);
    OLED_WriteCommand(0x81);	//设置对比度控制
    OLED_WriteCommand(0xCF);
    OLED_WriteCommand(0xD9);	//设置预充电周期
    OLED_WriteCommand(0xF1);
    OLED_WriteCommand(0xDB);	//设置VCOMH取消选择级别
    OLED_WriteCommand(0x30);
    OLED_WriteCommand(0xA4);	//设置整个显示打开/关闭
    OLED_WriteCommand(0xA6);	//设置正常/倒转显示
    OLED_WriteCommand(0x8D);	//设置充电泵
    OLED_WriteCommand(0x14);
    OLED_WriteCommand(0xAF);	//开启显示
    OLED_Clear();				//OLED清屏
}

OLED_Font.h 

#ifndef __OLED_FONT_H
#define __OLED_FONT_H

/*OLED字模库,宽8像素,高16像素*/
const uint8_t OLED_F8x16[][16] = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //  0

    0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x33, 0x30, 0x00, 0x00, 0x00, //! 1

    0x00, 0x10, 0x0C, 0x06, 0x10, 0x0C, 0x06, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //" 2

    0x40, 0xC0, 0x78, 0x40, 0xC0, 0x78, 0x40, 0x00,
    0x04, 0x3F, 0x04, 0x04, 0x3F, 0x04, 0x04, 0x00, //# 3

    0x00, 0x70, 0x88, 0xFC, 0x08, 0x30, 0x00, 0x00,
    0x00, 0x18, 0x20, 0xFF, 0x21, 0x1E, 0x00, 0x00, //$ 4

    0xF0, 0x08, 0xF0, 0x00, 0xE0, 0x18, 0x00, 0x00,
    0x00, 0x21, 0x1C, 0x03, 0x1E, 0x21, 0x1E, 0x00, //% 5

    0x00, 0xF0, 0x08, 0x88, 0x70, 0x00, 0x00, 0x00,
    0x1E, 0x21, 0x23, 0x24, 0x19, 0x27, 0x21, 0x10, //& 6

    0x10, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //' 7

    0x00, 0x00, 0x00, 0xE0, 0x18, 0x04, 0x02, 0x00,
    0x00, 0x00, 0x00, 0x07, 0x18, 0x20, 0x40, 0x00, //( 8

    0x00, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x00,
    0x00, 0x40, 0x20, 0x18, 0x07, 0x00, 0x00, 0x00, //) 9

    0x40, 0x40, 0x80, 0xF0, 0x80, 0x40, 0x40, 0x00,
    0x02, 0x02, 0x01, 0x0F, 0x01, 0x02, 0x02, 0x00, //* 10

    0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00,
    0x01, 0x01, 0x01, 0x1F, 0x01, 0x01, 0x01, 0x00, //+ 11

    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x80, 0xB0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, //, 12

    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, //- 13

    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, //. 14

    0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x04,
    0x00, 0x60, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, /// 15

    0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00,
    0x00, 0x0F, 0x10, 0x20, 0x20, 0x10, 0x0F, 0x00, //0 16

    0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //1 17

    0x00, 0x70, 0x08, 0x08, 0x08, 0x88, 0x70, 0x00,
    0x00, 0x30, 0x28, 0x24, 0x22, 0x21, 0x30, 0x00, //2 18

    0x00, 0x30, 0x08, 0x88, 0x88, 0x48, 0x30, 0x00,
    0x00, 0x18, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, //3 19

    0x00, 0x00, 0xC0, 0x20, 0x10, 0xF8, 0x00, 0x00,
    0x00, 0x07, 0x04, 0x24, 0x24, 0x3F, 0x24, 0x00, //4 20

    0x00, 0xF8, 0x08, 0x88, 0x88, 0x08, 0x08, 0x00,
    0x00, 0x19, 0x21, 0x20, 0x20, 0x11, 0x0E, 0x00, //5 21

    0x00, 0xE0, 0x10, 0x88, 0x88, 0x18, 0x00, 0x00,
    0x00, 0x0F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, //6 22

    0x00, 0x38, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00,
    0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, //7 23

    0x00, 0x70, 0x88, 0x08, 0x08, 0x88, 0x70, 0x00,
    0x00, 0x1C, 0x22, 0x21, 0x21, 0x22, 0x1C, 0x00, //8 24

    0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00,
    0x00, 0x00, 0x31, 0x22, 0x22, 0x11, 0x0F, 0x00, //9 25

    0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, //: 26

    0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, //; 27

    0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00,
    0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, //< 28

    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
    0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, //= 29

    0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00,
    0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, //> 30

    0x00, 0x70, 0x48, 0x08, 0x08, 0x08, 0xF0, 0x00,
    0x00, 0x00, 0x00, 0x30, 0x36, 0x01, 0x00, 0x00, //? 31

    0xC0, 0x30, 0xC8, 0x28, 0xE8, 0x10, 0xE0, 0x00,
    0x07, 0x18, 0x27, 0x24, 0x23, 0x14, 0x0B, 0x00, //@ 32

    0x00, 0x00, 0xC0, 0x38, 0xE0, 0x00, 0x00, 0x00,
    0x20, 0x3C, 0x23, 0x02, 0x02, 0x27, 0x38, 0x20, //A 33

    0x08, 0xF8, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00,
    0x20, 0x3F, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, //B 34

    0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00,
    0x07, 0x18, 0x20, 0x20, 0x20, 0x10, 0x08, 0x00, //C 35

    0x08, 0xF8, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00,
    0x20, 0x3F, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, //D 36

    0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00,
    0x20, 0x3F, 0x20, 0x20, 0x23, 0x20, 0x18, 0x00, //E 37

    0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00,
    0x20, 0x3F, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, //F 38

    0xC0, 0x30, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00,
    0x07, 0x18, 0x20, 0x20, 0x22, 0x1E, 0x02, 0x00, //G 39

    0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08,
    0x20, 0x3F, 0x21, 0x01, 0x01, 0x21, 0x3F, 0x20, //H 40

    0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0x00,
    0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //I 41

    0x00, 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00,
    0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, //J 42

    0x08, 0xF8, 0x88, 0xC0, 0x28, 0x18, 0x08, 0x00,
    0x20, 0x3F, 0x20, 0x01, 0x26, 0x38, 0x20, 0x00, //K 43

    0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x20, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x30, 0x00, //L 44

    0x08, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x08, 0x00,
    0x20, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x20, 0x00, //M 45

    0x08, 0xF8, 0x30, 0xC0, 0x00, 0x08, 0xF8, 0x08,
    0x20, 0x3F, 0x20, 0x00, 0x07, 0x18, 0x3F, 0x00, //N 46

    0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00,
    0x0F, 0x10, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, //O 47

    0x08, 0xF8, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00,
    0x20, 0x3F, 0x21, 0x01, 0x01, 0x01, 0x00, 0x00, //P 48

    0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00,
    0x0F, 0x18, 0x24, 0x24, 0x38, 0x50, 0x4F, 0x00, //Q 49

    0x08, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00,
    0x20, 0x3F, 0x20, 0x00, 0x03, 0x0C, 0x30, 0x20, //R 50

    0x00, 0x70, 0x88, 0x08, 0x08, 0x08, 0x38, 0x00,
    0x00, 0x38, 0x20, 0x21, 0x21, 0x22, 0x1C, 0x00, //S 51

    0x18, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x18, 0x00,
    0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, //T 52

    0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08,
    0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, //U 53

    0x08, 0x78, 0x88, 0x00, 0x00, 0xC8, 0x38, 0x08,
    0x00, 0x00, 0x07, 0x38, 0x0E, 0x01, 0x00, 0x00, //V 54

    0xF8, 0x08, 0x00, 0xF8, 0x00, 0x08, 0xF8, 0x00,
    0x03, 0x3C, 0x07, 0x00, 0x07, 0x3C, 0x03, 0x00, //W 55

    0x08, 0x18, 0x68, 0x80, 0x80, 0x68, 0x18, 0x08,
    0x20, 0x30, 0x2C, 0x03, 0x03, 0x2C, 0x30, 0x20, //X 56

    0x08, 0x38, 0xC8, 0x00, 0xC8, 0x38, 0x08, 0x00,
    0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, //Y 57

    0x10, 0x08, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00,
    0x20, 0x38, 0x26, 0x21, 0x20, 0x20, 0x18, 0x00, //Z 58

    0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x00,
    0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x00, //[ 59

    0x00, 0x0C, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x01, 0x06, 0x38, 0xC0, 0x00, //\ 60

    0x00, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00,
    0x00, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00, //] 61

    0x00, 0x00, 0x04, 0x02, 0x02, 0x02, 0x04, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //^ 62

    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, //_ 63

    0x00, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //` 64

    0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00,
    0x00, 0x19, 0x24, 0x22, 0x22, 0x22, 0x3F, 0x20, //a 65

    0x08, 0xF8, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00,
    0x00, 0x3F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, //b 66

    0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00,
    0x00, 0x0E, 0x11, 0x20, 0x20, 0x20, 0x11, 0x00, //c 67

    0x00, 0x00, 0x00, 0x80, 0x80, 0x88, 0xF8, 0x00,
    0x00, 0x0E, 0x11, 0x20, 0x20, 0x10, 0x3F, 0x20, //d 68

    0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00,
    0x00, 0x1F, 0x22, 0x22, 0x22, 0x22, 0x13, 0x00, //e 69

    0x00, 0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0x18,
    0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //f 70

    0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
    0x00, 0x6B, 0x94, 0x94, 0x94, 0x93, 0x60, 0x00, //g 71

    0x08, 0xF8, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00,
    0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, //h 72

    0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //i 73

    0x00, 0x00, 0x00, 0x80, 0x98, 0x98, 0x00, 0x00,
    0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, //j 74

    0x08, 0xF8, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00,
    0x20, 0x3F, 0x24, 0x02, 0x2D, 0x30, 0x20, 0x00, //k 75

    0x00, 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //l 76

    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
    0x20, 0x3F, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x3F, //m 77

    0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00,
    0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, //n 78

    0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00,
    0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, //o 79

    0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00,
    0x80, 0xFF, 0xA1, 0x20, 0x20, 0x11, 0x0E, 0x00, //p 80

    0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00,
    0x00, 0x0E, 0x11, 0x20, 0x20, 0xA0, 0xFF, 0x80, //q 81

    0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00,
    0x20, 0x20, 0x3F, 0x21, 0x20, 0x00, 0x01, 0x00, //r 82

    0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
    0x00, 0x33, 0x24, 0x24, 0x24, 0x24, 0x19, 0x00, //s 83

    0x00, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x00, 0x00, //t 84

    0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00,
    0x00, 0x1F, 0x20, 0x20, 0x20, 0x10, 0x3F, 0x20, //u 85

    0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80,
    0x00, 0x01, 0x0E, 0x30, 0x08, 0x06, 0x01, 0x00, //v 86

    0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80,
    0x0F, 0x30, 0x0C, 0x03, 0x0C, 0x30, 0x0F, 0x00, //w 87

    0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00,
    0x00, 0x20, 0x31, 0x2E, 0x0E, 0x31, 0x20, 0x00, //x 88

    0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80,
    0x80, 0x81, 0x8E, 0x70, 0x18, 0x06, 0x01, 0x00, //y 89

    0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
    0x00, 0x21, 0x30, 0x2C, 0x22, 0x21, 0x30, 0x00, //z 90

    0x00, 0x00, 0x00, 0x00, 0x80, 0x7C, 0x02, 0x02,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x40, //{ 91

    0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, //| 92

    0x00, 0x02, 0x02, 0x7C, 0x80, 0x00, 0x00, 0x00,
    0x00, 0x40, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00, //} 93

    0x00, 0x06, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //~ 94
};

const uint8_t CC_F16x16[][16] = { // Custom Characters 自定义字符

    0x60, 0xF0, 0x08, 0x08, 0x08, 0xF8, 0xF0, 0x00, 0x80, 0x40, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x01, 0x21, 0x11, 0x0C, 0x02, 0x01, 0x00, 0x1E, 0x21, 0x21, 0x21, 0x33, 0x1E, 0x00, /* " %",0 */

    0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0xFF, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00,
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, /* "土",1 */

    0x10, 0x10, 0xFF, 0x10, 0x00, 0x82, 0xBA, 0xEA, 0xBA, 0x83, 0xBA, 0xEA, 0xBA, 0x82, 0x00, 0x00,
    0x08, 0x18, 0x0F, 0x04, 0x48, 0x4A, 0x2A, 0xFF, 0x8A, 0x4A, 0x1A, 0x2F, 0x5A, 0x8A, 0x88, 0x00, /* "壤",2 */

    0x10, 0x60, 0x02, 0x8C, 0x00, 0xFE, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0xFE, 0x00, 0x00, 0x00,
    0x04, 0x04, 0x7E, 0x01, 0x44, 0x48, 0x50, 0x7F, 0x40, 0x40, 0x7F, 0x50, 0x48, 0x44, 0x40, 0x00, /* "湿",3 */

    0x00, 0x00, 0xFC, 0x24, 0x24, 0x24, 0xFC, 0x25, 0x26, 0x24, 0xFC, 0x24, 0x24, 0x24, 0x04, 0x00,
    0x40, 0x30, 0x8F, 0x80, 0x84, 0x4C, 0x55, 0x25, 0x25, 0x25, 0x55, 0x4C, 0x80, 0x80, 0x80, 0x00, /* "度",4 */

};

#endif

  • 49
    点赞
  • 150
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
### 回答1: 基于STM32单片机的DHT11温湿度传感器OLED显示程序可以实现以下功能: 首先,需要连接STM32单片机与DHT11温湿度传感器以及OLED显示。 然后,编写程序读取DHT11传感器的温湿度数值。可以通过引脚连接和使用相应的库函数来实现数据读取。 接下来,使用OLED显示库函数将温湿度数据显示OLED幕上。可以在幕上创建相应的文本框或者图标来显示温湿度值。可以使用合适的库函数调用,将温湿度数据转换为字符串格式并在幕上显示出来。 同时,可以设计一个定时器来定时更新温湿度数据的显示。可以设置一个适当的时间间隔来实现数据的定时更新,并使用相应的库函数来控制定时器的启动和停止。 此外,为了增加用户体验,还可以添加一些额外的功能,比如在某个温湿度阈值过一定值时,显示警告信息或者触发报警器等。 最后,将编写好的程序下载到STM32单片机中进行测试。通过观察OLED显示是否能够正确显示温湿度数值,以及数据是否能够定时更新,来验证程序的正确性。 总体来说,基于STM32单片机的DHT11温湿度传感器OLED显示程序需要通过串口和I2C总线连接硬件设备,并使用相应的库函数来读取传感器数据和控制OLED显示,以实现温湿度数据的实时显示。 ### 回答2: 基于STM32单片机的DHT11温湿度传感器OLED显示程序可以实现如下功能。 首先,我们需要连接DHT11温湿度传感器STM32单片机的GPIO口。DHT11传感器的信号线接到单片机的输入GPIO口,供电线接到单片机的5V电源口,接地线接到单片机的地线。 接着,需要通过STM32的GPIO口读取DHT11传感器发送的温湿度数据。通过向DHT11传感器发送一个读取请求信号,然后在适当的时间间隔后读取传感器发送的数据,包括温度和湿度值。 接下来,我们需要将读取到的温湿度数据通过I2C或SPI协议发送到连接OLED显示显示出来。首先,需要初始化I2C或SPI接口,然后将温湿度数据传送到OLED显示的适当位置进行显示。可以使用相应的OLED显示库函数来帮助实现这一功能。 此外,为了更好地呈现温湿度数据,还可以添加一些额外的功能。例如,可以设置一个温度和湿度的阈值,当温度或湿度过阈值时,通过OLED显示进行警告或提示。还可以添加一个实时钟表显示当前的时间,并将当前温湿度数据显示在时钟表上。 需要注意的是,在编写程序时,应根据单片机型号和开发环境选择相应的库函数和配置参数,确保程序正确运行。 以上是基于STM32单片机的DHT11温湿度传感器OLED显示程序的简要说明。具体的实现细节和代码可以根据具体的需求和硬件平台进行调整和开发。 ### 回答3: 基于STM32单片机的DHT11温湿度传感器OLED显示程序主要实现了以下功能。 首先,我们需要通过STM32单片机与DHT11传感器进行通信。我们可以通过引脚连接和编程设置来实现数据的读取。在程序中,我们需要配置引脚输入/输出模式,并通过适当的延时来与DHT11发送和接收数据。 接下来,我们需要解析从DHT11传感器接收到的数据。DHT11传感器会发送40位二进制数据,其中包含温度和湿度信息。我们可以根据协议来解析这些数据,并将其存储到相应的变量中。 然后,我们需要将解析后的数据通过OLED显示进行显示。在STM32单片机中,我们可以使用相应的库函数来控制OLED显示。我们需要将温度和湿度信息转换为字符串,并使用适当的字符函数来显示OLED幕上。 最后,我们可以通过循环来实现数据的持续更新和显示。以一定的时间间隔读取DHT11传感器的数据,并将其显示OLED幕上。这样,我们就实现了基于STM32单片机的DHT11温湿度传感器OLED显示程序。 需要注意的是,为了确保程序的正常运行,我们还需要根据实际情况对程序进行优化和调试。这可能包括校准温湿度传感器、处理错误情况和调整程序逻辑等。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

damooc@1024

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

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

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

打赏作者

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

抵扣说明:

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

余额充值