623浏览
查看: 623|回复: 2

[ESP8266/ESP32] 用ESP32-S2实现一个加速度传感器控制的彩灯

[复制链接]
本帖最后由 豆爸 于 2023-9-1 02:30 编辑

1 项目介绍
项目实现的功能是一个加速度传感器控制的彩灯,将板子朝向不同摆放时,屏幕显示的数字不同,并且手持板子转到不同方位彩灯颜色跟随变化。在板子静置30秒后,彩灯的颜色呈现周期变化。

2 设计思路
1、读出板载加速度传感器传感器X、Y、Z的数值显示在OLED屏幕上
2、根据加速度传感器的数值,板载的RGB彩灯显示不同颜色。
3、当在板子静置30秒(即加速度传感器的X、Y、Z值不发生变化时),彩灯呈现周期性变化,依次显示相应的颜色,1秒钟切换一次。

3 框图和软件流程图
4 硬件介绍
4.1 ESP32-S2 WiFi模块
ESP32-S2 WiFi模块是物联网、可穿戴电子设备和智能家居等应用场景的理想选择,另搭配输入控制、输出显示以及传感器感知和控制的套件,使其功能更加完善。
该模块板载了:
  • ESP32-S2-MINI-1模组
  • 这是一款4 GHz WiFi 模组
  • 内置 ESP32S2 系列芯片,Xtensa® 单核 32 位 LX7 微处理器
  • 内置芯片叠封 4 MB flash,可叠封 2 MB PSRAM
  • 37 个 GPIO,具有丰富的外设
  • 板载 PCB 天线
配套的ESP32 S2 开发板除了ESP32wifi模组之外还集成了USB TYPE -C接口,两个按键,一个电源指示灯,一个用户LED灯,2排10pin的排针,将重要IO引出。使用USB供电或通过排针3.3V供电。
ESP32-S2 是一款高度集成、高性价比、低功耗、主打安全的单核 Wi-Fi SoC,具备强大的功能和丰富的 IO 接口。使用乐鑫ESP-IF开发环境,我们可以通过USB对其编程,作为带wifi的MCU单独使用,也可以烧录AT固件,作为WiFi透传模块与RP2040游戏机套件结合使用。
4.2 输入、输出扩展板
本扩展板包含如下功能:
  • 按键、旋转编码器输入 - 以模拟信号的方式
  • 双电位计控制输入 - 以数字信号的方式
  • RGB三色LED显示
  • 44寸128*128 LCD,SPI总线访问
  • MMA7660三轴姿态传感器
  • 电阻加热
  • 温度传感器
  • 与ESP32-S2核心模块的接口
5 实现的功能及图片展示
5.1 MMA7660加速度传感器的研究
板载一颗来自飞思卡尔的MMA7660这一款传感器。MMA7660FC是具有数字输出的I²C、低功耗、紧凑型电容式微机械加速度传感器,提供低通滤波器、零重力加速度偏移和增益误差补偿,并可以转化为6位数字值,用户可配置输出数据的传输速率。该器件可通过中断引脚(INT)识别传感器的数据变化、产品的朝向和姿态等。
产片结构图
产品特性
  • I2C输出
  • 可配置每秒采样率1到120次
  • 低功耗的自动唤醒/休眠功能
  • 低功耗:  关机模式:4 µA 待机模式:2 µA 工作模式:可配置,低至47 µA
  • 工作电压:4V – 3.6V
  • 3轴±5 g MEMS传感器和CMOS接口控制器集成在同一个封装中
  • 输出数据传输速率可设置,采样频率从每秒1次到120次
  • 具备自动唤醒/自动睡眠功能,以降低功耗
  • 朝向检测:横向/纵向识别
  • 姿势检测,包括震动和脉冲识别
系统框架图
5.2 功能实现
(1)读取三轴加速度传感器的数值。
(2)将读取的数值显示在TFT液晶屏上。
(3)根据读数变化,改变RGB灯颜色。
(4)30秒内,数值无变化,RGB彩灯间隔1秒依次变换颜色。
5.3 Thonny的下载与安装
Thonny是一个面向初学者的 Python IDE。Thonny 由爱沙尼亚的 Tartu 大学开发,它采用了不同的方法,因为它的调试器是专为学习和教学编程而设计的。

5.4 导入mma7660库
这里我们使用了一个三轴加速度计驱动库文件mma7660.py,这个文件可以从github下载。
将mma7660.py驱动文件通过Thonny上传到ESP32的根目录。
5.5 导入ST7735库
这里我们使用了一个TFT液晶屏驱动库文件ST7735.py,这个文件可以从github下载。
将ST7735.py驱动文件通过Thonny上传到ESP32的根目录。
5.6 导入sysfont字体
这里我们使用了一个sysfont字体库文件sysfont.py,这个文件可以从github下载。
将sysfont.py驱动文件通过Thonny上传到ESP32的根目录。

6 主要代码片段及说明
6 主要代码片段及说明
6.1 加载库函数
  1. from machine import Pin, SPI, I2C
  2. from mma7660 import MMA7660
  3. from ST7735 import TFT
  4. from sysfont import sysfont
  5. import time
  6. from RGB import RGB
复制代码

6.2 定义变量
  1. global j
  2. j = 0
  3. LED_1 = 43
  4. LED_2 = 44
  5. LED_3 = 12
  6. # 引脚定义
  7. LCD_CS   = 13
  8. LCD_RES  = 18
  9. LCD_DC   = 17
  10. LCD_SDA = 21
  11. LCD_SCL = 41
  12. i=False
  13. #初始化数组
  14. l[0] = 0
  15. l[1] = 0
  16. l[2] = 0
  17. t = 0
复制代码

6.3 实例化
  1. # 实例化SPI
  2. spi = SPI(2, baudrate=40000000, polarity=0, phase=0, sck=Pin(LCD_SCL), mosi=Pin(LCD_SDA))
  3. # 实例化TFT
  4. tft=TFT(spi, LCD_DC, LCD_RES, LCD_CS)
  5. # 实例化RGB彩灯
  6. rgb = RGB()
复制代码

6.4 TFT屏初始化
  1. #TFT屏初始化
  2. tft.initb3()
  3. tft.rotation(2)
  4. tft.rgb(False)
复制代码

6.5 配置3轴传感器MMA7660
  1. #配置3轴传感器MMA7660
  2. i2c1 = I2C(1, scl=Pin(3), sda=Pin(4))
  3. acc = MMA7660(i2c1)
  4. acc.on(True)
  5. d = bytearray(3)
  6. r = [0 for x in range(3)]
  7. l = [0 for x in range(3)]
  8. def twos_compliment(n, nbits):
  9.     sign_bit = 1 << nbits - 1
  10.     sign = 1 if n & sign_bit == 0 else -1
  11.     val = n & ~sign_bit if sign > 0 else sign * ((sign_bit << 1) - n)
  12.     return val
  13. def thumb_filter(a):
  14.     return a
复制代码

6.6 读取传感器数据
  1. #循环10次读取传感器数据
  2.     for j in range(10):
  3.         acc.getSample(d)
  4.         for i in range(3):
  5.             r[i] = r[i] + twos_compliment(d[i], 6)
  6.         time.sleep(0.1)        
  7.     for i in range(3):
  8.         r[i] = int(r[i]/10)
  9.     print((r[0], r[1], r[2]))
复制代码

6.7 TFT屏显示加速度传感器数值
  1.     #TFT屏显示加速度传感器数值
  2.     tft.fill(TFT.BLACK);
  3.     tft.text((40, 30), str(r[0]), TFT.WHITE, sysfont, 2, nowrap=True)
  4.     tft.text((40, 60), str(r[1]), TFT.WHITE, sysfont, 2, nowrap=True)
  5.     tft.text((40, 90), str(r[2]), TFT.WHITE, sysfont, 2, nowrap=True)
复制代码

6.8 根据加速度传感器值,切换彩灯颜色
  1.     if r[2] < -20:
  2.         rgb.on(0)  #红
  3.     elif r[1] < 15 and r[2] < -15:
  4.         rgb.on(1)
  5.     elif r[2] > 20:
  6.         rgb.on(2)  #绿        
  7.     elif r[1] > 20:
  8.         rgb.on(3)  #紫
  9.     elif r[1] > -15 and r[2] > 15:
  10.         rgb.on(4)
  11.     elif r[2] > 20: #蓝
  12.         rgb.on(5)      
  13.     elif r[1] < -20:
  14.         rgb.on(6)
复制代码

6.9 静置30秒周期性彩灯颜色变换
  1.     if abs(r[0] - l[0]) < 3 and abs(r[1] - l[1]) < 3 and abs(r[2] - l[2]) < 3:
  2.         tft.text((100, 10), str(t), TFT.WHITE, sysfont, 2, nowrap=True)
  3.         t = t + 1
  4.     else:
  5.         t = 0
  6.     l[0] = r[0]
  7.     l[1] = r[1]
  8.     l[2] = r[2]
  9.     #如果静置超过30秒,周期性切换彩灯颜色
  10.     if t > 30:
  11.         rgb.on(t % 7 )
  12.         print(t % 7)
  13.         i = i + 1
复制代码

7 运行效果
程序运行效果如下图所示:
1、屏幕加速度显示传感器数据
2、板子转到不同方位彩灯颜色跟随变化


3、静置30秒后,彩灯呈现周期变化







花生编程  中级技匠

发表于 2023-8-22 13:37:41

厉害厉害
回复

使用道具 举报

花生编程  中级技匠

发表于 2023-8-22 13:38:52

赞赞赞!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail