IoT Lora-Modul vom Einstieg bis zur Kompetenz (6) OLED-Display

I. Einleitung

        Nachdem wir die Daten erhalten haben, müssen wir sie häufig auf dem OLED-Display anzeigen. In diesem Artikel müssen wir den Code des vorherigen Artikels (Erfassung von Licht-, Temperatur- und Feuchtigkeitsdaten) verwenden und den Inhalt dieses Artikels weiter vervollständigen auf dessen Grundlage.

        Basiscode:

#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);//获取温湿度
    }
}

2. Code-Implementierung

        In der Routine wird uns die Datei hal_oled.c zur Verfügung gestellt, in der wir häufig die folgenden Methoden verwenden:

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[]);//显示图片

        Der OLED-Bildschirm ist 128 * 64 groß und intern in 8 Zeilen und 4 Seiten unterteilt, nämlich 0, 2, 4, 6, sodass die Parameter von uint8_t y 0 bis 7 sind und ein Zeichen mit einer Höhe von 16 zwei Zeilen benötigt , also eine Seite .

        Unter anderem wird der dritte Parameter von OLED_ShowCHinese() vom HZK-Array in oledfont.h abgeleitet, und Sie können den Inhalt des Arrays auch selbst mit der Modulo-Software überschreiben.

        

         Als nächstes verwenden wir die Schriftarten für Temperatur und Luftfeuchtigkeit und suchen die entsprechenden Indizes aus dem Array.

        Codebeispiel:

        Der folgende Code implementiert die Funktionen chinesischer Zeichen, Zeichenfolgen, Daten und Bilder als Referenz.

#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为上述定义好的图像数组
			
    }
}

        Es gibt einige Punkte, die es zu beachten gilt:

                1. Die Header-Datei muss importiert werden. Dies ist die Grundlage dafür, dass unser Hauptprogramm die Existenz der verwendeten Methode erkennt.

                2. Nach der Initialisierung müssen Sie mit der Anzeige beginnen, damit das OLED-Display Bilder korrekt anzeigen kann

                3. Bevor Sie die Daten jedes Mal aktualisieren, stellen Sie sicher, dass Sie die OLED-Anzeige löschen. Andernfalls bleibt dieser Bereich erhalten, wenn die neuen Daten die Anzeigedaten einer bestimmten Position nicht ändern, was sich auf den Anzeigeeffekt auswirkt.

                4. Das Prinzip des Arrays ist das gleiche wie das des OLED-Displays. Es muss vor der Verwendung gelöscht werden, da es sonst zu Störungen auf der Rückseite kommt.

3. Zusammenfassung

        Das OLED-Display ist ein sehr wichtiges Ausgabegerät. Es ist ein Gerät, das es uns ermöglicht, den Zustand des Mikrocontrollers intuitiv ohne die Hilfe anderer Software zu sehen. Daher ist seine Beherrschung besonders wichtig und es ist auch die Grundlage unserer Interaktion.

Supongo que te gusta

Origin blog.csdn.net/qq_39724355/article/details/131146522
Recomendado
Clasificación