ESP8266_MicroPython——定时器_I2C 总线

news/2024/12/21 21:50:42/

MicroPython

文章目录

  • MicroPython
  • 前言
  • 一、定时器
  • 二、I2C 总线
  • 总结


前言

我们继续学习定时器和IIC

一、定时器

定时器,顾名思义就是用来计时的,我们常常会设定计时或闹钟,然后时间到了就告诉我们要做什么了。单片机也是这样,通过定时器可以完成各种预设好的任务。
ESP8266 内置 RTOS(实时操作系统)定时器,在 machine 的 Timer 模块中。通过 MicroPython 可以轻松编程使用。

tim=machine.Timer(-1)
构建定时器对象。RTOS 定时器编号为-1
tim.init(period,mode,callback)
定时器初始化。period:单位为 ms;mode:2 种工作模式,Timer.ONE_SHOT(执行一次)、Timer.PERIODIC(周期性);callback:定时器中断后的回调函数。

定时器到了预设指定时间后,也会产生中断
在这里插入图片描述

from machine import Pin,Timerled=Pin(2,Pin.OUT)
Counter = 0
Fun_Num = 0def fun(tim):global CounterCounter = Counter + 1print(Counter)led.value(Counter%2)#开启RTOS定时器,编号为-1
tim = Timer(-1)
tim.init(period=1000, mode=Timer.PERIODIC,callback=fun) #周期为1000ms

使用延时函数也可以实现这个功能,但相比于延时函数,定时器的好处就是不占用 CPU 资源。
RTOS(实时操作系统)的原理就是利用多个定时器分别执行不同任务方式实现。也可以多定义几个定时器对象 tim2,tim3,定时器标号还是-1,通过不同的周期和参数配置实现多任务的操作。

二、I2C 总线

ESP8266是通过 I2C 总线与 OLED 显示屏通讯的。
什么是 I2C?
I2C 是用于设备之间通信的双线协议,在物理层面,它由 2 条线组成:SCL 和SDA,分别是时钟线和数据线。也就是说不通设备间通过这两根线就可以进行通信。如果想详细了解,可以看主页协议介绍的文章。
什么是 OLED 显示屏?
OLED 的特性是自己发光,不像 TFT LCD 需要背光,因此可视度和亮度均高,其次是电压需求低且省电效率高,加上反应快、重量轻、厚度薄,构造简单,成本低等特点。简单来说跟传统液晶的区别就是里面像素的材料是由一个个发光二极管组成,因为密度不高导致像素分辨率低,所以早期一般用作户外 LED 广告牌。随着技术的成熟,使得集成度越来越高。小屏也可以制作出较高的分辨率。

将使用 MicroPython 的 Machine 模块来定义 Pin 口和I2C 初始化。

i2c = machine.I2C(scl,sda)
构建 I2C 对象。scl:时钟引脚;sda:数据引脚
i2c.scan()
扫描 I2C 总线的设备。返回地址,如:0x3c
i2c.readfrom(addr,nbytes)
从指定地址读数据。addr:指定设备地址;nbytes:读取字节数;
i2c.write(buf)
写数据。buf:数据内容;

定义好 I2C 后,还需要驱动一下 OLED。可以直接调用写好了 OLED 的库函数。
ssd1306.py

# ession">MicroPython SSD1306 OLED driver, I2C and SPI interfacesfrom micropython import const
import framebuf# register ession">definitions
SET_CONTRAST        = const(0x81)
SET_ENTIRE_ON       = const(0xa4)
SET_NORM_INV        = const(0xa6)
SET_DISP            = const(0xae)
SET_MEM_ADDR        = const(0x20)
SET_COL_ADDR        = const(0x21)
SET_PAGE_ADDR       = const(0x22)
SET_DISP_START_LINE = const(0x40)
SET_SEG_REMAP       = const(0xa0)
SET_MUX_RATIO       = const(0xa8)
SET_COM_OUT_DIR     = const(0xc0)
SET_DISP_OFFSET     = const(0xd3)
SET_COM_PIN_CFG     = const(0xda)
SET_DISP_CLK_DIV    = const(0xd5)
SET_PRECHARGE       = const(0xd9)
SET_VCOM_DESEL      = const(0xdb)
SET_CHARGE_PUMP     = const(0x8d)# ession">Subclassing FrameBuffer provides support for graphics primitives
# httpession">://docs.micropython.org/en/latest/pyboard/library/framebuf.html
class SSD1306(framebuf.FrameBuffer):def __init__(self, width, height, external_vcc):self.width = widthself.height = heightself.external_vcc = external_vccself.pages = self.height // 8self.buffer = bytearray(self.pages * self.width)super().__init__(self.buffer, self.width, self.height, framebuf.MONO_VLSB)self.init_display()def init_display(self):for cmd in (SET_DISP | 0x00, # off# address ession">settingSET_MEM_ADDR, 0x00, # horizontal# resolution ession">and layoutSET_DISP_START_LINE | 0x00,SET_SEG_REMAP | 0x01, # column addr 127 mapped to SEG0SET_MUX_RATIO, self.height - 1,SET_COM_OUT_DIR | 0x08, # scan from COM[N] to COM0SET_DISP_OFFSET, 0x00,SET_COM_PIN_CFG, 0x02 if self.height == 32 else 0x12,# timing ession">and driving schemeSET_DISP_CLK_DIV, 0x80,SET_PRECHARGE, 0x22 if self.external_vcc else 0xf1,SET_VCOM_DESEL, 0x30, # 0.83*Vcc# displaySET_CONTRAST, 0xff, # maximumSET_ENTIRE_ON, # output follows RAM contentsSET_NORM_INV, # not inverted# charge ession">pumpSET_CHARGE_PUMP, 0x10 if self.external_vcc else 0x14,SET_DISP | 0x01): # onself.write_cmd(cmd)self.fill(0)self.show()def poweroff(self):self.write_cmd(SET_DISP | 0x00)def poweron(self):self.write_cmd(SET_DISP | 0x01)def contrast(self, contrast):self.write_cmd(SET_CONTRAST)self.write_cmd(contrast)def invert(self, invert):self.write_cmd(SET_NORM_INV | (invert & 1))def show(self):x0 = 0x1 = self.width - 1if self.width == 64:# displays ession">with width of 64 pixels are shifted by 32x0 += 32x1 += 32self.write_cmd(SET_COL_ADDR)self.write_cmd(x0)self.write_cmd(x1)self.write_cmd(SET_PAGE_ADDR)self.write_cmd(0)self.write_cmd(self.pages - 1)self.write_data(self.buffer)class SSD1306_I2C(SSD1306):def __init__(self, width, height, i2c, addr=0x3c, external_vcc=False):self.i2c = i2cself.addr = addrself.temp = bytearray(2)super().__init__(width, height, external_vcc)def write_cmd(self, cmd):self.temp[0] = 0x80 # Co=1, D/C#=0self.temp[1] = cmdself.i2c.writeto(self.addr, self.temp)def write_data(self, buf):self.temp[0] = self.addr << 1self.temp[1] = 0x40 # Co=0, D/C#=1self.i2c.start()self.i2c.write(self.temp)self.i2c.write(buf)self.i2c.stop()class SSD1306_SPI(SSD1306):def __init__(self, width, height, spi, dc, res, cs, external_vcc=False):self.rate = 10 * 1024 * 1024dc.init(dc.OUT, value=0)res.init(res.OUT, value=0)cs.init(cs.OUT, value=1)self.spi = spiself.dc = dcself.res = resself.cs = csimport timeself.res(1)time.sleep_ms(1)self.res(0)time.sleep_ms(10)self.res(1)super().__init__(width, height, external_vcc)def write_cmd(self, cmd):self.spi.init(baudrate=self.rate, polarity=0, phase=0)self.cs(1)self.dc(0)self.cs(0)self.spi.write(bytearray([cmd]))self.cs(1)def write_data(self, buf):self.spi.init(baudrate=self.rate, polarity=0, phase=0)self.cs(1)self.dc(1)self.cs(0)self.spi.write(buf)self.cs(1)

看一下函数的使用

oled = SSD1306_I2C(width, height, i2c, addr)
构建OLED 显示屏对象。width:屏幕宽像素;height: 屏幕高像素;i2c:定义好的I2C 对象; addr:显示屏设备地址
oled.text(string,x,y)
将 string 字符写在指定为位置。string:字符;x:横坐标;y:纵坐标。
oled.show()
执行显示。
oled.fill(RGB)
清屏。RGB:0 表示黑色,1 表示白色

直接看一下代码


from machine import I2C,Pin         #从machine模块导入I2C、Pin子模块
from ssd1306 import SSD1306_I2C     #从ssd1306模块中导入SSD1306_I2C子模块i2c = I2C(sda=Pin(13), scl=Pin(14))   #I2C初始化:sda--> 13, scl --> 14
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c) #OLED显示屏初始化:128*64分辨率,OLED的I2C地址是0x3coled.text("Hello World!", 0,  0)      #写入第1行内容
oled.text("MicroPython",  0, 20)      #写入第2行内容oled.show()   #OLED执行显示

不同厂家的产品地址可能预设不一样,也可以通过 I2C.scan()来获取设备地址。
将 ssd1306.py 驱动文件拷贝到 ESP8266 的文件系统下,跟 main.py 保持同一个路径。
http://docs.micropython.01studio.org/zh-cn/latest/(01科技链接)
在这里插入图片描述

总结

MicroPython有一个很大的好处就是有很多已经完善的库,只要看一下函数是如何使用的就可以了,可以大大减少我们的开发时间。


http://www.ppmy.cn/news/1527378.html

相关文章

基于ssm+vue+uniapp的智能停车场管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

Windows电脑A远程连接电脑B

首先需要把电脑B的ip进行确认 使用Windowsr 调出cmd&#xff0c;如何使用一下命令看ip ipconfigip看以无线局域网适配器 WLAN里面的本地链接IPV6地址&#xff1a;X.X.X.X&#xff08;这是那个地址的格式就是&#xff0c;例如为10.222.1.2&#xff09; 之后把电脑B,此电脑属性-…

TCP 拥塞控制:一场网络数据的交通故事

从前有条“高速公路”&#xff0c;我们叫它互联网&#xff0c;而这条公路上的车辆&#xff0c;则是数据包。你可以把 TCP&#xff08;传输控制协议&#xff09;想象成一位交通警察&#xff0c;负责管理这些车辆的行驶速度&#xff0c;以防止交通堵塞——也就是网络拥塞。 第一…

CentOS 入门

CentOS 自由开源操作系统&#xff0c;广泛应用于服务器和开发环境。作为一名初学者&#xff0c;掌握 CentOS 的基本操作和常用命令是非常重要的。 一、CentOS 安装指南 1.1 下载 CentOS ISO 镜像 访问 CentOS 官方网站下载最新版本的 ISO 镜像文件。选择适合你需求的版本&…

Rust:深入浅出说一说 Error 类型

1. Rust 的错误返回机制 Rust 函数计算过程如果发生错误怎么办&#xff1f;Rust没有采取 C 的异常机制&#xff0c;而是允许直接返回错误信息。 这意味着&#xff0c;Rust 提供了错误返回机制&#xff0c;允许函数正常结束时返回计算结果&#xff0c;同时&#xff0c;如果计算…

针对Docker容器的可视化管理工具—DockerUI

目录 ⛳️推荐 前言 1. 安装部署DockerUI 2. 安装cpolar内网穿透 3. 配置DockerUI公网访问地址 4. 公网远程访问DockerUI 5. 固定DockerUI公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

侦察机的性能!!!

一、飞行性能 高空高速飞行能力&#xff1a; 战略侦察机通常具有高空高速飞行能力&#xff0c;能够在敌方防空系统难以企及的高度和速度下执行侦察任务。 战术侦察机虽然不以高空高速为主要特点&#xff0c;但同样具备较好的飞行性能&#xff0c;以满足低空、高速或隐蔽飞行…

MATLAB中的异常处理机制:掌握错误和警告的管理

在MATLAB编程中&#xff0c;异常处理是一个关键组成部分&#xff0c;它允许程序员管理和响应在程序执行过程中可能发生的错误和警告。MATLAB提供了一套完整的机制来捕获、处理和引发异常&#xff0c;这些机制基于try/catch语句&#xff0c;以及error和warning函数。 1. 异常处…