Схема: 1 Кнопка и 1 скетч потенциометра
Схема: 1 кнопка и 1 потенциометр
Скетч: При каждом нажатии кнопки приобретайте значение потенциометра в векторе из 10 позиций и печатайте его на последовательном мониторе или жидкокристаллическом дисплее.
В конце выведите среднее значение (сумма значений / 10).
#define BUTTON 5
#define ARRAY_SIZE 10
int counter = 0;
int valori[ARRAY_SIZE];
int pinPotenziometro = A0;
int statoPresenteBottone = LOW; //why so LOW?
float media = 0.0;
void setup() {
Serial.begin(9600);
pinMode(BUTTON, INPUT);
for (int i = 0; i < ARRAY_SIZE; i++) valori[i] = 0;
}
void loop() {
if (counter > ARRAY_SIZE) {
counter = 00;
media = 0.0; // when we fill array fully - we start again
for (int i = 0; i < ARRAY_SIZE; i++) valori[i] = 0;
}
statoPresenteBottone = digitalRead (BUTTON);
while (statoPresenteBottone == HIGH) {
valori[counter] = analogRead(A0);
media = media + valori[counter];
Serial.print("Average: ");
Serial.println(media / counter);
Serial.print("Button pressed times: ");
Serial.println(counter);
statoPresenteBottone = LOW;
counter++;
}
}
Это то, что я сделал, но это не работает так, как я хочу. Мне нужно получить среднее из 10 чисел, которые я получил в конце, но он делает это каждый раз.
1 ответ
Я не буду писать код для вас (как описано в моем комментарии к вашему дублирующему вопросу), хотя я укажу на некоторые проблемы в вашем коде и дам подсказки, как их решить.
В основном ваша структура программы не верна. Первый совет-не смотреть на реальный код C/C++ на первом шаге. Запишите шаг за шагом, что должна делать программа. Здесь я делаю это для вас, как я понимаю ваше описание:
Initialize everything (setup)
loop
if button was pressed
loop 10 times
take analog reading and add it to the sum
delay 10ms (for example) to keep the reading regularly spaced
calculate average by dividing the sum of values through 10
print average over serial
И из этого псевдо-кода вы начнете писать соответствующий код C/C++ для Arduino. Для "Initialize everything" вы можете повторно использовать функцию current setup ()
(предполагая, что у вас уже есть съемный резистор на контакте кнопки). То, что я написал как "цикл", будет просто функцией loop ()
. "Если кнопка была нажата" будет if(digitalRead(button_pin))
. 10 аналоговых показаний могут быть записаны с помощью
цикла for, добавляя аналоговые значения в локальную переменную и немного задерживая показания, чтобы они регулярно располагались на определенном расстоянии (вы можете изменить это по своему усмотрению. Вы также можете задержать путь короче с delayMicroseconds ()
).
А теперь несколько примечаний к исходному коду, которые вы должны иметь в виду при написании нового:
У вас есть строки (я опустил некоторые строки, которые не имеют отношения к моей точке зрения здесь):
statoPresenteBottone = digitalRead (BUTTON); while (statoPresenteBottone == HIGH) { statoPresenteBottone = LOW; }
Следуйте логике здесь: мы считываем состояние кнопки и сохраняем его в переменной. Затем мы делаем цикл, пока эта переменная
ВЫСОКА
. Но уже на первой итерации этого цикла мы устанавливаем переменную наLOW
уровень . Это означает, что цикл while не будет циклическим. Он будет работать только один раз. Кроме того: Если вы хотите проверить , находится ли кнопка все еще
HIGH
, вам действительно нужно прочитать ее. ПеременнаяstatoPresenteBottone
не изменится автоматически при нажатии или отпускании кнопки. Вам нужно фактически прочитать pin кнопки спомощью digitalRead(КНОПКА)
. Переменная-это просто небольшое пространство в памяти, где вы храните данные (например, последнее состояние чтения кнопки). Он не подключен ни к какому аппаратному обеспечению. Это должно быть сделано с помощью программного обеспечения.Вы используете массив для аналоговых значений, хотя в этом случае вам это не нужно. Для вычисления среднего достаточно просто сложить значения, а затем разделить на количество измерений. Массив просто не нужен. А при удалении массива счетчик переменных
и полный код сброса массива становятся ненужными и могут быть удалены.
Мы не можем видеть вашу схему, поэтому, пожалуйста, обратите внимание, что вам нужен выдвижной резистор на выводе, который вы подключили к кнопке. В противном случае у вас был бы плавающий штифт, что привело бы к случайному и часто быстро меняющемуся состоянию штифта. Часто люди вместо этого используют внутренний резистор pullup Arduino, используя
pinMode(pin, INPUT_PULLUP)
и подключая кнопку к земле вместо Vcc. Хотя это меняет логику (LOW
уровень означает, что кнопка нажата,HIGH
-что она не нажата). Это зависит от вас, хотите ли вы использовать.В комментариях другие указывали на дебоширование кнопок. Это важный вопрос, хотя для приведенной выше структуры псевдокода это не так уж важно, я думаю (это зависит от того, как именно вы хотите, чтобы кнопка вела себя). Так что вам следует постоянно иметь в виду дебош. В Интернете есть много учебников по этому поводу. Я часто предлагаю использовать библиотеку Bounce2, так как она уже справляется с деблокированием кнопок для вас и довольно проста в использовании. Хотя - как уже было сказано - я не думаю, что вам это действительно нужно в данном случае.
- Arduino синтаксический анализ строки с использованием sscanf
- Объяснить функцию pulseIn с помощью arduino и ультразвукового датчика
- Проблемы с Serial.read()
- Node.js не может распознавать символы из последовательного порта
- GPS автономный робот
- Создание формулы
- Arduino зуммер кодовая последовательность не срабатывает
- Кодировщик Морзе работает не так, как ожидалось на Arduino UNO
По крайней мере, кнопка должна быть деактивирована, и вы, скорее всего, захотите подождать до перехода обратно к "НИЗКОМУ уровню", прежде чем делать еще одно чтение, если только вы явно не хотите читать до тех пор, пока кнопка удерживается нажатой. Несвязанное, но сказать нам, что есть кнопка и горшок, - это не схема., @Dave Newton
Мне нужно изменить программу, как после того, как мы приобрели 10 значений, программа делает среднее значение, а затем перезапускается с 0, ему нужно 10 значений, которые вы получаете от потенциометра и повторяете, вы понимаете, что я имею в виду? Но идк как это исправить, @il king dei kings
@дейв Ньютон вы знаете, как это можно исправить, можете ли вы изменить pls скетча? D:, @il king dei kings
@ilkingdeikings Какая часть, в частности, вызывает проблему?, @Dave Newton
1 кнопка и 1 потенциометр
- это **не** схема, это частичный список деталей, @jsotola@Dave Newton если вы попробуете программу в Tinkercad с добавлением кнопки и потенциометра , вы увидите, что он делает среднее значение для каждого полученного числа, но мне это не нужно, мне нужно сделать среднее значение для десяти чисел. Я имею в виду, что после того, как я приобрел десять чисел, он делает сумму чисел /10, @il king dei kings
Но я понятия не имею как исправить скетч может быть вы знаете, @il king dei kings
Вы хотите 10 нажатий кнопок с одним показанием потенциометра на одно нажатие? А потом, после десятого нажатия, вычислить среднее и вывести его?, @tim
Вы не проверяете, сколько записей вы собрали; может быть, хорошим началом было бы проверить значение " счетчика` перед выполнением средних значений? (Еще раз заметив, что разоблачение было бы отличной идеей.), @Dave Newton
Ye @tim именно это, @il king dei kings
ничто rly не работает для меня , разве кто-нибудь не может отредактировать его, если это что-то быстрое? Я объяснил, что мне нужно.:, @il king dei kings