Массивы в Ардуино

Я пытаюсь создать массив и иметь возможность сравнивать второй с последним и последним элементом в массиве. Его нужно постоянно добавлять и сравнивать, чтобы он работал правильно. Это просто функция, которую я пытаюсь запустить, чтобы помочь управлять функцией шагового двигателя. У меня есть цикл, который будет быстрым, чтобы я мог сравнивать напрямую. Я знаю, что некоторые из них неверны, но, поскольку я не очень много кодировал на C, я не могу понять, как правильно использовать массив. Заранее спасибо.

int P[10],V[10],i,x,y;

Serial.print("checkvalue = "); 
Serial.print(checkvalue);Serial.print("\n");  
Serial.print("P = "); Serial.print(P[i]); Serial.print("\n");  //attempting to print array
Serial.print("V = "); Serial.print(V[i]); Serial.print("\n");  //to see if it is collecting 
                                                               //data correctly
//these variables are declared above in my code, just didn't copy in  
Dgreadpb = digitalRead(13); 
PBcheck = Dgreadpb;
//Serial.print("Button in = ");Serial.print(Dgreadpb); Serial.print("\n");
Dgreadvls = digitalRead(12);
VLScheck = Dgreadvls;
//Serial.print("Photo in = ");Serial.print(Dgreadvls); Serial.print("\n");


for (i = 0; i < 10; i++){
 x = Dgreadpb;
 y = Dgreadvls;
 P[i] = x;
 V[i] = y;

 if (P[i-1] == P[i] && V[i-1] == V[i]){     //trying to compare second to 
   checkvalue == 0;                         //last term to  the last term
   return;
 }
   else if(P[i-1] != P[i] || V[i-1] != V[i]){ 
     checkvalue == 1;
     return; 
   }
 }
delay (1000);

person bcv29    schedule 19.10.2015    source источник
comment
Подождите, я не мог понять, что вы хотите получить и что вы на самом деле получаете. И, кстати, цикл должен начинаться с 1, а не с 0 (поскольку нельзя сравнивать элемент 0 с - несуществующим - предыдущим)   -  person frarugi87    schedule 19.10.2015
comment
Когда i=0, P[i-1] и V[i-1] находятся вне досягаемости, и вы не должны туда заходить.   -  person MikeCAT    schedule 19.10.2015
comment
Я пытаюсь создать массив, чтобы проверить, отличается ли значение датчика в текущем цикле от значения датчика в предыдущем цикле. Таким образом, мой двигатель работает только в том случае, если значение датчика изменяется, и не работает постоянно в каждом цикле. Если нет лучшего способа сделать это, о котором я не знаю. @frarugi87   -  person bcv29    schedule 21.10.2015
comment
Объясните, чего вы пытаетесь достичь. ЧТО, а не КАК.   -  person Verhagen    schedule 21.10.2015


Ответы (2)


Под «попыткой сравнить предпоследний термин с последним термином» вы имеете в виду «пытаться сравнить предпоследний термин с их предыдущим»? Если это так, ваши индексы неверны, это должно быть for(i = 1; i<10; i++).

Также оба условия противоположны (либо оба равны, либо хотя бы одно из них отличается), нет необходимости в else if. Более того, поскольку оба условия противоположны, цикл никогда не завершится. Я думаю, что это не намерение, если вы пытаетесь сказать, что только один из них отличается, вы должны сделать:

if (P[i-1] == P[i] && V[i-1] == V[i]){ //If both are equal     
    checkvalue == 0;                         
    return;
}
else if(P[i-1] == P[i] || V[i-1] == V[i]){ //If only one is equal
    checkvalue == 1;
    return; 
}
person Mr. E    schedule 20.10.2015
comment
Я пытаюсь создать массив, чтобы проверить, отличается ли значение датчика в текущем цикле от значения датчика в предыдущем цикле. Таким образом, мой двигатель работает только в том случае, если значение датчика изменяется, и не работает постоянно в каждом цикле. Если нет лучшего способа сделать это, о котором я не знаю. - person bcv29; 21.10.2015

Хорошо, тогда я бы сделал другую вещь.

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

Теперь много информации отсутствует (например, как вы проверяете двигатель? как часто вы хотите проверять датчик? какой датчик?), но ИМХО вы должны сделать что-то вроде этого.

В этом коде я предполагаю, что

  1. вы хотите проверять датчик каждые 100 миллисекунд
  2. если значения отличаются, вы хотите включить двигатель на следующие 100 мс
  3. двигатель представляет собой двигатель постоянного тока, который включается установкой соответствующего контакта (например, 10)
  4. датчики имеют бинарный выход на пинах 12 и 13, так как вы написали это в коде

Кстати, я использовал функцию millis(), потому что ненавижу delay, так как она блокирует UC. Используя мою функцию, вы сможете выполнять другие операции, пока она простаивает.

const byte motorPin = 10;
const byte sensorPPin = 12;
const byte sensorVPin = 13;

#define LOOP_TIME_MS    100

unsigned long lastLoopTime;
boolean lastPval, lastVval;

void setup()
{
    pinMode(motorPin, OUTPUT);
    pinMode(sensorPPin, INPUT);
    pinMode(sensorVPin, INPUT);

    lastPval = digitalRead(sensorPPin);
    lastVval = digitalRead(sensorVPin);

    lastLoopTime = millis();
}

void loop()
{
    if ((millis() - lastLoopTime >= LOOP_TIME_MS)
    {
        boolean Pval = digitalRead(sensorPPin);
        boolean Vval = digitalRead(sensorVPin);

        if ((Pval != lastPval) || (Vval != lastVval))
        {
            digitalWrite(motorPin, HIGH);
        }
        else
        {
            digitalWrite(motorPin, LOW);
        }

        lastLoopTime += LOOP_TIME_MS;
    }

    /* Here you can do something else */
}

РЕДАКТИРОВАТЬ: Если, с другой стороны, вы хотите использовать массивы (потому что вы хотите проверить последние N значений, а не только предыдущее), предоставьте дополнительную информацию о том, каковы изменяющиеся условия (или лучше приведите примеры)

person frarugi87    schedule 21.10.2015