Создание массива, присвоение значения каждому индексу и оценка массива
Я пытаюсь создать неназначенный массив размером 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);
}
@Anthony Chan, 👍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()
.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
если вы хотите запустить код только один раз, поместите его в блок setup ()... оставьте блок loop() пустым, @jsotola
почему у вас есть функция stop ()? ... ты никогда не называешь это, @jsotola
сделайте массив глобальным. и он слишком велик для Uno. и
Vs[i] = analogRead(A0) * (5.000/1024.000);
, @Juraj