Skocz do zawartości

Problem z odczytem pozycji


Pomocna odpowiedź

Napisano

Witam,
proszę was o pomoc, próbuję zrealizować następujący układ.

Chcę sterować serwem za pomocą potencjometru, po przyciśnięciu przycisku arduino powinno zapisywać ruchy serwa, aby po ponownym naciśnięciu przycisku odtworzyć zapisaną sekwencję ruchów. Cały problem polega na tym że w momencie kiedy serwo powinno powtórzyć sekwencję ruchów, ono powtarza tylko jeden. Wydaje mi się ze odczytuje ono tylko pierwszą pozycję zapisaną w tabeli, czy mógłby ktoś to zweryfikować? Oto kod:

#include <Servo.h>
Servo test;
int AnalogOut = 0;
int NewAnalogOut = 0;
int pin_Button = 12;
int pin_Button_State = 0;
int pin_Button_State_Last = 0;
int storage[800];
int storage_loc = 0;
int recording = 0;

void setup() {
 Serial.begin(9600);
 test.attach(11);
 pinMode(pin_Button, INPUT);
}
// testing
void loop() {
 pin_Button_State = digitalRead(pin_Button);
 if (pin_Button_State != pin_Button_State_Last) {
   if (pin_Button_State == HIGH) {
     recording++;
     if (recording == 2) {
       storage[storage_loc] = 777;
     }
   }
   delay(50);
 }
 pin_Button_State_Last = pin_Button_State;

 if (recording == 0) {
 int sensorValue = analogRead(A0);
 NewAnalogOut = map(sensorValue, 0, 1023, 0, 180);
 if (abs(NewAnalogOut - AnalogOut) > 2) {
   test.write(AnalogOut);
   AnalogOut = NewAnalogOut;
 }
 }
 delay(1);
 if ( recording == 1) {
   recording = 1;
   int sensorValue = analogRead(A0);
 NewAnalogOut = map(sensorValue, 0, 1023, 0, 180);
 if (abs(NewAnalogOut - AnalogOut) > 2) {
   test.write(AnalogOut);
   AnalogOut = NewAnalogOut;
 }
   if (storage_loc < 800) {
     storage[storage_loc] = NewAnalogOut;
     delay(100);
     Serial.println(storage_loc);
     storage_loc++;
   }
 } else if (recording > 1) {
   while (1 == 1) {
   storage_loc = 0;
   if (storage_loc < 800 || storage[storage_loc] != 777) {

     test.write(storage[storage_loc]);

     delay(100);
   }
   }
 }

kh94, witam na forum!

Po szybkiej analizie znalazłem w Twoim programie poniższy fragment. Chyba zabrakło tutaj inkrementacji storage_loc? Ciągle dowołujesz się do tego samego pola w tablicy.

while (1 == 1) { 
   storage_loc = 0; 
   if (storage_loc < 800 || storage[storage_loc] != 777) { 

     test.write(storage[storage_loc]); 

     delay(100); 
   } 
  • Lubię! 1
Po szybkiej analizie znalazłem w Twoim programie poniższy fragment. Chyba zabrakło tutaj inkrementacji storage_loc? Ciągle dowołujesz się do tego samego pola w tablicy.

Dziękuję za pomoc, faktycznie tam był problem. Poniżej zamieszczam poprawiony kod, użyłem pętli for, ponadto dodałem zmienną storage_loc_last która zapamiętuje ostatni zapisany adres w tabeli, teraz działa poprawnie, czy można było to rozwiązać jeszcze inaczej? Jestem początkujący więc chętnie zapoznam się z waszymi opiniami

while (1 == 1) { 

   if (storage_loc < 800 || storage[storage_loc] != 777) { 
     for(storage_loc=0;storage_loc<storage_loc_last;storage_loc++){
     test.write(storage[storage_loc]); 
     }
     delay(100); 
   }

kh94, co dokładnie ma robić ten zapis? Skąd to 777?

if (storage_loc < 800 || storage[storage_loc] != 777) { 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...