1.项目要求
(1)任务要求
将板子朝向不同摆放时,屏幕显示的数字不同,并且手持板子转到不同方位彩灯颜色跟随变化。在板子静置30秒后,彩灯的颜色呈现周期变化。
(2)完成的功能
1.实现MMA7660数据采集及滤波处理
2.通过GFX库驱动ST7735实现屏幕数字实时显示
3.在板子静置30s后彩灯的颜色周期变化
(3)程序运行框图
2.环境配置
软件平台:在进行项目开发时已知有两种开发平台:
- 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开始规律性闪烁
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进行控制。