使用ESP32实现一个加速度传感器控制的彩灯
通过ESP32微控制器对加速度传感器进行数据采集及滤波处理,将处理过的数据显示在LCD上,同时控制RGB彩灯在加速度传感器位置发生改变时改变不同的颜色,在加速度传感器静止30s后RGB彩灯有规律的进行色彩的改变。
标签
嵌入式系统
测试
显示
Cherry1762
更新2023-03-27
内蒙古科技大学
519

1.项目要求

(1)任务要求

将板子朝向不同摆放时,屏幕显示的数字不同,并且手持板子转到不同方位彩灯颜色跟随变化。在板子静置30秒后,彩灯的颜色呈现周期变化。

(2)完成的功能

1.实现MMA7660数据采集及滤波处理

2.通过GFX库驱动ST7735实现屏幕数字实时显示

3.在板子静置30s后彩灯的颜色周期变化

(3)程序运行框图

Fkc4ZalKTcmjdxXhm44j9c0dqIlG

 

2.环境配置

软件平台:在进行项目开发时已知有两种开发平台:

  1. ESP_IDF

作为乐鑫官方进行设计开发的平台,可以在乐鑫官网获取开发资料,进行配置开发。

      2.Arduino

ESP32对与Arduino框架十分支持,对于项目可以快捷的进行开发。

考虑到项目内容较为简单,以及对于Arduino平台有一定的设计经验,同时为了将项目更多的时间投入到项目的构思之中,于是决定选用Arduino开发框架。

3.硬件平台介绍

ESP32-S2 是一款高度集成、高性价比、低功耗、主打安全的单核 Wi-Fi SoC,具备强大的功能和丰富的 IO 接口。使用乐鑫ESP-IF开发环境,我们可以通过USB对其编程,作为带wifi的MCU单独使用,也可以烧录AT固件,作为WiFi透传模块与RP2040游戏机套件结合使用。ESP32-S2 WiFi模块是物联网、可穿戴电子设备和智能家居等应用场景的理想选择,另搭配输入控制、输出显示以及传感器感知和控制的套件,使其功能更加完善。

  • ESP32S2模组资源使用:硬件SPI、GPIO、定时器
  • 扩展板资源使用:44寸LCD、MMA7660三轴姿态传感器、RGB三色LED显示

4.项目设计思路

在设计过程中显示部分比较重要,可以观察一些数据是否正常,判断程序运行的状态。所以在程序设计是第一步决定从点灯开始、第二步便是实现LCD的显示。通过软件模拟IIC实现MMA7660三轴加速度传感器数据的读取,通过ESP32S2进行数据的分析处理之后输出给RGB三色灯,从而实现在板子方位在发生改变时RGB为不同的颜色。同时通过内部定时器判断板子是否处于静止状态,处于静止状态时开始计时,30s后开始RGB规律改变颜色。

 

5.功能图片展示

功能1:1.44寸LCD显示

功能2:MMA7660三轴传感器数据读取

功能3:RGB变换不同颜色

功能4:板子在静置30s后RGB开始规律性闪烁

FmIPug-JByOgNkOakyqOQNUaFx8X

6.程序部分讲解:

1.LCD显示部分采用了GFX库实现ST7735 LCD的驱动。

unsigned long lcdTick = 0;
void LCD_Process()
{
  if(millis() - lcdTick < 200) return;
  lcdTick = millis();
  gfx->fillScreen(BLACK);

  gfx->setCursor(5,5);
  gfx->setTextColor(BLUE);
  gfx->setTextSize(2);
  gfx->print("MENU");
  // delay(10);

  gfx->setCursor(5,20);
  gfx->setTextColor(BLUE);
  gfx->setTextSize(1);
  gfx->print("Resting:");
  delay(10);

  gfx->setCursor(90,20);
  gfx->setTextColor(BLUE);
  gfx->setTextSize(2);
  gfx->print(RGB_RTC);
  // delay(10);

  gfx->setCursor(5,40);
  gfx->setTextColor(BLUE);
  gfx->setTextSize(2);
  gfx->print(last_x);
  // delay(10);

  gfx->setCursor(5,60);
  gfx->setTextColor(BLUE);
  gfx->setTextSize(2);
  gfx->print(last_y);
  // delay(10);

  gfx->setCursor(5,80);
  gfx->setTextColor(BLUE);
  gfx->setTextSize(2);
  gfx->print(last_z);
  // delay(10);

  gfx->setCursor(60,40);
  gfx->setTextColor(BLUE);
  gfx->setTextSize(2);
  gfx->print(rgb_state);
  // delay(10);
}

 

2.在MMA7660的数据读取中,采用一阶滞后滤波的算法进行数据的处理,减小采集数据的偏移。

#define FILTER_A 0.4
void Filter(){
  // MMA7660_Read();
  // value_x = x;value_y = y;value_z = z;
  int NewValue_x,NewValue_y,NewValue_z;
  MMA7660_Read();
  NewValue_x = x;NewValue_y = y;NewValue_z = z;
  value_x = (int)((float)NewValue_x * FILTER_A + (1.0 - FILTER_A) * (float)value_x);
  value_y = (int)((float)NewValue_y * FILTER_A + (1.0 - FILTER_A) * (float)value_y);
  value_z = (int)((float)NewValue_z * FILTER_A + (1.0 - FILTER_A) * (float)value_z);

}

使用millis()进行程序的调度,保证计时的准确性,减小系统延时造成的误差。

7.遇到的问题及解决方法

  • LCD屏幕刷新率低

在开始是计划使用Uglib但是发现Uglib在IO模拟SPI下屏幕刷新率较低,无法满足数据的实时更新要求,经过查找,发现GFX库刷新率十分快,在通过对于GFX的常用显示函数了解之后便决定使用GFX库作为显示部分的驱动库。

  • ESP32S2-MINI板卡与拓展板不能通过硬件I2C进行通信

在完成显示部分之后便开始对三轴加速度传感器MMA7660的数据读取部分,但是显示x,y,z三部分数据均为0,这时我检查了程序部分,发现没有问题。在查看扩展板原理图以及在乐鑫官网对于这个模组的原理图时发现MMA7660的原理图发现MMA7660没有与ESP32S2模组硬件IIC连接,所以在屏幕上x,y,z数据均为0。

想法1:飞线  ( ̄▽ ̄)"

想法2:尝试使用IO来模拟I2C

考虑到飞线可能会对开发板造成一些损伤,决定使用IO来模拟I2C,之后打算看一看原理图,不影响的话飞线试试效果

~( ̄▽ ̄)~*

经过查找发现可以使用软件进行IO模拟IIC进行MMA7660传感器数据的读取。

  • 数据超过定义大小

在进行数据读取时发现LCD上显示一次滤波之后的数据和下一次滤波的数据差距非常大,这不符合逻辑(同时也使定时器获取数据出现问题,无法判断板子处于静止状态)

后来发现时数据超出定义大小,将数据定义大小放大之后问题解决  ~( ̄▽ ̄)~*

总结:

经过这次练习学习到了ESP32S2在Platfrom平台下的软件IO模拟IIC实现MMA7660加速度传感器的数据读取,GFX显示的使用以及数据处理。

未来的计划:

ESP32S2模块带有WIFI天线,计划设计网页端通过手机或者电脑连接ESP32S2模组的WIFI之后实现对于ESP32采集到的传感器数据进行读取和对ESP32进行控制。 

 

附件下载
angle_v1.3.zip
团队介绍
内蒙古科技大学
团队成员
Cherry1762
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号