Немогу понять цикл и оператор for.

string2004
Offline
Зарегистрирован: 14.12.2014

задачка по поиску среднего значения за несколько измерений.

Как из цикла вытащить значение переменной?

for  (int i=0; i<20; i++)

{

int a = analogRead(A1);

int b = b+a;

}

serialPrint (b/20);

по каким-то непонятным причинам b остаётся равно 0... хотя если вставить сериалпринт в цикл, то оно растёт.

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

int b за пределы for вынесите. 

И прочитайте про облать действия переменнных. http://arduino.ru/Reference/Scope

string2004
Offline
Зарегистрирован: 14.12.2014

объявлял переменную и в сетапе и в лупе, почему-то не помогает. и даже перед сетапом...

for (int i=0; i<20; i++)

{

int a = analogRead(A1);

int b = b+a;

}

serialPrint (b/20);

Coolerr
Offline
Зарегистрирован: 30.06.2014

Переменную нужно объявлять, глобально до лупов и сетапов или static или локально действуют для данной функции в твоем случае i  и a объявлена обосновано. b объявлена локально и будет видна только в цикле for. Ещё b=b+a так b+=a по феньшую будет.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

string2004, переменная b должна быть не int а  float. (или результат задать как float)  И само собой сбрасывайте её где-нибудь, а то будет геометрически расти)

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

а на кой она должны быть float ?  предпосылок к использованию в виде float явно нет ... Тут явно не дробные числа... Лучше уж insigned int

В остальном все верно обьяснено. Весь код в можо увидеть.

string2004
Offline
Зарегистрирован: 14.12.2014

спасибо, разобрался!

если кому надо...

 

float b = 0;
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
//int b = 0;
}

// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
for (int i=0; i<50; i++)
{
int a = analogRead(A0);
b = b+a;
// Serial.print (b);
// Serial.print (" ");
// Serial.println (i);
delay(3);
}

Serial.print (b/50);
b=0;
Serial.print (" ");
// print out the value you read:
Serial.println(sensorValue);
delay(500); // delay in between reads for stability

faraddin
Offline
Зарегистрирован: 11.08.2013

объявленная в цикле переменная видна только в этом цикле.



void loop()
{
	int a=0;
	for (..)
	{
		int a=1;
		...
	}
}

компилятор воспримет как 

void loop()
{
	int a1=0;
	for (..)
	{
		int a2=1;
		...
	}
}

надо объявить только раз:
void loop()
{
	int a=0;
	for (..)
	{
		a=1;
		...
	}
}

 

Coolerr
Offline
Зарегистрирован: 30.06.2014

float потому что сумма 20и значений АЦП не всегда кратна 20

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

string2004, по идее если поставить (b/50.0) , то компилятор автоматически сочтёт выводимый результат как float. Тогда b можно оставить интом, но это уже как говорится "игра слов" :)