MicroPython ESP32ssd1306驱动0.96“I2C屏幕+mpu6050图形控制
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MicroPython ESP32ssd1306驱动0.96“I2C屏幕+mpu6050图形控制相关的知识,希望对你有一定的参考价值。
【MicroPython ESP32】ssd1306驱动0.96“I2C屏幕+mpu6050图形控制
- 效果演示
随着mpu6050模块的移动,oled屏幕矩形线框内的小方块也随对应的方向移动。
所需引入的模块
ssd1306.py
模块
中文下载站:https://www.cnpython.com/pypi/micropython-ssd1306/download
官方下载站:https://pypi.org/project/micropython-ssd1306/
mpu6050.py
模块
import machine
class accel():
def __init__(self, i2c, gr,addr=0x68):
self.iic = i2c
self.addr = addr
# 陀螺仪量程设置:
# 寄存器地址 写入数据 量程
# 0x1b 0x00 ±250°/s
# 0x1b 0x08 ±500°/s
# 0x1b 0x10 ±1000°/s
# 0x1b 0x18 ±2000°/s
# 加速度计量程设置:
# 寄存器地址 写入数据 量程
# 0x1c 0x00 ±2G
# 0x1c 0x08 ±4G
# 0x1c 0x10 ±8G
# 0x1c 0x18 ±16G
#设置加速度倍率
self.temp = bytearray(2)
self.temp[0]=0x1C
self.temp[1]=8*gr
self.iic.writeto(self.addr, self.temp)
#a = self.iic.readfrom_mem(self.addr, 0x1C, 1)
#print(a)
#向0x6B寄存器写入0
#表示开始数据传输
self.temp[0] = 0x6B # Co=1, D/C#=0
self.temp[1] = 0
self.iic.writeto(self.addr, self.temp)
def get_raw_values(self):
a = self.iic.readfrom_mem(self.addr, 0x3B, 14)
return a
def get_ints(self):
b = self.get_raw_values()
c = []
for i in b:
c.append(i)
return c
def bytes_toint(self, firstbyte, secondbyte):
if not firstbyte & 0x80:
return firstbyte << 8 | secondbyte
return - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1)
def get_values(self):
raw_ints = self.get_raw_values()
vals =
vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1])
vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3])
vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5])
vals["Tmp"] = self.bytes_toint(raw_ints[6], raw_ints[7]) / 340.00 + 36.53
vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9])
vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11])
vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13])
return vals # returned in range of Int16
# -32768 to 32767
def val_test(self): # ONLY FOR TESTING! Also, fast reading sometimes crashes IIC
from time import sleep
while 1:
print(self.get_values())
sleep(0.05)
实例代码
运行主代码前,需要先将
ssd1306.py
和mpu6050.py
模块导入到MicroPython设备上,在运行。否则会报错,找不到对应的模块。
from machine import Pin
import machine
from utime import sleep
from ssd1306 import SSD1306_I2C
from mpu6050 import accel
#初始化I2C0,服务于OLED屏幕
sda=Pin(25)
scl=Pin(26)
i2c=machine.I2C(0,sda=sda,scl=scl,freq=400000)
oled=SSD1306_I2C(128,64,i2c)
#初始化I2C1,服务于MPU6050
sda=Pin(27)
scl=Pin(14)
i2c1=machine.I2C(1,sda=sda,scl=scl,freq=40000)
#第二个参数为加速度最大量程
#0 ±2G 1 ±4G
#2 ±8G 3 ±16G
cgq=accel(i2c1,0)
BLOCK_SIZE=6
AREA_SIZE=48
AREA_X=80
AREA_Y=8
MOVE_SPAN = AREA_SIZE-BLOCK_SIZE
while True:
v=cgq.get_values()
acX=v['AcX']/16384.0
acY=v['AcY']/16384.0
acZ=v['AcZ']/16384.0
coorY=int((acX+1)*0.5*MOVE_SPAN)
coorX=int((acY+1)*0.5*MOVE_SPAN)
#清空屏幕
oled.fill(0)
oled.text("acX:"+str(acX)[0:4]+"g",0,5)
oled.text("acY:"+str(acY)[0:4]+"g",0,20)
oled.text("acZ:"+str(acZ)[0:4]+"g",0,35)
oled.rect(80,8,48,48,1)
oled.fill_rect(AREA_X+coorX,AREA_Y+coorY,BLOCK_SIZE,BLOCK_SIZE,1)
oled.show()
sleep(0.05)
以上是关于MicroPython ESP32ssd1306驱动0.96“I2C屏幕+mpu6050图形控制的主要内容,如果未能解决你的问题,请参考以下文章
MicroPython ESP32ssd1306 0.96“OLED+气象数据中文显示
MicroPython ESP32ssd1306驱动0.96“I2C屏幕汉字显示示例
MicroPython ESP32ssd1306驱动0.96“I2C屏幕+mpu6050图形控制
MicroPython ESP32ssd1306模块基于GB2312字库驱动0.96“I2C屏幕汉字显示示例