Самый эффективный способ печати разных типов (из одного массива?) - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть небольшой набросок, который читает широкий спектр датчиков, все из которых сводятся к целому или логическому значению.

Каждый цикл, который я хочу напечатать их следующим образом:

"variableName; variableValue" (которое дает, например, "distanceSenso; 432")

В настоящее время это выглядит как

 int flame, distance, <etc>
 bool flame, touch;
    void loop(){
      noise = analogRead(SOUND_SENSOR);
      distance = analogRead(DISTANCE_SENSOR);
      ..etc..       
          Serial.print("flame;");
          Serial.println(flame);
          Serial.print("distance;");
          Serial.println(dist);
          Serial.print("motion;");
          Serial.println(motion);
          Serial.print("touch;");
          Serial.println(touch);
          Serial.print("noise;");
          Serial.println(noise);
          <etc for many more sensors>
    }

Это работает нормально, но не эффективно,Я хотел бы добавить каждую переменную в массив и просто обновить значение каждого цикла.Это позволило бы использовать простой цикл for, который печатает каждый элемент массива в Serial.println.

Однако это невозможно, поскольку я использую переменные как int, так и bool.Я мог бы сделать два отдельных массива или забыть о цикле for и сохранить свой текущий подход, но я учусь кодировать и хотел бы знать, какой самый эффективный способ сделать это.

Итак, мойвопрос: как я мог бы распечатать каждую переменную в указанном синтаксисе наиболее эффективным способом?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Из Ссылка на Arduino :

> analogRead()
>  
> Returns  
> int(0 to 1023)

Таким образом, вы все равно получаете целые числа.

Обычно я создаю временную структуру, которая будет содержать все необходимые мне данные и контекст.перебирать.Тогда достаточно простого цикла.

struct data_s {
   const char *desc;
   int pin;
   enum data_type_s {
      DATA_INT,
      DATA_BOOL,
   } data_type;
} const datas[] = {
     { SOUND_SENSOR, "sound", DATA_INT },
     { DISTANCE_SENSOR, "distance", DATA_INT },
     { SOMEBOOLEAN_SENSOR, "someboolean", DATA_BOOL },
      ... and so on ...
};

for (size_t i = 0; i < sizeof(datas)/sizeof(*datas); ++i) {
     Serial.print(data[i].desc);
     Serial.print(";");
     const int readed_value = analogRead(data[i].pin);
     switch (data[i].type) {
     case DATA_BOOL:
          // custom int->bool conversion
          Serial.print(value ? "true" : "false");
          break;
     case DATA_INT:
          Serial.print(value);
          break;
     }
     Serial.print("\n");
}
0 голосов
/ 21 ноября 2018

Последовательные конструкции в коде часто являются наиболее эффективными с точки зрения скорости.Если вы ищете улучшения в удобочитаемости (например, сколько строк кода), тогда цикл поможет, но, вероятно, снизит эффективность другими способами.Тем не менее, чтобы уменьшить количество строк, скажем, в цикле ...

Используйте комбинацию enum, const char массив и struct.(структура здесь необязательна, но я часто использую ее для удобства чтения при работе с большим количеством членов)

У меня нет вашей среды, но для иллюстрации с использованием ANSI C ниже показано, как перечисляемые значения могут связыватьсяописания строк вместе со значениями измерений в одном и том же экземпляре структуры, позволяющие сообщать результаты в цикле:

enum {
    FLAME_SENSOR,    // enumerated from 0 to max_sensor
    DISTANCE_SENSOR,
    MOTION_SENSOR,
    TOUCH_SENSOR,
    SOUND_SENSOR,
    // add more sensors???
    MAX_SENSOR
};

typedef struct { // optional struct
    int val;
    char descr[20];
}PARAM;

const char str[MAX_SENSOR][20] = {"flame","distance","motion","touch","noise"};

//simulation prototype    
int analogRead(int type); 

int main(void)
{
    int i;
    PARAM p;
    char buf[20];
    int result = 0;

    for(i=0;i<MAX_SENSOR;i++)
    {
        p.val = analogRead(i);// for use with struct
        result = analogRead(i);//for use without struct
        if(p.val /*(or result)*/ == some error)
        {
            //handle error
        }
        strcpy(p.descr, str[i]);//for use without struct
        sprintf(buf, "%s: %d\n", p.descr, p.val);//for use with struct
        sprintf(buf, "%s: %d\n", str[i], result);//for use without struct
        printf(buf);
        sleep(10);  //10ms delay, For simulation only, to allow clock tick for rand() function 
    }           
    return 0;
}

//simple simulation of  analog read function
int analogRead(int type)
{
    int meas = 0;
    srand(clock());
    switch(type)  {
        case FLAME_SENSOR:
            // meas = read flame sensor instrument
            meas = rand()%10;
            break;
        case DISTANCE_SENSOR:
            // meas = read dist sensor instrument
            meas = rand()%10;
            break;
        case MOTION_SENSOR:
            // meas = read motion sensor instrument
            meas = rand()%10;
            break;
        case TOUCH_SENSOR:
            // meas = read touch sensor instrument
            meas = rand()%10;
            break;
        case SOUND_SENSOR:
            // meas = read sound sensor instrument
            meas = rand()%10;
            break;
        // add more case statements ???
        default:
            meas = some error
            break;
    }
    return meas;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...