Skocz do zawartości

cinekk

Użytkownicy
  • Zawartość

    1
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O cinekk

  • Ranga
    1/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Warszawa
  • Zawód
    WebDeveloper
  1. Cześć, generalnie na początku wielkie dzięki za ten kurs! Bardzo fajnie i przejrzyście napisany. Szybka historia - natchniony promocjami na ebooki zakupiłem kilka o arduino. Bardzo mi się spodobało więc wczoraj na botlandzie zamówiłem zestaw do Waszego kursu. Dzis przyszedł i po pracy usiadłem do działania . Generalnie zrobiłem tę lekcję ale postanowiłem ją trochę skomplikować dodając więcej diód (diod?). Niestety nie działa to to tak jakbym tego oczekiwał . Poniżej mój kod, a jeszcze niżej pytania. Aha - nie jestem pewien czy to jest dobry dział na to pytanie bo całośc trochę wykracza poza materiał tej konkretnej lekcji - jeżeli to nie jest odpowiednie miejsce to przepraszam. // Deklaracja stałych coby nie powtarzać. Ta dioda systemowa to pozostałość z pierwszych // prób - nie usuwałem po prostu. W tym szkicu nie uzywana do niczego. #define hPin 13 // Dioda systemowa #define redPin 8 // Dioda czerwona #define yelPin 7 // Dioda pomarańczowa #define grePin 6 // Dioda zielona #define btnPin 4 // Przycisk // Tablica trzymająca piny pod którymi mamy LEDy // Po tej tablicy przeiterujemy unikając kopiowania kodu // Wzięte z książki: Arduino w akcji int ledArray[] = { hPin, redPin, yelPin, grePin }; // Licznik do pętli int count = 0; // Tablica ze stanami konkretnych diod // Zasada jak powyżej - zamiast tworzyć kilka zmienny mamy jedną tablicę // która będzie indeksowana po numerze pinu (część indeksów będzie pusta) int ledStates[] = {}; // Inicjalizacja zmiennej trzymającej dane wejściowe z Serial`a String data = ""; // Setup void setup() { Serial.begin(9600); Serial.println("Arduino wstaje..."); // Pętla iterująca po wszystkich pin`ach z diodami LED // i ustawiająca ich tryb na OUTPUT for (count = 0; count < 4; count++) { pinMode(ledArray[count], OUTPUT); } // @PROBLEM // Inicjalizacja wartości odpowiednich LED`ów na 0 (LOW) // ta pętla powoduje, że szkic nie działa - po jakiejkolwiek akcji - czy to wciśnięciu // przycisku czy wpisaniu czegoś do konsoli pojawia się log: "Arduino wstaje..." // To musi zostać wykomentowane, żeby dojść do problemu nr 2. for (count = 0; count < 9; count++) { ledStates[count] = 0; } // Ustawiamy tryb pinu przycisku pinMode(btnPin, INPUT_PULLUP); } // Main loop void loop() { // Wywołanie funkcji obsługującej wejście z poziomu konsoli lightLedFromInput(); // Jeżeli przycisk został wciśnięty if(digitalRead(btnPin) == LOW) { // Wywołanie funkcji zmieniającej stan diody toggleLED(grePin); // Zapobiegamy wielokrotnemu odpaleniu się toggleLED poprzez wstrzymanie // wykonywania kodu dopóki przycisk jest wciśnięty while(digitalRead(btnPin) == LOW) { delay(25); } } } //Funkcja obsługująca wejście z Serial void lightLedFromInput() { if(Serial.available() > 0) { data = Serial.readStringUntil('\n'); // Sprawdzenie wszystkich możliwych wartości - to na pewno da się inaczej zrobić // ale na razie miałem inne problemy :) if(data == "6" || data == "7" || data == "8") { int led = data.toInt(); toggleLED(led); } else { Serial.println("Podano zły numer diody."); } } } // Funkcja zmieniająca stan diody // @param led - numer pinu diody void toggleLED(int led) { int state = 0; // Ten fragment kodu jest potrzebny tylko dlatego, że pętla w setup() nie działa // i przy pierwszym odpaleniu ledStates[led] nie jest ustawione if(ledStates[led]) { // @PROBLEM2 // Tutaj dzieje się bardzo dziwna rzecz - mianowicie ledStates[led] przyjmuje // przy pierwszym wywołaniu 197 dla led = 7 i 196 dla led = 8. Stąd ten if sprawdzający // czy wartość mieści się w przedziale. // Dlaczego tak się dzieje? if(ledStates[led] == 1 || ledStates[led] == 0) { state = ledStates[led]; } } // Debug Serial.println(String(state)); ledStates[led] = !state; digitalWrite(led, ledStates[led]); Serial.println("Turning the " + (String)led + " LED to state: " + (String)ledStates[led]); } Czyli mam 2 główne problemy (szczegóły w komentarzach w kodzie): @PROBLEM1. Pętla całkowicie psuje szkic - powoduje "reset" - i nie mam pojęcia dlaczego. @PROBLEM2. Wartości w tablicy (jeżeli wykomentujemy tę pętlę z punktu pierwszego) przyjmują dziwne wartości nawet jeżeli tablica jest inicjalizowana jako pusta. Czyli tam gdzie spodziewałbym się czegoś w stylu NULL czy pustego wpisu jest np wartość 196 co mnie zupełnie rozbija . No i jest jeszcze problem numer 3, którego też nie rozumiem - jeżeli kilka razy zmienię stan diody zielonej używając przycisku, po czym zmienię go poprzez konsolę to może się okazać, że zmiana nie następuje (albo inaczej - następuje ale w obu przypadkach dioda np zostaje włączona. albo w obu wyłączona - tak jakby globalna wartość w tablicy nie ulegała zmianie). Mam nadzieję, że ma to sens i że to dobry dział. Jeśli nie to przepraszam i proszę o usunięcie / ewentualnie przeniesienie do dobrego działu. Dzięki z góry! Tomek
×
×
  • Utwórz nowe...