Создание массива, присвоение значения каждому индексу и оценка массива

Я пытаюсь создать неназначенный массив размером 512, а затем назначить значение для каждого индекса. Я хочу получить время начала до и после цикла и запустить его только один раз. Затем я хочу знать, как получить показания и сериализовать значения после цикла. Пока это то, что у меня есть, но я не думаю, что это работает так, как я хочу. Мне удалось узнать время начала, но я не уверен, что оно будет запущено позже. Мы будем очень признательны за любую помощь. Спасибо!

void setup() { 
int Vs[512] = {}; 
int analogPin = A0; // включите вывод A0
pinMode(9, INPUT); 
Serial.begin(9600); // настройка последовательного порта
analogWrite(9, pow(2, 7)); //Мощность светодиода 0
int time = micros(); 
Serial.println(time); 
}

void loop() { 
int i; 
for (int i = 0; i <= 511; i++); { //loop setup for 512 
int c = analogRead(A0) * (5.000/1024.000); 
int Vs[i] = {c}; 
Serial.println(Vs[i]); 
} 
int stoptime = micros(); 
Serial.println(stoptime); 
}

void stop() { 
while(1); 
}

, 👍1

Обсуждение

если вы хотите запустить код только один раз, поместите его в блок setup ()... оставьте блок loop() пустым, @jsotola

почему у вас есть функция stop ()? ... ты никогда не называешь это, @jsotola

сделайте массив глобальным. и он слишком велик для Uno. и Vs[i] = analogRead(A0) * (5.000/1024.000); , @Juraj


1 ответ


1

С вашей программой существует множество проблем. Наиболее очевидным является то, что, если вы определяете переменную несколько раз, вы получаете mutliple разные переменные с одинаковыми именами. Например:

void setup() { 
    int Vs[512] = {};  // этот Vs является локальным для setup()
}

void loop() {
    int i;  //  этот i является локальным для loop()
    for (int i = 0;  // это другое i видно только в цикле for
            i <= 511;
            i++)
        ;  // это тело цикла for
    {
        ...
        int Vs[i] = {c};  // этот Vs является локальным для loop()
    }
}

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

Нет смысла определять константу, такую как analogPin = A0, если вы ее не используете.

Значение, возвращаемое функцией micros (), не является значением int, это unsigned int.

Если вы сохраняете напряжение в вольтах в int, вы получаете очень плохое разрешение в один вольт. Вы могли бы хранить в виде float, но это заполнило бы память вашего Arduino. Я бы предпочел сохранить необработанные показания и преобразовать их в вольты только для печати.

Serial.println() требует времени, и вы делаете это во время временной части вашего кода, что, вероятно, непреднамеренно.

Вот версия вашей программы, которая может лучше отражать ваши намерения. Он принимает 512 аналоговых показаний, сохраняет их в массиве, затем распечатывает и сообщает о времени, затраченном на выполнение показаний. Затем он ждет одну секунду и повторяет все это снова.

const uint8_t analogPin = A0;
const int readings_count = 512;
int Vs[readings_count];

void setup() {
    Serial.begin(9600);
}

void loop() {
    // Выполните прогон аналоговых показаний.
    unsigned long start_time = micros();
    for (int i = 0; i < readings_count; i++) {
        Vs[i] = analogRead(analogPin);
    }
    unsigned long stop_time = micros();

    // Распечатайте показания.
    Serial.println("Voltage readings:");
    for (int i = 0; i < readings_count; i++) {
        Serial.println(5.0/1024 * Vs[i]);
    }
    Serial.print("Data recorded in ");
    Serial.print(stop_time - start_time);
    Serial.println(" µs");
    Serial.println();

    //Подождите перед следующим запуском.
    delay(1000);
}

Если вы действительно хотите выполнить только одну итерацию процесса, то вы можете просто заменить delay(1000); на exit(0);. В качестве альтернативы, переместите тело цикла() в конец настройки ()и оставьте пустой loop().

,