8847| 29
|
[MP动手做] MicroPython动手做(14)——掌控板之OLED屏 |
1、OLED显示模块 有机发光二极管(Organic Light-Emitting Diode, UIV OLED)又称为有机电激光显示、有机发光半导体(Organic Electroluminesence Display, UIV OLED)。与液晶显示(Liquid Crystal Display, LCD)是不同类型的发光原理。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低耗电、极高反应速度等优点。 OLED显示模块为OLED显示屏+PCB+铁框构成,便于安装,广泛应用于工业现场,军工等行业。 主要特点:OLED为自发光材料,不需用到背光板,同时视角广、画质均匀、反应速度快、较易彩色化、用简单驱动电路即可达到发光、制程简单、可制作成挠曲式面板,符合轻薄短小的原则,应用范围属于中小尺寸面板。 显示方面:主动发光、视角范围大;响应速度快,图像稳定;亮度高、色彩丰富、分辨率高。 工作条件:驱动电压低、能耗低,可与太阳能电池、集成电路等相匹配。 适应性广:采用玻璃衬底可实现大面积平板显示;如用柔性材料做衬底,能制成可折叠的显示器。由于OLED是全固态、非真空器件,具有抗震荡、耐低温(-40℃)等特性,在军事方面也有十分重要的应用,如用作坦克、飞机等现代化武器的显示终端。 |
12、跳动屏显32个字 //MicroPython动手做(14)——掌控板之OLED屏幕 //跳动屏显32个字 [mw_shl_code=applescript,false]//MicroPython动手做(14)——掌控板之OLED屏幕 //跳动屏显32个字 #include <MPython.h> // 动态变量 volatile float mind_n_Xing, mind_n_Lie; // 主程序开始 void setup() { mPython.begin(); } void loop() { mind_n_Xing = 0; while (!(mind_n_Xing>=4)) { mind_n_Lie = 0; while (!(mind_n_Lie>=8)) { display.setCursor((mind_n_Lie * 16), (mind_n_Xing * 16)); display.print("掌"); mind_n_Lie += 1; yield(); } mind_n_Xing += 1; yield(); } buzz.freq(196, BEAT_1_4); delay(1000); mind_n_Xing = 0; while (!(mind_n_Xing>=4)) { mind_n_Lie = 0; while (!(mind_n_Lie>=8)) { display.setCursor((mind_n_Lie * 16), (mind_n_Xing * 16)); display.print("控"); mind_n_Lie += 1; yield(); } mind_n_Xing += 1; yield(); } buzz.freq(196, BEAT_1_4); delay(1000); mind_n_Xing = 0; while (!(mind_n_Xing>=4)) { mind_n_Lie = 0; while (!(mind_n_Lie>=8)) { display.setCursor((mind_n_Lie * 16), (mind_n_Xing * 16)); display.print("板"); mind_n_Lie += 1; yield(); } mind_n_Xing += 1; yield(); } buzz.freq(392, BEAT_1_4); delay(1000); } [/mw_shl_code] |
9、实现OLED动态打字效果 [mw_shl_code=applescript,false]# 动态打字效果 from mpython import * oled.fill(0) # 显示的字符串 _str = "掌控板是一块MicroPython微控制器板,使用当下最流行的Python编程语言,以便您轻松地将代码从桌面传输到微控制器或嵌入式系统。掌控板是一块普及STEAM创客教育、人工智能教育、编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。掌控板上配置了OLED显示屏、RGB灯、加速度计、麦克风、光线传感器、蜂鸣器、按键开关、触摸开关、金手指外部拓展接口,支持图形化及python代码编程,可实现智能机器人、创客智造作品等智能控制类应用。利用掌控上丰富的传感器,结合它小尺寸的特点还可以做很多智能穿戴、电子饰品等各种DIY作品应用。" # 起点坐标 axis = (0, 0) # 逐字显示,根据返回的坐标续接显示 for c in _str: response = oled.DispChar(c, axis[0], axis[1]) char_width = response[0] axis = response[1] oled.show() # 满屏时,清屏 if axis[1] >= 64 - 16 and char_width >= 128-axis[0]: print('Clear screen') oled.fill(0)[/mw_shl_code] 注解: oled.DispChar_font(font, s, x, y, invert=False) 自定义字体显示。用户可根据自己需求,在PC端将 otf 、 ttf 标准字体文件通过Python脚本 font_to_py.py 转为输出含字体Bitmap的python源码,调用使用。 返回(字符总像素点宽度,续接显示的x,y坐标)的二元组。 font - 字体对象。font_to_py.py 脚本转换得到的Python源码, 放到文件系统中,注意,在使用函数前须导入font文件。 s - 显示的字符串 x 、 y - 文本的左上角作为起点坐标。 invert - 显示像素点翻转。 在PC端使用font_to_py.py脚本转换字体: # 转换高度为16像素只包含ASCII字符集 font_to_py.py -x FreeSans.ttf 16 myfont.py # 转换高度为16像素指定Unicode字符集,-c参数后面为你指定的字符集 font_to_py.py -x simfang.ttf 16 simfang.py -c ¬!"#£$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~°Ωαβγδθλμπωϕ£ |
10、动态正弦与圆的关系 通过掌控板载的oled,显示正弦与圆的关系。 [mw_shl_code=applescript,false]#MicroPython动手做(14)——掌控板之OLED屏幕 #动态正弦与圆的关系 from mpython import * from machine import Timer import math def upRange(start, stop, step): while start <= stop: yield start start += abs(step) def downRange(start, stop, step): while start >= stop: yield start start -= abs(step) def timer1_tick(_): global Dy, Dx, i, j, my_list, _item oled.fill_rect(48, 0, 80, 64, 0) oled.hline(48, 32, 80, 1) oled.vline(48, 8, 50, 1) j_end = int(len(my_list) - 1) for j in (0 <= j_end) and upRange(0, j_end, 1) or downRange(0, j_end, 1): oled.pixel(((len(my_list) + 49) - j), my_list[j], 1) tim1 = Timer(1) def add_to_list(_item): global Dy, Dx, i, j, my_list my_list.append(_item) if len(my_list) > 72: my_list.pop(0) my_list = [] oled.fill(0) tim1.init(period=100, mode=Timer.PERIODIC, callback=timer1_tick) while True: for i in range(0, 361, 5): oled.fill_rect(0, 0, 47, 64, 0) oled.circle(20, 32, 20, 1) Dx = int((20 + math.cos(math.radians(i)) * 20)) Dy = int((32 - math.sin(math.radians(i)) * 20)) oled.line(20, 32, Dx, Dy, 1) oled.line(Dx, Dy, 46, Dy, 1) oled.show() add_to_list(Dy) [/mw_shl_code] |
2、OLED屏工作原理 OLED的基本结构是由一薄而透明具半导体特性之铟锡氧化物(ITO),与电力之正极相连,再加上另一个金属阴极,包成如三明治的结构。整个结构层中包括了:空穴传输层(HTL)、发光层(EL)与电子传输层(ETL)。当电力供应至适当电压时,正极空穴与阴极电荷就会在发光层中结合,产生光亮,依其配方不同产生红、绿和蓝RGB三原色,构成基本色彩。OLED的特性是自己发光,不像TFT LCD需要背光,因此可视度和亮度均高,其次是电压需求低且省电效率高,加上反应快、重量轻、厚度薄,构造简单,成本低等,被视为 21世纪最具前途的产品之一。 有机发光二极体的发光原理和无机发光二极体相似。当元件受到直流电(Direct Current;DC)所衍生的顺向偏压时,外加之电压能量将驱动电子(Electron)与空穴(Hole)分别由阴极与阳极注入元件,当两者在传导中相遇、结合,即形成所谓的电子-空穴复合(Electron-Hole Capture)。而当化学分子受到外来能量激发后,若电子自旋(Electron Spin)和基态电子成对,则为单重态(Singlet),其所释放的光为所谓的荧光(Fluorescence);反之,若激发态电子和基态电子自旋不成对且平行,则称为三重态(Triplet),其所释放的光为所谓的磷光(Phosphorescence)。 |
坐标X、Y值即对应屏幕横向、纵向位置。其实这样的X、Y在屏幕上就构成了一个直角坐标系。当X、Y值对应为0、0的时候,文字显示在屏幕的左上角;当Y值不变、X的值增加,文字垂直高度不变,水平向右移动;当X值不变、Y的值增加,文字水平位置不变,垂直向下移动。文字移动的这两个方向即构成了如下图所示的X、Y直角坐标系。水平方向用X轴表示,垂直方向用Y轴表示。 在数学中,是这样定义直角坐标系的:在平面内画两条互相垂直,并且有公共原点的数轴,其中横轴为X轴,纵轴为Y轴,这样我们就说在平面上建立了平面直角坐标系,简称直角坐标系。 掌控板屏幕分辨率为128x64,所以X轴的数值为0-127,Y轴的数值为0-63。 |
5、画直线(三横三竖) [mw_shl_code=applescript,false]from mpython import * import time while True: oled.fill(0) oled.show() time.sleep(1) oled.hline(0, 16, 128, 1) oled.show() time.sleep(1) oled.hline(0, 32, 128, 1) oled.show() time.sleep(1) oled.hline(0, 48, 128, 1) oled.show() time.sleep(1) oled.fill(0) oled.show() time.sleep(1) oled.vline(33, 0, 64, 1) oled.show() time.sleep(1) oled.vline(66, 0, 64, 1) oled.show() time.sleep(1) oled.vline(99, 0, 64, 1) oled.show() time.sleep(1)[/mw_shl_code] |
6、画圆、三角形和矩形 [mw_shl_code=applescript,false]from mpython import * import time while True: oled.fill(0) oled.DispChar("Hello, world!", 0, 16, 1) oled.show() time.sleep(1) oled.fill(0) oled.circle(64, 32, 30, 1) oled.fill_triangle(0, 0, 20, 40, 90, 63, 1) oled.RoundRect(40, 20, 50, 30, 30, 1) oled.rect(60, 20, 20, 50, 1) oled.show() time.sleep(1)[/mw_shl_code] |
7、动态曲线图形 [mw_shl_code=applescript,false]from mpython import * import time def testdrawline(): for i in range(0,64): oled.line(0,0,i*2,63,1) oled.show() for i in range(0,32): oled.line(0,0,127,i*2,1) oled.show() time.sleep_ms(250) oled.fill(0) oled.show() for i in range(0,32): oled.line(0,63,i*4,0,1) oled.show() for i in range(0,16): oled.line(0,63,127,(64-4*i)-1,1) oled.show() time.sleep_ms(250) oled.fill(0) oled.show() for i in range(1,32): oled.rect(2*i,2*i,(128-4*i)-1,(64-2*i)-1,1) oled.show() testdrawline()[/mw_shl_code] |
8、oled对象 oled对象为framebuf的衍生类,继承framebuf的方法。 oled.poweron() 开启显示屏电源。 oled.poweroff() 关闭显示器电源。 oled.contrast(brightness) 设置显示屏亮度。 brightness 亮度,范围0~255 oled.invert(n) 翻转像素点。当n=1时,未填充像素点点亮,填充像素点灭。当n=0时,则反。默认启动是填充像素点点亮。 oled.DispChar(s, x, y, mode=TextMode.normal) oled屏显示文本。采用 Google Noto Sans CJK 开源无衬线字体字体。字体高度16像素点,支持英文,简体中文繁体中文,日文和韩文语言。 当显示字符串超出显示屏宽度可自动换行。 返回(字符总像素点宽度,续接显示的x,y坐标)的二元组。 s -需要显示的文本。 x 、y -文本的左上角作为起点坐标。 mode - 设置文本模式,默认为TextMode.normal TextMode.normal - 等于1 。普通模式,文本显示白色,背景为黑色。 TextMode.rev - 等于2 。反转模式,文本显示黑色,背景为白色。 TextMode.trans - 等于3 。透明模式,透明文本意味着文本被写在显示中已经可见的内容之上。不同之处在于,以前屏幕上的内容仍然可以看到,而对于normal,背景将被当前选择的背景颜色所替代。 TextMode.xor - 等于4 。XOR模式,如果背景是黑色的,效果与默认模式(normal模式)相同。如果背景为白色,则反转文本。 oled.show() 将frame缓存发送至oled显示。 |
oled.fill(c) 用指定的颜色填充整个帧缓存。 c 为1时,像素点亮;c 为0时,像素点灭。 oled.circle(x, y, radius, c) 绘制圆 x 、y -左上角作为起点坐标。 radius -圆半径大小 c -为1时,像素点亮;c 为0时,像素点灭。 oled.fill_circle(x, y, radius, c) 绘制实心圆 x 、y -左上角作为起点坐标。 radius -圆半径大小 c -为1时,像素点亮;c 为0时,像素点灭。 oled.triangle(x0, y0, x1, y1, x2, y2, c) 绘制三角形 x0 、y0 -三角形上顶点坐标 。 x1 、y1 -三角形左顶点坐标 。 x2 、y2 -三角形左顶点坐标 。 c -为1时,像素点亮;c 为0时,像素点灭。 oled.fill_triangle(x0, y0, x1, y1, x2, y2, c) 绘制实心三角形 x0 、y0 -三角形上顶点坐标 。 x1 、y1 -三角形左顶点坐标 。 x2 、y2 -三角形左顶点坐标 。 c -为1时,像素点亮;c 为0时,像素点灭。 oled.bitmap(x, y, bitmap, w, h, c) 绘制bitmap图案 x 、y -左上角作为起点坐标 bitmap -图案bitmap 的btyearray字节数组 w -图案宽度 h -图案高度 c -为1时,像素点亮; oled.RoundRect(x, y, w, h, r, c) 绘制弧角矩形 x 、y -左上角作为起点坐标 w -图案宽度 h -图案高度 r -圆弧角半径 c -为1时,像素点亮;c 为0时,像素点灭。 |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed