Popularny post karolina-S Sierpień 24, 2021 Popularny post Udostępnij Sierpień 24, 2021 Moje rozwiązanie zadania 4.5 #define red_LED 8 #define yellow_LED 9 #define green_LED 10 #define button 3 int potentiometerValue; //wartość odczytana z potencjometru int readValue; //wartość wpisana przez użytkownika int attempt = 1; //która próba void setup() { Serial.begin(9600); pinMode(red_LED, OUTPUT); pinMode(yellow_LED, OUTPUT); pinMode(green_LED, OUTPUT); pinMode(button, INPUT_PULLUP); digitalWrite(red_LED, LOW); digitalWrite(yellow_LED, LOW); digitalWrite(green_LED, LOW); Serial.println("Cześć! Zagrajmy w grę!"); Serial.println("Przekręć potencjometr i wciśnij przycisk"); } void loop() { while (digitalRead(button) == HIGH) {} potentiometerValue = analogRead(A5); Serial.println("Podaj liczbę od 0 do 1023:"); digitalWrite(red_LED, LOW); digitalWrite(yellow_LED, LOW); digitalWrite(green_LED, LOW); while (Serial.available() == 0) {} // czekaj, dopóki nie będzie danych readValue = Serial.readStringUntil('\n').toInt(); if ((readValue - 50 <= potentiometerValue) && (readValue + 50 >= potentiometerValue)) { digitalWrite(red_LED, LOW); digitalWrite(yellow_LED, LOW); digitalWrite(green_LED, HIGH); Serial.println("Brawo! Wygrana!"); } else if (attempt == 3) { digitalWrite(red_LED, HIGH); digitalWrite(yellow_LED, LOW); digitalWrite(green_LED, LOW); Serial.println("Niestety, przegrana!"); } else { digitalWrite(red_LED, LOW); digitalWrite(yellow_LED, HIGH); digitalWrite(green_LED, LOW); Serial.println("Spróbuj jeszcze raz!"); Serial.println("Przyciśnij przycisk i wpisz nową liczbę."); attempt++; } } Nie wiem, ile miałam podejść do tego zadania, ale w końcu się udało 🙂 2 1 Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Sierpień 27, 2021 Udostępnij Sierpień 27, 2021 (edytowany) @karolina-S super, wygląda bardzo czytelnie 🙂 Możesz jeszcze spróbować włożyć ustawienia LED do tablic. Jest to co prawda w innym kursie ale w ramach dodatku warto żebyś na to spojrzała 😉 Edytowano Sierpień 29, 2021 przez Gieneq Cytuj Link do komentarza Share on other sites More sharing options...
Snerg Wrzesień 17, 2021 Udostępnij Wrzesień 17, 2021 Cześć, zaczynam z arduino dzięki waszym kursom i mam pytanie odnośnie warstwy "programowej" - czy są jakieś sposoby na debuggowanie kodu step-by-step jak c++? "Kompilacja" w arduino nie pozwala na stwierdzenie czy np zmienna lokalna w środku kodu ma prawidłowo przypisaną wartość i nie ma wglądu do tego co się dzieje po kolei co jest (w moim odczuciu) strasznym utrudnieniem. Z kursu i tak korzystam bardziej pod kątem sprzętowym, trochę programowania było na studiach i samo napisanie programu nie stanowi problemu, niemniej prześledzenie go już tak. Pozdrawiam autorów kursu za sporo cennej wiedzy. Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Wrzesień 18, 2021 Udostępnij Wrzesień 18, 2021 @Snerg witam na forum 🙂 Niestety nie ma takiej opcji. Debugowanie wymaga jakiegoś sposobu wglądu w pamięć, co wiąże się z dodatkowym układem peryferyjnym i interfejsem komunikacyjnym, którego proste 8biotwe AVRy nie mają. Jeżeli potrzebujesz debuggera to pozostają32b mikrokontorlery jak np STM32LSTM32L4 4 do którego niedawno wydaliśmy kurs. 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
Vova Wrzesień 27, 2021 Udostępnij Wrzesień 27, 2021 (edytowany) 4.5 Działa, ale nie zupełnie tak jak bym chciał, i skończyły mi się pomysły jak to rozwiązać. Chodzi o moment włączania diody czerwonej - jednocześnie wykonuje mi się cały kod do włączania diody żółtej. Próbowałem wpisać warunek do diody żółtej else if (proba < 3), co miało zapobiec wykonywaniu dane go kodu, gdy wykorzystano więcej niż 2 "szanse" ale nic to nie dało🤔 #define zielona 2 #define zolta 3 #define czerwona 4 #define swicz 7 int proba = 0; // Szansa String liczbaWpisana = ""; // Komunikat w terminalu int los = 0; // Wartosc odczytana z potencjometru int liczba = 0; void setup() { Serial.begin(9600); // Komunikacja z terminalem USART pinMode(2, OUTPUT); // Konfiguracja wyjsc pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(7, INPUT_PULLUP); digitalWrite(zielona, LOW); // Zadna z diod nie swieci digitalWrite(zolta, LOW); digitalWrite(czerwona, LOW); } void loop() { if (digitalRead(swicz) == LOW) { // Gdy swicz zotał wcisniety Serial.println("Podaj liczbe"); // Wyswietl komunikat delay(500); // Niwelacja zaklucen } if (Serial.available() > 0) { // Gdy liczba zostala podana liczbaWpisana = Serial.readStringUntil('\n'); // Odczyt i zapis jako "liczba" liczba = liczbaWpisana.toInt(); //Rzutowanie tekstu na liczbe los = analogRead(A5); // Odczyt wartosci z ADC (potencjometr) Serial.println(liczba); // Wyswietl podana liczbe w terminalu if (liczba - los <= 50 && liczba - los >= -50) { // Gdy odczyt z potecjometru i podana liczba mieszcza sie w zakresie tolerancji 50 digitalWrite(zielona, HIGH); // Wlacz diode zielona na 1,5 sek delay(1500); digitalWrite(zielona, LOW); Serial.println("Gratulacje, gramy dalej !\n Wylosoana liczba to"); // Wyswietl komunikaty w monitorze szerogowym Serial.println(los); proba = 0; // Zerujemy licznik szans } else { // W przeciwnym wypadku gdy masz jesz szanse do wykorzystania wlaczdiode zolta na 1,5 sek digitalWrite(zolta, HIGH); delay(1500); digitalWrite(zolta, LOW); Serial.println("Nie trafiles\n Wylosoana liczba to"); // Wyswietl odpowiedni kmunikaty w monitorze Serial.println(los); proba = proba + 1; // Rejestracja wykorzystania jednej szansy delay(50); // Niwelacja zaklucen } if (proba == 3) { // Gdy zostana wykorzystane 3 proby digitalWrite(czerwona, HIGH); // Wlacz diode czerwona na 1.5 sek delay(1500); Serial.println("Przegrales, zacznij od nowa"); // Wyswietl odpowiedni komunikat w monitorze digitalWrite(czerwona, LOW); delay(50); // Niwelacja zaklucen while (digitalRead(swicz) == HIGH) {} // Czakamy na wcisniecie przycisku delay(50); // Niwelacja zaklucen } } } Edytowano Wrzesień 27, 2021 przez Vova Cytuj Link do komentarza Share on other sites More sharing options...
pawelmb Wrzesień 28, 2021 Udostępnij Wrzesień 28, 2021 @Vova po szybkim przejrzeniu potencjalnie dwa problemy: pamiętaj, że "if ... else" to jest jeden blok. Ale kolejny "if" (nawet napisany w tej samej linijce tuż po nawiasie, czyli "...} if (..." to już kolejny blok, i warunki sprawdzane są niezależnie od poprzedniego "if ... else" może prościej przykładem if (liczba - los <= 50 && liczba - los >= -50) { // Gdy odczyt z potecjometru i podana liczba mieszcza sie w zakresie tolerancji 50 ... // to się wykona jeżeli prawdziwy jest powyższy warunek } else { // W przeciwnym wypadku gdy masz jesz szanse do wykorzystania wlaczdiode zolta na 1,5 sek ... // to się wykona w przeciwnym przypadku } if (proba == 3) { ... // ale to się wykona jeżęli jest spełniony TYLKO warunek proba == 3, bez wzlędu na to się wydażyło w poprzednim if } być może chodziło Ci jednak o konstrukcję "if ... else if ... else" Drugi problem: zmienną "proba" na 0 ustawiasz tylko: - jeden raz przy ładowaniu programu - po odgadnięciu i w żadnym innym przypadku. Pomyśl, czy nie powinieneś ustawiać też na końcu (po "Przegrales, zacznij od nowa"), bo bez tego od nowa nie zaczyna (ciągle wykonuje się tylko to co w "loop"). 2 Cytuj Link do komentarza Share on other sites More sharing options...
Vova Wrzesień 28, 2021 Udostępnij Wrzesień 28, 2021 @pawelmb Dziękuję za za odpowiedź. Faktycznie proba = 0; była w If(proba == 3) tylko tyle razy przerabiałem ten kod że w końcu go zabrakło. 9 godzin temu, pawelmb napisał: } if (proba == 3) { ... // ale to się wykona jeżęli jest spełniony TYLKO warunek proba == 3, bez wzlędu na to się wydażyło w poprzednim if } No własnie o to mi chodzi że w tym if-ie wykonuje się też poprzedni else, czyli : 22 godziny temu, Vova napisał: } else { // W przeciwnym wypadku gdy masz jesz szanse do wykorzystania wlaczdiode zolta na 1,5 sek digitalWrite(zolta, HIGH); delay(1500); digitalWrite(zolta, LOW); Serial.println("Nie trafiles\n Wylosoana liczba to"); // Wyswietl odpowiedni kmunikaty w monitorze Serial.println(los); proba = proba + 1; // Rejestracja wykorzystania jednej szansy delay(50); // Niwelacja zaklucen a według mnie nie powinien 🤔. Może nie do końca umiem przekazać o co mi chodzi... Cytuj Link do komentarza Share on other sites More sharing options...
ebucior Październik 21, 2021 Udostępnij Październik 21, 2021 Cześć, Przesyłam rozwiązanie zadania 4.4. [code] int odczytanaWartosc = 0; //zmienna do przechowywania odczytu ADC int prog = 0; //Prog wlaczenia swiatla - ustawiamy potencjometrem float napiecie = 0; //Wartosc przeliczana na napiecie w V void setup() { // put your setup code here, to run once: pinMode(8, OUTPUT); //Konfiguracja wyjsc pod diode LED Serial.begin(9600); //Uruchomienie USART } void loop() { // put your main code here, to run repeatedly: odczytanaWartosc = analogRead(A5); //Odczytanie wartosci z ADC napiecie = odczytanaWartosc * (5.0 / 1024.0); //Przeskalowanie wartosci prog = analogRead(A4); //Odczytanie wartosci z ADC if (odczytanaWartosc < prog) { //czy jest ciemniej od ustawionego progu?+- digitalWrite(8, HIGH); //Wlaczenie diody Serial.println(napiecie);// Wysyłamy zmierone napiecie while (analogRead(A5) < prog) { //Zaprzestanie wysylania wskazania napiecia; wyslanie tylko jeden raz } } else { digitalWrite(8, LOW); //Wylaczenie diody } delay(25); } [/code] Chyba wszystko działa jak trzeba, jednak miałem z jednym elementem (pętla while) mały problem. Chyba dzięki niemu lepiej zrozumiałem ten aspekt. Po analizie wpisów na tym forum mam czasem wrażenie, że być może program jest zbyt "łopatologiczny" i zastanawiam się, czy ten kurs jest do przejścia dla osoby, która nigdy nie miała styczności z programowaniem, szczególnie, że w jednej z wiadomości autor odpowiedzi wprost napisał, że bez znajomości C nie ma sensu brać się za Arduino. Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Październik 21, 2021 Udostępnij Październik 21, 2021 18 minut temu, ebucior napisał: że bez znajomości C nie ma sensu brać się za Arduino. Jest sens bo pisanie na arduino to wkoncu pisanie w C/C++ z tym ze arduino dostarcza roznych prostych funkcji i "skrutow"...co nie zmienia faktu ze przeczytac jakas dobra ksiazke o C i tak trzeba bedzie w przyszlosci zeby zapchac wszystkie luki o ktorych rzadko sie wspomina, lub wcale w kontekscie Arduino...a informacje te beda niezbedne do dalszego dzialania... Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Październik 21, 2021 Udostępnij Październik 21, 2021 Powiem tak: na początek wystarcza znajomość podstaw C/C++ (no, ale programowanie pralki też wymaga podstawowej wiedzy o tym, w jakiej temperaturze pierze się gacie i skarpetki, i czy można prać razem). Reszta przychodzi z czasem. Cytuj Link do komentarza Share on other sites More sharing options...
LONGER Październik 31, 2021 Udostępnij Październik 31, 2021 Hej, oto fragment kodu: void loop() { A = analogRead(A0); V=map(A, 0, 1023, 0, 5); Serial.println(V); Serial.println(A); A to przykładowo otrzymane informacje przez UART: 845 4.00 848 4.00 848 4.00 847 4.00 847 Pytanie czy funkcja map() zawsze zwraca liczby całkowite? Pozdrawiam. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Październik 31, 2021 Udostępnij Październik 31, 2021 (edytowany) map() wewnętrznie działa na long int. W bibliotece nie ma odpowiednika dla floatów, ale możesz znaleźć kod funkcji map i stworzyć własną fmap. Kiedyś coś na ten temat było na forum, ale teraz nie mogę znaleźć. Potraktuj to jako dodatkowe ćwiczenie - na pewno znajomość rozwiązania kiedyś się przyda. Edytowano Październik 31, 2021 przez ethanak 1 Cytuj Link do komentarza Share on other sites More sharing options...
pmochocki Październik 31, 2021 Udostępnij Październik 31, 2021 Czy to nie powinno być coś w tym stylu: float mapFloat(float value, float fromLow, float fromHigh, float toLow, float toHigh) { return (value - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow; } Nie mam jak sprawdzić, czy na pewno działa, bo jestem u teściow bez dostępu do komputera... 1 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Październik 31, 2021 Udostępnij Październik 31, 2021 Ćwiczenie miało polegać na znalezieniu kodu źródłowego funkcji. Cytuj Link do komentarza Share on other sites More sharing options...
pmochocki Październik 31, 2021 Udostępnij Październik 31, 2021 1 godzinę temu, ethanak napisał: Ćwiczenie miało polegać na znalezieniu kodu źródłowego funkcji. Ćwiczenie nadal można wykonać. 😉 Cytuj Link do komentarza Share on other sites More sharing options...
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!