Arduino сравнить веса массива - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь заставить датчик сканировать и помечать объект, назначая 1 для этой позиции.Позиции от 30 60 90 120 150 [0 0 0 0 0].Затем я хотел взять этот массив и сравнить его с памятью (tempArray vs memArray) и решить, какой путь повернуть.По сути, избегание препятствий, какие-либо предложения о том, как реализовать это с массивами?

void scan() {
servo.write(30);
delay(350);
rScan = echodis();
 if (rScan > distanceLimit) {
tempArray[4] = 1;
  }
servo.write(60);
delay(350);
rDiagScan = echodis();
if (rDiagScan > distanceLimit) {
  tempArray[3] = 1;
  }
servo.write(90);
delay(350);
cScan = echodis();
if (cScan > distanceLimit) {
  tempArray[2] = 1;
  }
servo.write(120);
delay(350);
lDiagScan = echodis();
if (lDiagScan > distanceLimit) {
  tempArray[1] = 1;
 }
servo.write(150);
delay(350);
lScan = echodis();
if (lScan > distanceLimit) {
  tempArray[0] = 1;
}
scanCount++;

servo.write(120);
delay(350);
lDiagScan = echodis();
if (lDiagScan > distanceLimit) {
  tempArray[1] = 1;
 } servo.write(90);
delay(350);
cScan = echodis();
if (cScan > distanceLimit) {
  tempArray[2] = 1;
  }
servo.write(60);
delay(350);
rDiagScan = echodis();
if (rDiagScan > distanceLimit) {
  tempArray[3] = 1;
}
servo.write(30);
delay(350);
rScan = echodis();
if (rScan > distanceLimit) {
  tempArray[4] = 1;
}
scanCount++;
//if(scanCount = 4){
 //memset(tempArray, 0, sizeof(tempArray));
//}
//return (tempArray);




 }

1 Ответ

0 голосов
/ 09 марта 2019

Существует много способов решения таких проблем при повторении, вот один.

Подход здесь заключается в том, чтобы позволить состоянию и данным управлять операциями, а не повторять код, подверженный ошибкам.Также учитывайте важность определения минимумов, максимумов, констант и т. Д. В одном месте.

#define SERVO_SETTLE_MILLIS  350
#define SERVO_STEP  30
#define SERVO_SAMPLE_LEN  5
#define OUTLIER 1
#define INLIER 0

byte scan_count = 0; // when even or 0, position starts at 30. when odd, position starts at 150.

void scan(byte* pSampleArray, const uint16_t maxDistance) {

  byte direction = scan_count % 2 == 0;
  byte servo_position = direction ? (SERVO_SAMPLE_LEN * SERVO_STEP) : 0;
  byte sample_index = direction ? SERVO_SAMPLE_LEN : -1;

  for (byte i = 0; i < SERVO_SAMPLE_LEN; i++) {

    // direction == 0 == servo position starts at 30 (initial)
    if (direction) {
      sample_index--; // e.g. 4,3,2,1,0
      servo_position += SERVO_STEP; // e.g. 30,60,90,120,150
    }
    else
    {
      sample_index++; // e.g. 0,1,2,3,4
      servo_position -= SERVO_STEP;; // e.g. 150,120,90,60,30
    }
    // position servo
    servo.write(servo_position);
    // settling time
    delay(SERVO_SETTLE_MILLIS);
    // sample = 1 if outlier, 0 otherwise
    pSampleArray[sample_index] = echodis() > maxDistance ? OUTLIER : INLIER;
  }

  scan_count++; // implies direction stepping for next call to scan.
}

Конечно, нужно позаботиться о том, чтобы pSampleArray мог вместить 5 выборок.

Вы не говорите очто вы планируете делать с «массивами», которые, вероятно, являются настоящим ядром вашего проекта, но, например, рассмотрите функцию foo

void foo(const uint16_t maxDistance) {
  byte sample1[SERVO_SAMPLE_LEN];
  byte sample2[SERVO_SAMPLE_LEN];
  scan(sample1, maxDistance);
  delay(1000);
  scan(sample2, maxDistance);
  //
  // process your samples
  //
}

Удачи!

...