ESP8266_MicroPython——定时器_I2C 总线

news/2024/9/19 22:51:08/ 标签: python, es

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. 异常处…

CommaSeparatedListOutputParser

CommaSeparatedListOutputParser&#xff08;逗号分隔列表输出解析器&#xff09;是一个假想的类或组件名称&#xff0c;用于描述一个功能&#xff0c;即将逗号分隔的字符串&#xff08;Comma-Separated Values, CSV&#xff09;解析成更易于处理的数据结构&#xff0c;如列表&…

Spark处理结构化数据:DataFrame、DataSet、SparkSQL

Spark处理结构化数据&#xff1a;DataFrame、DataSet、SparkSQL 1. DataFrame: 表示分布式数据集合&#xff0c;以表格的形式存储数据&#xff0c;具有行和列。 支持丰富的操作和转换&#xff08;如过滤、选择、聚合等&#xff09;。 提供了对数据的高级抽象&#xff0c;简化了…

硬件工程师笔试面试——保险丝

目录 10、保险丝 10.1 基础 保险丝原理图 保险丝实物图 10.1.1 概念 10.1.2 保险丝的工作原理 10.1.3 保险丝的主要类型 10.1.4 保险丝的选择和使用注意事项 10.2 相关问题 10.2.1 保险丝的额定电流和额定电压是如何确定的? 10.2.2 保险丝的熔断速度对电路保护有何…

C/C++实现植物大战僵尸(PVZ)(打地鼠版)

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 游戏…

【最新华为OD机试E卷】报文响应时间(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

k8s防火墙networkPolicy,其他规则和端口规则ports的匹配顺序,进站策略ingress和出站策略egress中,ports规则的常用方法。

端口策略和其他策略的顺序关系是什么 一共四个策略 ipBlock podSelector namespaceSlector ------------------ ports ports这个策略&#xff0c;和前面三个不同 什么不同 匹配顺序不同 在网络通信OSI七层模型中 一个数据包从A到B B接收到数据包是先看ip 选择是否接…

怎么使用Chrome与C++实现高效自动化测试

在软件开发过程中&#xff0c;自动化测试是确保代码质量和稳定性的关键步骤。谷歌浏览器&#xff08;Chrome&#xff09;提供了强大的开发者工具和丰富的API&#xff0c;结合C的强大功能&#xff0c;可以实现高效的自动化测试。本文将介绍如何使用Chrome和C来实现这一目标。&am…

Android 12 Launcher3 去掉Hotseat

1.概述 在12.0 产品定制化开发中 由产品需求Launcher3 页面布局的原因&#xff0c;要求Launcher3 需要去掉Hotseat 不显示Hotseat下面几个图标&#xff0c;而做满屏app的显示&#xff0c;从而达到美观的效果&#xff0c;下面就来分析去掉Hotseat从而实现这个功能 2.Launcher3 …

数据结构基础讲解(八)——树和二叉树专项练习(上)

本文数据结构讲解参考书目&#xff1a; 通过网盘分享的文件&#xff1a;数据结构 C语言版.pdf 链接: https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwdze8e 提取码: ze8e 数据结构基础讲解&#xff08;七&#xff09;——数组和广义表专项练习-CSDN博客 个人主页&#x…

如何在AWS账户上进行充值:一份详尽指南

大家好&#xff0c;小编今天给大家带来一份关于如何在AWS账户上进行充值的详尽指南。对于使用AWS服务的用户来说&#xff0c;保持账户余额充足是确保服务不中断的关键。下面&#xff0c;九河云将详细讲解具体的操作步骤。 步骤一&#xff1a;登录AWS管理控制台 首先&#xff…

Qt学习之旅 I

构建一个跨平台的应用(Create A Cross-Platform Application) 目录 构建一个跨平台的应用(Create A Cross-Platform Application) 设计模式 开始构建 Qt是跨平台的C框架&#xff0c;这里&#xff0c;我们将会构建一个简单的C跨平台项目来熟悉QT是如何实现简单的跨平台的。 …

JUnit 5 详解

JUnit 5 详解 JUnit 是 Java 生态系统中最流行的测试框架之一&#xff0c;用于编写单元测试、集成测试等。JUnit 5 是其最新版本&#xff0c;提供了更多功能和灵活性&#xff0c;旨在提高测试的可读性、可维护性和可扩展性。JUnit 5 在设计上有别于之前的版本&#xff0c;并引…