物联网Lora模块从入门到精通(六)OLED显示屏

news2024/11/16 17:40:07

一、前言

        获取到数据后我们常需要在OLED显示屏上显示,本文中我们需要使用上一篇文章(光照与温湿度数据获取)的代码,在其基础上继续完成本文内容。

        基础代码:

#include <string.h>
#include "board.h"
#include "hal_key.h"
#include "tim-board.h"
#include "timer_handles.h"
#include "led_light.h"
#include "adc_reader.h"
#include <math.h>          //library 
#include <stdio.h>
#include "stm32l1xx_hal.h" // controller register definitions 
#include "sht1x.h"         // controller register definitions 
#include "sht3x.h"

void Init() {
    BoardInitMcu();
    BoardInitPeriph();
    keys_init();//按键初始化
    setTimer2Callback(Time2Handler);
    Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
}

float temp=0,hum=0,light=0;
int main( void )
{
    Init();
		ADCS_Init();//初始化ADC
		hal_temHumInit();//初始化温湿度模块
    while( 1 )
    {
				HAL_Delay(1000);//延时1000ms
				AdcScanChannel();//更新通道值
				light=((5.0/2.0)*AdcReadCh0())*100.0;//获取光照并通过公式计算
				call_sht11(&temp,&hum);//获取温湿度
    }
}

二、代码实现

        例程中,为我们提供了hal_oled.c文件,其中为我们常使用下列方法:

void OLED_Display_On(void);//开启展示
void OLED_Display_Off(void);//关闭展示						   		    
void OLED_Init(void);//初始化OLED   							   		    
void OLED_Clear(void);//清空显示内容
void OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t t);//OLED屏幕画点
void OLED_ShowString(uint8_t x,uint8_t y, uint8_t *p);//OLED显示字符串
void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no);//显示汉字
void OLED_DrawBMP(unsigned char x, unsigned char y,unsigned char width, unsigned char hight,unsigned char BMP[]);//显示图片

        OLED的屏幕是128*64,内部将其分为了8行4页,即0、2、4、6,因此uint8_t y的参数为0~7,且一个高16的字符需要两行,即一页。

        其中,OLED_ShowCHinese()的第三个参数是来源于oledfont.h中的HZK数组,大家也可以通过取模软件自行取模覆盖掉该数组的内容。

        

         下面,我们会用到温度与湿度的字模,从数组中找到他们对应的下标。

        代码示例:

        下列代码实现了汉字、字符串、数据、图片的功能,以供大家学习参考。

#include <string.h>
#include "board.h"
#include "hal_key.h"
#include "tim-board.h"
#include "timer_handles.h"
#include "led_light.h"
#include "adc_reader.h"
#include <math.h>          //library 
#include <stdio.h>
#include "stm32l1xx_hal.h" // controller register definitions 
#include "sht1x.h"         // controller register definitions 
#include "sht3x.h"

void Init() {
    BoardInitMcu();
    BoardInitPeriph();
    keys_init();//按键初始化
    setTimer2Callback(Time2Handler);
    Tim2McuInit(1);//定时器初始化,设置定时中断1ms中断一次
}

unsigned char bmp[]={//图像取模后的数组
0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF,0xFE,0xFC,0xF8,0xF0,
0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x08,0x1C,0x3E,0x7F,0x7F,0xBF,0xDF,0x6F,0xBF,
0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3E,0x1C,0x08,0x10,0x18,
0x6C,0xB6,0xDB,0x6D,0xB6,0xDB,0x6D,0xB6,0xDB,0x6D,0xB7,0xDB,0x6F,0xB7,0xDB,0x6D,
0xB6,0xDA,0x6C,0x30,0x10,0x00,0x00,0x00,0x00,0x00,0x03,0x05,0x06,0x1B,0x2D,0x36,
0xDB,0x6D,0x36,0x1B,0x0D,0x06,0x03,0x01,0x00,0x00,0x00,0x00
};
float temp=0,hum=0,light=0;
uint8_t data[20];
int main( void )
{
    Init();
		ADCS_Init();//初始化ADC
		hal_temHumInit();//初始化温湿度模块
		OLED_Init();//初始化OLED屏幕
		OLED_Display_On();//开启展示
    while( 1 )
    {
				HAL_Delay(1000);//延时1000ms
				AdcScanChannel();//更新通道值
				light=((5.0/2.0)*AdcReadCh0())*100.0;//获取光照并通过公式计算
				call_sht11(&temp,&hum);//获取温湿度
				OLED_Clear();
				OLED_ShowCHinese(0,0,24);//湿 第二个参数代表从0行开始 将字写在0-1行
				OLED_ShowCHinese(16,0,23);//度 第一个参数代表左边的像素距离 
				//要把第一个字16*16的距离空出来 否则会覆盖第一个字 一个汉字的大小是16*16
				memset(data,'\0',20);//清空数组
				sprintf((char *)data,"%.2f %%RH",hum);//将内容写到数组中
				OLED_ShowString(16*2,0,data);//显示数组内的内容
				//16*2代表左边空出两个字的距离 
				OLED_ShowString(0,2,(uint8_t *)"xixi_cainiao");//直接显示字符串 xixi_cainiao
				//第二个参数为2代表显示在2-3行
				OLED_DrawBMP(0,4,32,32,bmp);//在距离左边为0 第4行开始 画一个32*32的图像
				//bmp为上述定义好的图像数组
			
    }
}

        其中有值得注意的几点:

                1.必须导入头文件,头文件是使我们的主程序知道所使用的方法存在的基础。

                2.初始化后需要开始展示,OLED显示屏才能够正确显示图像

                3.在每次更新数据前,务必需要清空OLED显示屏,否则,如果新的数据对某个位置的显示数据没有改变,该区域就会保留,影响显示效果。

                4.数组与OLED显示屏原理相同,使用前务必清空,否则会对后面造成干扰。

三、总结

        OLED显示屏是一个十分重要的输出设备,它是我们不借助其他软件让我们直观看到单片机状态的设备,因此它的掌握尤为重要,也是我们交互的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/634788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring boot之WEB 开发-静态资源访问--自定义转换器--处理JSON--内容协商

Spring boot之WEB 开发-静态资源访问 官方文档 在线文档: https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.develo\ping-web-applications 基本介绍 1. 只要静态资源放在类路径下&#xff1a; /static 、/public 、/resources 、/M…

2023-06-11:redis中,如何在100个亿URL中快速判断某URL是否存在?

2023-06-11&#xff1a;redis中&#xff0c;如何在100个亿URL中快速判断某URL是否存在&#xff1f; 答案2023-06-11&#xff1a; 传统数据结构的不足 当然有人会想&#xff0c;我直接将网页URL存入数据库进行查找不就好了&#xff0c;或者建立一个哈希表进行查找不就OK了。 …

【Java】数组是引用类型

【Java】数组是引用类型 Java虚拟机运行时的数据区基本类型变量与引用类型变量的区别 Java虚拟机运行时的数据区 程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址。 虚拟机栈(JVM Stack): 与方法调用相关的一些信息&#xff0c;每个方法在执行时&a…

【算法系列 | 5】深入解析排序算法之——快速排序

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 决定开一个算法专栏&#xff0c;希望能帮助大…

【日志解析】【频率分析】ULP:基于正则表达式和本地频率分析进行日志模板提取

An Effective Approach for Parsing Large Log Files 文章目录 An Effective Approach for Parsing Large Log Files1 论文出处2 背景2.1 背景介绍2.2 针对问题2.3 创新点 3 主要设计思路3.1 预处理3.2 日志事件分组3.3 通过频率分析生成日志模板 4 实验设计4.1 准确性4.2 效率…

物联网Lora模块从入门到精通(八)Lora无线通信

一、前言 在某些环境下&#xff0c;无法通过有线传输数据&#xff0c;这时候我们需要使用Lora无线通信传输数据&#xff0c;Lora无线数据传输具有低功耗、距离长的特点&#xff0c;常用于工厂内等&#xff0c;需要Lora基站。 我曾做过距离测试&#xff1a;Lora模块距离测试-物联…

【Pytest实战】pytest 基本概念及使用大全

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

Spring6-02

JdbcTemplate JdbcTemplate是Spring提供的一个JDBC模板&#xff0c;是对JDBC的封装&#xff0c;简化了JDBC代码。当然也可以不用JdbcTemplate&#xff0c;可以让Spring集成其他的ORM框架&#xff0c;例如MyBatis、Hibernate等。接下来使用JdbcTemplate完成增删改查。 环境准备…

重写并自定义console.log()输出样式

0. 背景 笔者在开发的实践过程中对于控制台内容的输出情况有一些特殊的需求&#xff0c;然而&#xff0c;普通的console.log()函数不能提供很好的支持&#xff0c;因此需要探索一些自定义的实现方式&#xff0c;以便满足开发需求&#xff0c;一些开发需求如下&#xff1a; 输…

编译详细过程与交叉编译

GCC的编译过程&#xff1a; GCC编译分为四步&#xff0c;预处理、编译、汇编、链接。具体功能如上图所示&#xff0c;我们在稍微解释一下&#xff1a; 1.预处理&#xff1a; 实现过程&#xff1a;gcc -E xxx.c -o xxx.i 目的&#xff1a;我们的c程序中除了main函数以外&…

如何在Linux中使用read命令读取用户输入?——read命令实战

前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文是专栏【linux基本功-基础命令实战】的第64篇文章。 专栏地址&#xff1a;[linux基本功-基础命令专栏] &#xff0c; 此专栏是沐风晓月对Linux常用命令的汇总&#xff0c;希望对你有用。 今天我们一…

实现jvm内存溢出

那么我们如何来构建一个堆内存溢出呢&#xff1f;其实很简单&#xff0c;我们只要定义一个List对象&#xff0c;然后通过一个循环不停的往List里面塞对象。因为只要Controller不被回收&#xff0c;那么它里面的成员变量也是不会被回收的。这样就会导致List里面的对象越来越多&a…

Play wright自动化测试工具该如何更加完美地使用

目录 1.1 拦截网络请求 1.2 pytest 管理用例 1.3 PO模型 1.4 API 和 UI 自动化测试融合 1.5 数据驱动 1.6 动态挑选用例执行 1.6 Allure测试报告 1.7 持续集成 1.1 拦截网络请求 网络拦截&#xff1a; 无响应 pass 中止 route.abort("aborted") 放行 route…

Hazel游戏引擎(013)Layers游戏的层级

文中若有代码、术语等错误&#xff0c;欢迎指正 文章目录 前言增加Layer后的主要类图项目相关代码项目流程效果 LayerStack类的错误 前言 此节目的 为完成008事件系统设计的第四步&#xff0c;将事件从Application传递分发给Layer层。 使引擎事件系统模块完整 Layer的理解 …

在VSCode下利用PlateFormIO开发Arduino的MicroROS遇到的一些问题

简介 我是按照鱼香ROS的教程【3.搭建PlateFormIO开发环境】进行的&#xff0c;但是在进行的过程中&#xff0c;遇到了一些问题&#xff0c;这里记录下来&#xff0c;供有同样问题的同学进行参考。其实只要你使用的板子的MCU是ESP32&#xff0c;都可以按照他这个教程进行操作。…

k8s实践之mysql集群搭建(十五)

先下载 k8s实践之mysql集群搭建资料 主从模式简介&#xff1a; 当master主服务器上的数据发生改变时&#xff0c;则将其改变写入二进制&#xff08;binlog&#xff09;事件日志文件中&#xff1b; slave从服务器会在一定时间间隔内对master主服务器上的二进制日志进行探测&am…

掌握Vue生命周期,让你的前端开发效率翻倍!

1 Vue实例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Vue实例</title><script src../vue.js></script> </head> <body><div id"root"><!-- v…

位图以及布隆过滤器

本文主要讲解哈希思想的实际应用&#xff0c;位图和布隆过滤器。 位图 讲解位图之前我们先来解答这样一道腾讯的面试题 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。【腾讯】 很多人立马就想到了用…

Seata TCC 模式理论学习、生产级使用示例搭建及注意事项 | Spring Cloud55

一、前言 通过以下系列章节&#xff1a; docker-compose 实现Seata Server高可用部署 | Spring Cloud 51 Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52 Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53 Seata XA 模式理论学习、使用…

STL——set容器、map容器

初识STL **set容器/multiset容器****set容器——构造和赋值****set容器——大小和交换****set容器——插入和删除****set容器的查找和统计****set和multiset的区别****set的相关操作源码&#xff1a;****multiset的相关操作源码** **pair使用——pair队组的创建****set容器——…