Skocz do zawartości

Slowik

Użytkownicy
  • Zawartość

    4
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O Slowik

  • Ranga
    1/10
  1. To już popadanie w skrajność Prawie klasyfikuje się do udziału w IOCCC
  2. @Gieneq @ethanak Dziękuję za uwagi i rady Jeśli chodzi o "skracanie kodu" to nie miałem na myśli usuwania jakichkolwiek spacji (chociaż w mojej opinii zapis jednolinijkowy jest bardziej czytelny niż ze wcięciami, jak się scrolluje bardzo długi kod, to można więcej objąć wzrokiem). Raczej o coś jak zrezygnowanie z kilkudziesięciolinijkowej instrukcji switch lub if/else w której każda dioda jest opisana osobno. Albo możliwość regulacji czułości układu za pomocą jednej zmiennej, czy też możliwość dodawania/odejmowania diod, również w jednej zmiennej. Nie wiem skąd pojawił się szalony pomysł, że chodzi o usuwanie spacji, ale mimo wszystko dzięki za podsunięcie pomysłu na tą linijkę: digitalWrite(i, odległość < i * mnożnik); To upraszcza kod jeszcze bardziej Dodam, że przejrzałem cały temat i nie znalazłem rozwiązania podobnego do tego które zaproponowałem, dlatego też opublikowałem wcześniejszy post. Zaznaczyłem również, że zdaję sobie sprawę, że nadmierne 'skracanie' kodu może powodować utrudnienia w czytelności. Żeby nikt niepotrzebnie się nie denerwował, następnym razem zanim wrzucę jakiś kod to postaram przeczytać chociaż 2 rozdziały z podręcznika o C/C++ Co mam rozumieć poprzez magiczne liczby? Chodzi o to, żeby zastąpić numery pinów dla echo i trigger dyrektywami preprocesora? PS Komentarze dodawałem tylko i wyłącznie dlatego, że na tym forum spotykałem się z opinią, że kod należy komentować nawet kiedy piszemy na własne potrzeby (o ile pamiętam w którejś lekcji z kursu jest taka uwaga). Mnie uczono, że kod ma być samokomentujący się a komentarze tylko w przypadku jakichś egde-case.
  3. Jestem fanem maksymalnego skracania kodu, chociaż wiem, że nie zawsze oznacza to UPROSZCZENIE kodu a potrafi nieco utrudnić czytelność. Jednak chciałbym zaprezentować swoje rozwiązania zadania 9.3 byte ilosc_diod = 7; // Tu mozna zmienic ilosc diod, wazne jednak aby wpinac je po kolei, pomijajac pin 0 byte mnoznik = 5; // Parametr wyplywajacy na czulosc na odleglosc void setup() { pinMode(12, OUTPUT); // trig pinMode(11, INPUT); // echo for (int i = 1; i <= ilosc_diod; i++) pinMode(i, OUTPUT); // Petla for dodajaca kolejne diody jako OUTPUT } void loop() { int odleglosc = zmierz_odleglosc(); // wywolanie funkcji mierzacej odleglosc i przypisanie wartosci do zmiennej 'odleglosc' for (int i = 1; i <= ilosc_diod; i++) { if (odleglosc < (i * mnoznik)) digitalWrite(i, HIGH); // to wyjasnione ponizej poniewaz komentarz bylby zbyt dlugi :D else digitalWrite(i, LOW); } delay(30); // male opoznienie dodajace plynnosc do ukladu } int zmierz_odleglosc() { // funkcja obslugujaca pomiar odleglosci, zwraca wynik w centymetrach digitalWrite(12, LOW); delayMicroseconds(2); digitalWrite(12, HIGH); delayMicroseconds(10); digitalWrite(12, LOW); return pulseIn(11, HIGH) / 58; // przelicza pomiar na cm } Całość sprawuje się wyjątkowo dobrze jak na tak skrócony kod, jestem zadowolony z efektu można trochę kombinować z długością opóźnienia w głównej pętli żeby jeszcze bardziej poprawić płynność. Zastosowałem numery pinów w pętli for i parametr dodany na samej górze ('mnoznik') jako wartości graniczne dla zapalania kolejnych diod (a konkretniej ich iloczyn). W praktyce - jeśli mnożnik ustawimy na 5 to mamy po kolei wartości dla diod 5cm, 10cm, 15cm itd. Instrukcja warunkowa sprawdza czy konkretne wartości zostały przekroczone i odpowiednio steruje stanem wysokim/niskim. Zmieniając tylko jeden parametr (mnożnik), zmieniamy czułość na odległość dla całego układu. Wadą tego rozwiązania jest, że raczej należy pomijać pin 0, bo przy mnożeniu przez 0 trochę rozjedzie się skala, ostatnia dioda zaświeci tylko gdy fizycznie zatkamy czujnik. W ostateczności można by we wnętrzu pętli zamiast 'i * mnoznik' wpisać '(i + 1) * mnoznik' Pojawiło mi się jedno pytanie. Chciałem kod skrócić jeszcze bardziej i zrezygnować w głównej pętli ze zmiennej 'odleglosc'. Po prostu w warunku zamieścić wywołanie funkcji 'zmierz_odleglosc" zamiast przypisywać najpierw do zmiennej. Jednak po chwili zastanowienia doszedłem do wniosku, że w obecnej wersji program może być bardziej optymalny, bo przy każdej iteracji przez główną pętlę, funkcja 'zmierz_odleglosc' jest wywoływana jeden raz. Gdyby wywołać funkcję bezpośrednio w instrukcji warunkowej w pętli, to uruchamiałaby się przy przejściu przez każdy pin, czyli wiele razy więcej. Pierwszy raz spotkałem się z tego typu nieskończoną pętlą właśnie w Arduino, więc moje pytanie brzmi, czy to dobry sposób rozumowania?
  4. Zadanie 5.4, wstępne podejście wyszło tak: #include <Servo.h> Servo serwomechanizm; int pozycja = 0; void setup() { Serial.begin(9600); serwomechanizm.attach(9); } void loop () { pozycja = Serial.parseInt(); if (pozycja >= 0 && pozycja <= 180) serwomechanizm.write(pozycja); else Serial.println("Wybierz liczbe z zakresu 0-180"); } W tym rozwiązaniu serwo porusza się do żądanej pozycji a potem wraca do 0. Chciałem zrobić tak, aby serwo zostało w danej pozycji do momentu w którym użytkownik wprowadzi nową wartość. Wraz z wujkiem G opracowaliśmy takie rozwiązanie: #include <Servo.h> Servo serwo; int pozycja = 0; void setup() { Serial.begin(9600); } void loop () { if (Serial.available() > 0) serwo.attach(9); // Aktywacja serwa na pinie 9 pozycja = Serial.parseInt(); // Zapisanie do zmiennej wartosci podanej przez uzytkownika if (pozycja >= 0 && pozycja <= 180) serwo.write(pozycja); // Ustawienie serwa w zadanym kacie else Serial.println("Wybierz liczbe z zakresu 0-180"); serwo.detach(); // Odlaczenie serwa } Założenie jest takie, że po kiedy otwiera się komunikacja, serwo się włącza a po wprowadzeniu kąta przechodzi do żądanej pozycji po czym zostaje odłączone i zostaje w tej pozycji. Jestem zadowolony z tego rozwiązania ze względu na jego prostotę Mam natomiast jedno pytanie dotyczące pierwszego kodu - po przesłaniu kodu do Arduino (lub wciśnięciu przycisku Reset) serwo wychyla się o jakieś 90 stopni po czym wraca do pozycji początkowej. Z czym może być to związane? Pochwalę się jeszcze zadaniem 5.5: #include <Servo.h> Servo serwomechanizm; int potencjometr = 0; void setup() { serwomechanizm.attach(9); } void loop () { potencjometr = map(analogRead(A5), 0, 1023, 0, 181); // Odczytuje sygnał analogowy z potencjometru i za pomoca funkcji map rozbijam na zakres obrotu serwa serwomechanizm.write(potencjometr); // Informacja dla serwa o kacie wychylenia } Serwo bardzo płynnie porusza się razem z obrotem potencjometrem
×
×
  • Utwórz nowe...