kh94 Napisano Maj 20, 2018 Udostępnij Napisano Maj 20, 2018 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); } } } Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Maj 22, 2018 Udostępnij Maj 22, 2018 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); } 1 Cytuj Link do komentarza Share on other sites More sharing options...
kh94 Maj 23, 2018 Autor tematu Udostępnij Maj 23, 2018 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); } Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Maj 25, 2018 Udostępnij Maj 25, 2018 kh94, co dokładnie ma robić ten zapis? Skąd to 777? if (storage_loc < 800 || storage[storage_loc] != 777) { Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!