【雕爷学编程】MicroPython手册之 ESP8266 I2C总线

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述

ESP8266是一种低成本的Wi-Fi芯片,它可以用于开发物联网、智能家居、网络控制等应用。不同的ESP8266芯片或模块可能有不同的参数,因此在使用或购买时,需要注意选择合适的型号和版本。以下是一些常见的ESP8266参数:

1、尺寸:ESP8266芯片的尺寸为5x5 mm,ESP8266模块的尺寸根据外围电路和天线的不同而有所差异,一般在10x15 mm到25x50 mm之间。
2、工作温度:ESP8266芯片的工作温度范围为-40125℃,ESP8266模块的工作温度范围一般为-4085℃。
3、处理器:ESP8266芯片内置了一个32位的Tensilica L106 RISC处理器,最高时钟频率为160 MHz,支持实时操作系统和Wi-Fi协议栈。
4、内存:ESP8266芯片内置了64 KB的指令RAM和96 KB的数据RAM,以及64 KB的boot ROM。ESP8266模块还需要外接一个Flash存储器,一般为512 KB到16 MB之间。
5、电源:ESP8266芯片的供电电压为3.0~3.6 V,最大功耗为170 mA,最小功耗为20 uA。ESP8266模块的供电电压一般为3.3 V或5 V,最大功耗一般为200~300 mA,最小功耗一般为10~20 uA。
6、通信协议:ESP8266芯片支持IEEE 802.11 b/g/n标准的Wi-Fi协议,支持Station、SoftAP和Station+SoftAP三种模式。ESP8266芯片还支持多种数字外设接口,如GPIO、PWM、ADC、UART、I2C、SPI等。ESP8266芯片还可以使用socket模块或其他协议库来实现TCP/IP、UDP、HTTP、MQTT等协议。
在这里插入图片描述
MicroPython的ESP8266 I2C总线是一种用于在ESP8266微控制器和外部设备之间进行双向串行通信的总线协议。

I2C总线的主要特点有:

I2C总线只需要两根信号线:SCL(时钟线)和SDA(数据线),可以节省引脚资源。
I2C总线支持多主多从的通信模式,即总线上可以有多个主设备和多个从设备,每个设备都有一个唯一的7位或10位地址,主设备可以通过地址选择要通信的从设备。
I2C总线的通信速率可以通过软件配置,一般有标准模式(100Kbps)、快速模式(400Kbps)和高速模式(3.4Mbps)三种。
I2C总线的通信过程由主设备发起,包括开始信号、地址字节、数据字节和停止信号等步骤。

I2C总线的应用场景有:

I2C总线可以用于连接各种外部设备,如EEPROM、RTC、温湿度传感器、LCD显示屏、触摸屏等。
I2C总线可以用于实现多个ESP8266之间的数据交换,或者与其他类型的微控制器进行通信。
I2C总线可以用于实现低功耗的设备控制,如通过I2C唤醒ESP8266或进入深度睡眠模式。

I2C总线的注意事项有:

I2C总线的引脚分配取决于具体的硬件平台和驱动程序,需要根据文档或示例代码进行选择和配置。
I2C总线的通信参数需要与外部设备或其他微控制器保持一致,否则会导致数据错误或丢失。
I2C总线的通信过程需要遵循一定的协议和顺序,如先发送开始信号,再发送地址字节,再发送或接收数据字节,最后发送停止信号。

MicroPython的ESP8266 I2C总线的几个实际运用程序参考代码案例如下:

案例1:使用I2C总线驱动LCD1602显示屏::

# 导入相关模块
from machine import Pin, I2C
import time
import lcd1602

# 创建I2C对象
i2c = I2C(-1, scl=Pin(5), sda=Pin(4))

# 创建LCD1602对象
lcd = lcd1602.LCD1602(i2c)

# 在第一行显示Hello World
lcd.puts('Hello World', 0, 0)

# 在第二行显示当前时间
while True:
    lcd.puts(time.strftime('%Y-%m-%d %H:%M:%S'), 0, 1)
    time.sleep(1)

案例2:使用I2C总线读取DS3231实时时钟模块::

# 导入相关模块
from machine import Pin, I2C
import time
import ds3231

# 创建I2C对象
i2c = I2C(-1, scl=Pin(5), sda=Pin(4))

# 创建DS3231对象
rtc = ds3231.DS3231(i2c)

# 设置DS3231的时间为2023年4月6日11:54:03
rtc.datetime((2023, 4, 6, 4, 11, 54, 3, 0))

# 循环读取DS3231的时间并打印
while True:
    print(rtc.datetime())
    time.sleep(1)

案例3:使用I2C总线读取DHT12温湿度传感器:

# 导入相关模块
from machine import Pin, I2C
import time
import dht12

# 创建I2C对象
i2c = I2C(-1, scl=Pin(5), sda=Pin(4))

# 创建DHT12对象
dht = dht12.DHT12(i2c)

# 循环读取DHT12的温度和湿度并打印
while True:
    dht.measure()
    print('Temperature: {} C'.format(dht.temperature()))
    print('Humidity: {} %'.format(dht.humidity()))
    time.sleep(1)

案例4:与I2C设备进行数据交换:

import machine

i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4))
devices = i2c.scan()

while True:
    for device in devices:
        i2c.writeto(device, b'\x01')
        data = i2c.readfrom(device, 4)
        print("Device {}: {}".format(device, data))

这个示例使用ESP8266的I2C总线与外部I2C设备进行数据交换。通过设置I2C引脚连接,然后在循环中扫描I2C总线上的设备,向每个设备发送数据并接收对应的数据,将设备地址和接收到的数据打印出来。

案例5:使用I2C总线控制LCD显示屏::

import machine
import ssd1306

i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

oled.text("Hello, World!", 0, 0)
oled.show()

这个示例使用ESP8266的I2C总线控制一个LCD显示屏(如SSD1306)。通过设置I2C引脚连接,然后创建一个SSD1306_I2C对象,可以使用其提供的方法在显示屏上显示文本、图像等内容。

案例6:通过I2C总线读取温湿度传感器数据::

import machine
import time
import dht

i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4))
dht_sensor = dht.DHT11(i2c)

while True:
    dht_sensor.measure()
    temperature = dht_sensor.temperature()
    humidity = dht_sensor.humidity()
    print("Temperature: {}°C, Humidity: {}%".format(temperature, humidity))
    time.sleep(2)

这个示例使用ESP8266的I2C总线与一个温湿度传感器(如DHT11)进行通信。通过设置I2C引脚连接,然后创建一个DHT11对象,可以使用其提供的方法测量温度和湿度,并将结果打印出来。这些示例展示了如何在MicroPython的ESP8266模块上使用I2C总线进行通信。通过I2C总线,您可以与各种I2C设备进行数据交换,如传感器、显示屏等。请注意,具体的引脚和硬件连接可能会根据您的实际电路和配置而有所不同。

案例7:与 I2C 设备通信:

import machine
import time

# 初始化 I2C 总线
i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4))

# 与 I2C 设备通信
i2c.start()
i2c.writeto(0x50, b'\x01\x02\x03')  # 发送数据
received_data = i2c.readfrom(0x50, 3)  # 接收数据
i2c.stop()

print("接收到的数据:", received_data)

这个程序使用 ESP8266 上的 I2C 总线与 I2C 设备通信。使用 machine.I2C() 初始化一个 I2C 对象 i2c,参数 scl 和 sda 分别指定时钟线和数据线的引脚对象。

使用 i2c.start() 方法启动 I2C 通信。

使用 i2c.writeto() 方法向 I2C 设备发送数据,参数 0x50 是设备地址,b’\x01\x02\x03’ 是要发送的数据。

使用 i2c.readfrom() 方法从 I2C 设备接收数据,参数 0x50 是设备地址,3 是要接收的字节数。

使用 i2c.stop() 方法停止 I2C 通信。

最后通过打印语句输出接收到的数据。

案例8:读取 I2C 设备的传感器数据:

import machine
import time

# 初始化 I2C 总线
i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4))

# 与 I2C 设备通信
i2c.start()
i2c.writeto(0x50, b'\x01')  # 发送命令
time.sleep(0.1)  # 等待传感器准备数据
received_data = i2c.readfrom(0x50, 2)  # 接收数据
i2c.stop()

# 解析传感器数据
sensor_value = received_data[0] << 8 | received_data[1]

print("传感器数值:", sensor_value)

这个程序使用 ESP8266 上的 I2C 总线读取连接的 I2C 设备的传感器数据。

使用 machine.I2C() 初始化一个 I2C 对象 i2c,参数 scl 和 sda 分别指定时钟线和数据线的引脚对象。

使用 i2c.start() 方法启动 I2C 通信。

使用 i2c.writeto() 方法发送命令给 I2C 设备,参数 0x50 是设备地址,b’\x01’ 是要发送的命令数据。

使用 time.sleep() 方法等待传感器准备数据。

使用 i2c.readfrom() 方法从 I2C 设备接收数据,参数 0x50 是设备地址,2 是要接收的字节数。

使用 i2c.stop() 方法停止 I2C 通信。

将接收到的数据解析为传感器数值,并将其存储在变量 sensor_value 中。

最后通过打印语句输出传感器数值。

案例9:控制 I2C 设备的外设:

import machine
import time

# 初始化 I2C 总线
i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4))

# 与 I2C 设备通信
i2c.start()
i2c.writeto(0x50, b'\x02\x01')  # 发送控制命令
i2c.stop()

# 等待外设完成操作
time.sleep(1)

# 读取外设状态
i2c.start()
i2c.writeto(0x50, b'\x03')  # 发送读取状态命令
status = i2c.readfrom(0x50, 1)  # 接收状态数据
i2c.stop()

print("外设状态:", status)

这个程序使用ESP8266 上的 I2C 总线控制连接的 I2C 设备的外设。

使用 machine.I2C() 初始化一个 I2C 对象 i2c,参数 scl 和 sda 分别指定时钟线和数据线的引脚对象。使用 i2c.start() 方法启动 I2C 通信。使用 i2c.writeto() 方法发送控制命令给 I2C 设备,参数 0x50 是设备地址,b’\x02\x01’ 是要发送的控制命令数据。使用 i2c.stop() 方法停止 I2C 通信。使用 time.sleep() 方法等待外设完成操作。使用 i2c.start() 方法启动 I2C 通信。使用 i2c.writeto() 方法发送读取状态命令给 I2C 设备,参数 0x50 是设备地址,b’\x03’ 是要发送的读取状态命令数据。使用 i2c.readfrom() 方法从 I2C 设备接收状态数据,参数 0x50 是设备地址,1 是要接收的字节数。使用 i2c.stop() 方法停止 I2C 通信。最后通过打印语句输出外设状态。这些示例代码展示了如何使用 MicroPython 和 ESP8266 的 I2C 总线与 I2C 设备进行通信、读取传感器数据以及控制外设。请根据你实际连接的硬件和设备进行适当的修改和调整。

请注意,以上示例仅供参考,具体的使用方法可能因不同的硬件平台和MicroPython版本而有所差异。在实际编程中,你需要根据你所使用的硬件和具体需求进行适当的调整。

在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值