对于ESP-32S而言,有16个ADC采集通道(需要注意在开启wifi的情况下ADC2是不能进行采集的,详情请搜索ESP-32S引脚图),由于项目需求需要采集6个mpu6050的角度以及加速度,故在mpu6050采集时,采用轮回采集的方式,在mpu6050上有AD0,当AD0电压为0v时(低电平),mpu6050的物理地址为0x68,而当mpu6050AD0为高电压时,物理地址变为0x69,故可以通过ESP-32S引脚控制采集的mpu6050。
以下为部分核心代码
void loop()
{
while(true){
if(key==1){
Serial.print("1");Serial.print(":");
pinMode(32,OUTPUT);
pinMode(4,OUTPUT);
pinMode(15,OUTPUT);
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(14,OUTPUT);
digitalWrite(32,HIGH); //输出高电平,LOW就是低电平
digitalWrite(4,LOW);
digitalWrite(15,LOW);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(14,LOW);
mpu();
key=2;
}
if(key==2){
Serial.print("2");Serial.print(":");
pinMode(32,OUTPUT);
pinMode(4,OUTPUT);
pinMode(15,OUTPUT);
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(14,OUTPUT);
digitalWrite(32,LOW); //输出高电平,LOW就是低电平
digitalWrite(4,HIGH);
digitalWrite(15,LOW);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(14,LOW);
mpu();
key=3;
}
if(key==3){
Serial.print("3");Serial.print(":");
pinMode(32,OUTPUT);
pinMode(4,OUTPUT);
pinMode(15,OUTPUT);
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(14,OUTPUT);
digitalWrite(32,LOW); //输出高电平,LOW就是低电平
digitalWrite(4,LOW);
digitalWrite(15,HIGH);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(14,LOW);
mpu();
key=4;
}
if(key==4){
Serial.print("4");Serial.print(":");
pinMode(32,OUTPUT);
pinMode(4,OUTPUT);
pinMode(15,OUTPUT);
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(14,OUTPUT);
digitalWrite(32,LOW); //输出高电平,LOW就是低电平
digitalWrite(4,LOW);
digitalWrite(15,LOW);
digitalWrite(13,HIGH);
digitalWrite(12,LOW);
digitalWrite(14,LOW);
mpu();
key=5;
}
if(key==5){
Serial.print("5");Serial.print(":");
pinMode(32,OUTPUT);
pinMode(4,OUTPUT);
pinMode(15,OUTPUT);
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(14,OUTPUT);
digitalWrite(32,LOW); //输出高电平,LOW就是低电平
digitalWrite(4,LOW);
digitalWrite(15,LOW);
digitalWrite(13,LOW);
digitalWrite(12,HIGH);
digitalWrite(14,LOW);
mpu();
key=6;
}
if(key==6){
Serial.print("6");Serial.print(":");
pinMode(32,OUTPUT);
pinMode(4,OUTPUT);
pinMode(15,OUTPUT);
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(14,OUTPUT);
digitalWrite(32,LOW); //输出高电平,LOW就是低电平
digitalWrite(4,LOW);
digitalWrite(15,LOW);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(14,HIGH);
mpu();
key=1;
}
for(int i=0;i<8;i++){
long Fdata = getPressValue(sensorPin[i]);
DEBUGSerial.print(i);
DEBUGSerial.print("F = ");
DEBUGSerial.print(Fdata);
DEBUGSerial.println(" g,");
}
}
}
由于时间紧凑,其实代码方面可以进行大幅度优化,在mpu6050的采集方面采用了卡尔曼滤波。