Округление среднего числа

vladimircape
Offline
Зарегистрирован: 26.03.2013

Я немного не пойму почему не работает код, из-за округления , кажется всё правильно делаю, а в реальности как программа доходит до округления зависает. вот на этой строчке

sensorValue[pos]=   int((val2+val1)/2);

и не пойму почему максимальное не находит, всё кажется очень элементарно.

#include <Servo.h>
Servo myservo;  // create servo object to control a servo
                // a maximum of eight servo objects can be created  
int pos = 0;    // variable to store the servo position
int max_v = 0;
int angel = 0;
int step1 = 1;
int sensorPin = A0;    // select the input pin for the potentiometer
int total=180;
int val2=0;
int val1=0;
int sensorValue[180];  // variable to store the value coming from the sensor
void setup() {
  // declare the ledPin as an OUTPUT:
 myservo.attach(9);
 Serial.begin(9600);
}

void loop() {
  for(pos = 0; pos < total; pos += step1)  // goes from 0 degrees to 180 degrees
  {                                  // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(10);                       // waits 15ms for the servo to reach the position
    sensorValue[pos] = analogRead(sensorPin);    
  }
  for(pos = total; pos>=step1; pos-=step1)
  {
    myservo.write(pos);
    delay(10);
    val2 = analogRead(sensorPin);    
    val2 = sensorValue[pos];
//    sensorValue[pos]=   int((val2+val1)/2);
    if(sensorValue[pos]>max_v)
      {
        max_v=sensorValue[pos];
        angel=pos;        
      }
  }
Serial.println("New");
Serial.println(max_v);
Serial.println(pos);
//delay(3000);
}

 

Looka
Offline
Зарегистрирован: 24.04.2012

Посмотрите как текст скетча в форум вставлять. 

 

Во втором цикле  sensorValue[pos]  выходит за пределы в первой итерации, так как pos = 180.

В  массиве у Вас 180 элементов, от 0 до 179  

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

vladimircape пишет:

Я немного не пойму почему не работает код, из-за округления

sensorValue[pos]=   int((val2+val1)/2);

Ну, во-первых результат (2+3)/2 - строго говоря, вовсе не инт (особенно, если для себя делать).

Во-вторых, усреднять имеет смысл за период, или, например, за десяток измерений: сначала их все складываем, а потом, в конце цикла - один раз делим.

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

tsostik
Offline
Зарегистрирован: 28.02.2013

А еще предлагаю внмательно посмотреть на эти две строки из вашео кода:

    val2 = analogRead(sensorPin);    
    val2 = sensorValue[pos];