繁体   English   中英

定义变量 esp32

[英]Defining variables esp32

我正在尝试在 esp32 中找到一种方法来获得(列表),因为缺少更好的术语,我可以将其作为变量输入调用。 我有一个 void playwav(); function。我想用一个全局变量来定义应该播放的文件。 即 playwav('alarm')。 我有一个外壳开关设置,但使用的是 ab c 方法。 随着我的代码越来越多(下一步将添加 71 个新的 wav 文件),我很快意识到该方法将不再有效。 有人告诉我要做一个数组,但是对于我的一生,无论我读过什么,我都无法掌握如何去做,也无法按名称调用文件。 有人对我应该做什么有建议吗? 任何帮助深表感谢。

这就是我目前拥有的。


void playWAV (char effect, int bg1248_general_volume)
{
  Serial.println("Entered playWAV");
  switch (effect)
  {
    case 'a':
      file = new AudioFileSourceSD("/wav/alarm.wav");
      break;

    case 'b':
      file = new AudioFileSourceSD("/wav/alarmhigh.wav");
      break;

    case 'c':
      file = new AudioFileSourceSD("/wav/alarmlow.wav");
      break;

    case 'd':
      file = new AudioFileSourceSD("/wav/error.wav");
      break;
  
    case 'e':
      file = new AudioFileSourceSD("/wav/error1.wav");
      break;
  
    case 'f':
      file = new AudioFileSourceSD("/wav/noread.wav");
      break;
      
    case 'g':
      file = new AudioFileSourceSD("/wav/noreadings.wav");
      break;
      
    case 'h':
      file = new AudioFileSourceSD("/wav/normalrange.wav");
      break;
      
    case 'i':
      file = new AudioFileSourceSD("/wav/warning.wav");
      break;

    case 'j':
      file = new AudioFileSourceSD("/wav/warninghigh.wav");
      break;
      
    case 'k':
      file = new AudioFileSourceSD("/wav/warninglow.wav");
      break;
      
    case 'l':
      file = new AudioFileSourceSD("/wav/startup.wav");
      break;  

      case 'm':
      file = new AudioFileSourceSD("/wav/startup.wav");
      break;      
      
      case 'n':
      file = new AudioFileSourceSD("/wav/update.wav");
      break;  
      case 'o':
      file = new AudioFileSourceSD("/wav/startup_dev.wav");  
      }

float volumeGain = ((float)bg1248_general_volume / 100.0) * 39.0;
  Serial.print("volumeGain:");
  Serial.println(volumeGain);
  id3 = new AudioFileSourceID3(file);
  out = new AudioOutputI2S(0, 0); // Output to builtInDAC
  out->SetPinout(12, 0, 2);
  out->SetOutputModeMono(true);
  out->SetGain(volumeGain);
  wav = new AudioGeneratorWAV();
  wav->begin(id3, out);

但是,因为我使用了字母表,我很快就会用完箱子。 我希望能够在项目的任何地方调用特定的 wav 文件,最好是像playWAV(filename)或类似的东西。

我这样调用函数(文件)(示例条件)

if((ns->sensSgv<=cfg.snd_alarm) && (ns->sensSgv>=0.1)) {
// red alarm state
// M5.Lcd.fillRect(110, 220, 100, 20, TFT_RED);
Serial.println("ALARM LOW");
M5.Lcd.fillRect(0, 220, 320, 20, TFT_RED);
M5.Lcd.setTextColor(TFT_BLACK, TFT_RED);
int stw=M5.Lcd.textWidth(tmpStr);
M5.Lcd.drawString(tmpStr, 159-stw/2, 220, GFXFF);
if( (alarmDifSec>cfg.alarm_repeat*60) && (snoozeRemaining<=0) ) {
    playWAV('a', 100);

'a'=案例 100 = 音量。

艾伦,这就是我目前在我的枚举中的内容,我正在学习教程,但怀疑我是否做对了。 即使我这样做了,我也会收到错误消息,说我有重复的案例,而我没有。

EDIT:

使用此设置条件:

if((ns->sensSgv<=cfg.snd_alarm) && (ns->sensSgv>=0.1))

如果你注意到底部有:

if( (alarmDifSec>cfg.alarm_repeat*60) && (snoozeRemaining<=0) ) {
    playWAV('a', 100);

a 与 switch case 中的 case A 相关。 如上所示。 目前所有使用playWAV function的地方都是手动指定的。

我的理解是在 switch case 中使用字母很快就会用完,因为编号很大。 文件(> 26)。 所以,我首先使用枚举实现了逻辑,下面是完整的代码。

#include<stdio.h>

enum soundEffects {
    alarm,
    alarm_high,
    alarm_low,
    Dev_startup,
    error,
    error1,
    noread,
    noreadings,
    normalrange,
    startup,
    startup_dev,
    update,
    warning,
    warning_high,
    warning_low,
};

void playWav (enum soundEffects effect, int paci_volume)
{
    //Serial.println("Entered paciplay_day");
    //printf("Entered paciplay_day\n");

    switch (effect)
    {
        case alarm:
            //file = new AudioFileSourceSD("/wav/alarm.wav");
            printf("/wav/alarm.wav\n");
            break;

        case alarm_high:
            //file = new AudioFileSourceSD("/wav/alarmhigh.wav");
            printf("/wav/alarmhigh.wav\n");
            break;

        case alarm_low:
            //file = new AudioFileSourceSD("/wav/alarmlow.wav");
            printf("/wav/alarmlow.wav\n");
            break;

        case error:
            //file = new AudioFileSourceSD("/wav/error.wav");
            printf("/wav/error.wav\n");
            break;

        case error1:
            //file = new AudioFileSourceSD("/wav/error1.wav");
            printf("/wav/error1.wav\n");
            break;

        case noread:
            //file = new AudioFileSourceSD("/wav/noread.wav");
            printf("/wav/noread.wav\n");
            break;

        case noreadings:
            //file = new AudioFileSourceSD("/wav/noreadings.wav");
            printf("/wav/noreadings.wav\n");
            break;

        case normalrange:
            //file = new AudioFileSourceSD("/wav/normalrange.wav");
            printf("/wav/normalrange.wav\n");
            break;

        case warning:
            //file = new AudioFileSourceSD("/wav/warning.wav");
            printf("/wav/warning.wav\n");
            break;

        case warning_high:
            //file = new AudioFileSourceSD("/wav/warninghigh.wav");
            printf("/wav/warninghigh.wav\n");
            break;

        case warning_low:
            //file = new AudioFileSourceSD("/wav/warninglow.wav");
            printf("/wav/warninglow.wav\n");
            break;

        case startup:
            //file = new AudioFileSourceSD("/wav/startup.wav");
            printf("/wav/startup.wav\n");
            break;

        case update:
            //file = new AudioFileSourceSD("/wav/update.wav");
            printf("/wav/update.wav\n");
            break;
    }
}

int main()
{
    //below are the 3 ways of calling your playWav() function
    //1 - using direct numbers
    //this will throw compilation error when compiled using cpp compilers
    for (int i = 0; i<14; i++)
    {
        printf("enum value: %d\n", i);
        playWav(i, 50);
    }

    //2 - directly calling using the enum
    playWav(startup, 100);

    //3 - Just another way of calling
    enum soundEffects sound;
    sound = error;
    playWav(sound, 100);
    return 0;
}

此外,我使用双数组实现了相同的逻辑。 请在下面找到它。 这使用文件名作为参数,因此我们可以完全消除 switch 语句的使用。

#include<stdio.h>

void playWav (const char *filename, int paci_volume)
{
    //Serial.println("Entered paciplay_day");
    printf("Entered paciplay_day\n");

    //file = new AudioFileSourceSD("/wav/update.wav");
    printf("/wav/%s\n", filename);
}

int main()
{
    const char list_of_files[][25] = { "startup.wav", "update.wav", "warning.wav", "alarm.wav" };
    for (int i = 0; i<4; i++)
    {
        printf("name: %s\n", list_of_files[i]);
        playWav(list_of_files[i], 50);
    }
    return 0;
}

请省略我用于调试的printf语句。 我希望这是有用的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM