Treker (Damian Szymański) Luty 27, 2016 Udostępnij Luty 27, 2016 Cesenu, program zatrzymuje się w tym miejscu pewnie: while (fotorezystor) {} Sprawdź, czy i kiedy wartość zmiennej fotorezystor równa się 0 - tylko wtedy program wyjdzie z tej pętli.
mechanik Marzec 3, 2016 Udostępnij Marzec 3, 2016 Niby najprostsze zadanie, ale się namęczyłem strasznie. Mimo że i tak musiałem mocno poszukać w necie starałem się jak najbardziej trzymać materiału, który do tej pory był dostępny i nie zaglądałem do komentarzy choć było blisko rezygnacji . Udało się kod działa jak powinien choć pewnie to jakiś pokrak okrutny Jeśli uda się samemu rozwiązać pozostałe zadania zobaczę dopiero jak to inni rozwiązali. #define dioda 8 //zmienne int odczytanaWartosc = 0; int prog = 0; float napiecie = 0; int nr_petli = 0; void setup() { pinMode(dioda, OUTPUT); //konfiguracja pinu Serial.begin(9600); // start transmisji } void loop() { odczytanaWartosc = analogRead(A5); //przypisanie pinów do zmiennych prog = analogRead(A4); napiecie = odczytanaWartosc *(5.0/1023.0); //funkcja przeliczenie jednostek if(odczytanaWartosc < prog){ //jeśli wartość odczytu mniejsza od ustawionego progu digitalWrite(dioda, HIGH); //zapal światło ++nr_petli; //licz pętle i dodawaj +1 while(odczytanaWartosc < prog && nr_petli<2) { //jeśli warunek spełniony Serial.print(napiecie); // wyślij komunikat o wielkości napięcia Serial.println(" V"); break; // przerwij pętle } } if(odczytanaWartosc > prog){ //jesli wartość odczytu> niż ustawiony próg digitalWrite(dioda, LOW); //wyłącz diodę } delay (100); // czekaj 100ms if(odczytanaWartosc > prog){ //jeśli wartość odczytu > ustawiony próg nr_petli = 0; //wyzeruj licznik pętli } }
Treker (Damian Szymański) Marzec 4, 2016 Udostępnij Marzec 4, 2016 mechanik, su[per gratuluję postępów i życzę powodzenia w dalszej nauce Popracuj jedynie troszkę nad formatowaniem, bo momentami coś się rozjeżdża.
mechanik Marzec 7, 2016 Udostępnij Marzec 7, 2016 Zadanie 4.5, mam nadzieję że trochę lepiej sformatowane. W każdym bądz razie działa bardzo dobrze int wartoscPot = 0; //deklaracje zmiennych int licznikProb = 4; String podanaLiczba = ""; int liczbaZm ; int petla = 0; void setup() { //konfiguracja pinów: pinMode(8, OUTPUT); //zielona pinMode(9, OUTPUT); //żółta pinMode(10, OUTPUT); //czerwona pinMode(5, INPUT_PULLUP); //przycisk Serial.begin(9600); //start transmisji } void loop() { if(petla == 0) //warunek który powodyje wyswietlanie komunikatu tylko na poczatku gry { if (digitalRead(5) == HIGH){ //jesli przycisk nie jest wciśnięty a warunek = zero delay(50); Serial.println("Aby zaczac gre przekrec potencjometr i wcisnij przycisk"); //wyświetl while(digitalRead(5) == HIGH){} //zatrzaśnij program Serial.println("PODAJ LICZBE !!!"); //wyświetl komunikat ++petla; //dodaj 1 do warunku } while(petla == 1) //kiedy warunek = 1 { while(Serial.available() == 0) {} // i nie odebrano zadnych danych zatrzaśnij program if(Serial.available()>0){ //jeśli odebrano dane podanaLiczba = Serial.readStringUntil('\n'); //odczytaj i przypisz do zmiennej podanaLiczba } wartoscPot = analogRead(A5); //odczyt z pinu analogowego przypisz do zmiennej wartoscPot liczbaZm = podanaLiczba.toInt(); //zmiana rodzaju zmiennej z string na int if(wartoscPot - liczbaZm <=50 && wartoscPot - liczbaZm >=-50) //warunek +/- 50 { wartoscPot = liczbaZm; // przypisanie do wartosci na potencjometrze +/- 50 } if(wartoscPot == liczbaZm) //jesli wartosc pot rowna podanej liczbie +/-50 { digitalWrite(8, HIGH); //zapal zieloną digitalWrite(9, LOW); digitalWrite(10, LOW); Serial.println("!!!Gratulacje Wygrales!!!"); //wyslij komunikat o wyganej, czekaj dwie sekundy i zgaś zieloną delay(2000); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); petla = 0; //wyzeruj petle aby zacząc nowa gre licznikProb = 4; // ustaw licznik prob } if(wartoscPot!= liczbaZm ) //jesli wartosc pot rózna od podanej { while(licznikProb != 0 && podanaLiczba.toInt() > 0) //jesli licznik prob rozny od zera i podana liczba została wpisana { --licznikProb; //odejmij jeden z licznika if(licznikProb > 0) //jesli licznik większy od zera { Serial.println("Blad!"); //wyswietl komunikat bledu i zapal zolta diode delay(100); digitalWrite(8, LOW); digitalWrite(9, HIGH); digitalWrite(10, LOW); Serial.print( "Zostaly "); //wyswietl ilosc pozostalych prob Serial.print(licznikProb); Serial.println(" proby! Podaj kolejna liczbe:"); delay(2000); digitalWrite(9, LOW); //zgas zolta } if(licznikProb == 0) //jesli licznik rowny zero { Serial.println("Skonczyly Ci sie proby!"); // wuswietl komunikat } podanaLiczba = ""; //wyczysc dane } } if(licznikProb == 0) //jesli licznik rowny zero, zapal czerwona { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, HIGH); Serial.println("GAME OVER!"); //wyswietl komunikat o zakonczeniu gry delay(4000); digitalWrite(10, LOW); //zgas czerwona petla = 0; //wyzeruj petle licznikProb = 4; //ustaw licznik prob exit; } } } } Zadanie 4.6 Jako że to ostatnie zadanie z tej części, czas przestudiować i porównać Wasze sposoby, ja poradziłęm sobie tak: int fotoL = 0; //deklaracja zmiennych int fotoP = 0; #define czerwonaL 2 //przypisanie pinów #define zoltaL 3 #define niebieska 4 #define zoltaP 5 #define czerwonaP 6 void setup() { Serial.begin(9600); //włączenie transmisji pinMode(czerwonaL, OUTPUT); //ustawienie pinów jako wyjscia pinMode(zoltaL, OUTPUT); pinMode(niebieska, OUTPUT); pinMode(zoltaP, OUTPUT); pinMode(czerwonaP, OUTPUT); } void loop() { fotoL = analogRead(A4); //przypisanie zmiennych do pinów fotoP= analogRead(A5); Serial.print(fotoL); // wyświetlenie wartosci podawanej przez fotorezystory Serial.print(" "); Serial.println(fotoP); delay(1000); fotoL = map(fotoL, 0, 1000, 1, 4); // przeskalowanie wskazań na cztery zakresy fotoP = map(fotoP, 0, 1000, 1, 4); if((fotoL == 1)==(fotoP == 1)) // jeśli nie oswietlamy zadnego z rezystorów, oba wskazania równe i w pierwszym zakresie { digitalWrite(niebieska, HIGH); //zapal niebieską digitalWrite(zoltaL, LOW); digitalWrite(czerwonaL, LOW); } if(fotoP == 2) //jesli wskazania w drugim zakresie: { digitalWrite(niebieska, LOW); digitalWrite(zoltaL, HIGH); //zapal zółtą lewą digitalWrite(czerwonaL, LOW); } if(fotoP == 3) //jesli wskazanie w trzecim: { digitalWrite(niebieska, LOW); digitalWrite(zoltaL, LOW); digitalWrite(czerwonaL, HIGH); //zapal czerwona lewą } else { if((fotoL == 1)==(fotoP == 1)) //JW { digitalWrite(niebieska, HIGH); //zapalona niebieska digitalWrite(zoltaP, LOW); digitalWrite(czerwonaP, LOW); } if(fotoL == 2) { digitalWrite(niebieska, LOW); digitalWrite(zoltaP, HIGH); //zapalona żółta prawa digitalWrite(czerwonaP, LOW); } if(fotoL == 3) { digitalWrite(niebieska, LOW); digitalWrite(zoltaP, LOW); digitalWrite(czerwonaP, HIGH); //zapalona czerwona prawa } } }
Treker (Damian Szymański) Marzec 9, 2016 Udostępnij Marzec 9, 2016 mechanik, teraz wygląda znacznie lepiej, super
RaNo99 Marzec 13, 2016 Udostępnij Marzec 13, 2016 Witam. Dziękuję za wspaniały kurs! Szybkie pytanko: Dlaczego w przykładzie z fotorezystorem musimy stosować dzielnik napięcia? Nie wystarczyłoby podpiąć rezystora między +5V i A5? Wydaje mi się że przy zastosowaniu dzielnika "marnuje się" prąd płynąc z +5 do GND poprzez fotorezystor i rezystor... A i jeszcze takie pytanko, dlaczego akurat rezystor 1K w dzielniku do fotorezystora? Dziękuję i pozdrawiam!
marek1707 Marzec 13, 2016 Udostępnij Marzec 13, 2016 Szybkie pytanko pomocnicze: jaki prąd wpływa do wejścia A5? I kolejne: jak chcesz mierzyć rezystancję fotoopornika nie przepuszczając przez niego prądu? Przecież spadek napięcia U=I*R a dla I=0 → U=0 niezależnie od wartości rezystancji. Z szeregowym fotoopornikiem do plusa wejście ADC zawsze pokaże 5V. Ten prąd dzielnika jest właśnie kosztem pomiaru rezystancji. 1
RaNo99 Marzec 14, 2016 Udostępnij Marzec 14, 2016 Dziękuję za odpowiedź. Wciąż nie mogę tego zrozumieć. Nie wątpię, że to ma sens, a zatem, że masz rację, tylko po prostu tego nie widzę. Odpowiadając na pytanie pomocnicze jak ja to rozumiem: prąd, który wpływa do A5 jest minimalny (regulowany przez "miernik" znajdujący się w A5), ale na tyle duży, by zmierzyć napięcie panujące na A5 i porównać z napięciem referencyjnym +5V. Tu jest różnica napięć spowodowana umieszczonym między A5 a +5V opornikiem. Ten minimalny prąd o którym wspomniałem oraz ta różnica napięć pozwalają obliczyć opór z równania U=I*R. Napisałeś, że z szeregowym fotoopornikiem do plusa wejście ADC zawsze pokaże 5V. Dlaczego na oporniku nie będzie spadku napięcia?
marek1707 Marzec 14, 2016 Udostępnij Marzec 14, 2016 No właśnie dlatego, że wejścia analogowe nie pobierają prądu. Nic do nich nie wpływa, bo ich rezystancja wejściowa jest rzędu 100MΩ a jeśli tak, to nie możesz metodą połączenia szeregowego zmierzyć rezystancji bo nie masz prądu. To tak jakbyś wziął woltomierz (który także z definicji nie pobiera prądu) i podłączył go przez (foto)opornik do baterii. Musisz wymusić przepływ prądu i to robi np. dzielnik napięcia. Prąd płynie od plusa przez jeden rezystor a potem przez drugi (nigdzie nie skręcając ani się nie rozpływając na boki) i do masy. Taki sam prąd w obu rezystorach (przecież to układ szeregowy) powoduje podział napięcia proporcjonalny do stosunku rezystancji. Przetwornikiem A/C mierzysz jedno z tych napięć i znając ich sumę (to +5V) już wiesz jaki jest stosunek rezystancji. Tylko tyle.
Treker (Damian Szymański) Marzec 14, 2016 Udostępnij Marzec 14, 2016 RaNo99, jest dokładnie, tak jak napisał Marek, jeśli masz wątpliwości, co do działania samego dzielnika napięcia, to sprawdź kurs elektroniki: Kurs elektroniki – #3 – prawa Ohma i Kirchhoffa
tomek_321 Marzec 17, 2016 Udostępnij Marzec 17, 2016 zadanie domowe 4.4 nie sprawiło większych problemów. Za to zadanie 4.5 walczyłem 3 dni no i musiałem zaciągnąć dwie podpowiedzi od innych użytkowników. w opisie programu ująłem ściągnięte rzeczy. Zadanie 4.6 będzie w trakcie tylko muszę dokupić czujniki. zad. dom. 4.4 int odebranaWartosc = 0; int regulacjaCujnika = 0; boolean pokaz = false; //stan cujnika float napiecie = 0; // zmiana wartosci czujnika na napiecie void setup() { Serial.begin(9600); pinMode(7, OUTPUT); //np. lampka ktora wlacza sie przyniskim oswietleniu } void loop() { odebranaWartosc = analogRead(A0); //odczyt z czujnika swiatla regulacjaCujnika = analogRead(A5); //odczyt z regulatora progu zaswiecenia napiecie = odebranaWartosc * (5.0/1023.0); //przelicznik z wartosci na napiecie if (odebranaWartosc < regulacjaCujnika) { // odczyt z ADC i Regulacji progu dzialania digitalWrite(7, HIGH); //wlaczenie diody if (pokaz == false) { Serial.print(napiecie); //wyswietlenie napiecia Serial.println("V"); pokaz = true; //zmiana stanu zapamietania } } else { digitalWrite(7, LOW); pokaz = false; } } zad. dom. 4.5 #define zielona 6 #define czerwona 7 #define zolta 8 #define zolta1 9 #define przycisk 10 String podajLiczbe = ""; //wpisywanie liczby int ustawienie = 0; //ustawienie potencjometra byte licznik = 3; //licznik zlych odpowiedzi int podajLiczbe_int = 0; //zamiana liczby String na int boolean sprawdz = true; void setup() { Serial.begin(9600); pinMode(zielona, OUTPUT); pinMode(czerwona, OUTPUT); pinMode(zolta, OUTPUT); pinMode(zolta1, OUTPUT); pinMode(przycisk, INPUT_PULLUP); Serial.println("Oto zasady gry. W pierwszej kolejnosci musisz ustawic potencjometr w dowolym miejscu."); Serial.println("Nastepnie naciskasz przycisk. Podajesz liczbe od 1 do 1021, mozesz pomylic sie o 50. Jezeli "); Serial.println("trafisz to wygrales. Pamietaj masz 3 szase. po kazdej zlej odpowiedzi zapala sie zolta dioda a po "); Serial.println("3 blednej odpowiedzi czerwona. Jak sie zapali czerwona to znaczy ze przegrales."); Serial.println("Zawsze mozesz zaczac od nowa naciskajc przycisk. Zasada jak na poczatku"); Serial.println("POWODZENIA I MILEJ ZABAWY"); } void loop() { if (Serial.available() > 0) { podajLiczbe = Serial.readStringUntil('\n'); //podanie liczby przez uzytkownika i zapisanie jej do pamieci podajLiczbe_int = podajLiczbe.toInt(); //przeksztalcenie liczby string na int Serial.println("twoja Liczba"); //wyswietlenie liczby wpisanej Serial.println(podajLiczbe_int); } ustawienie = analogRead(A0); //zapis ustawienie potencjometra while (digitalRead(przycisk) == LOW) { //weryfikacja czy przycisk zostal wcisniety Serial.println("Podaj liczbe"); //komunikat chyba nie trzeba tlumaczyc delay(2000); licznik = 3; //licznik ilosci prob digitalWrite(zielona, LOW); //stany diod digitalWrite(czerwona, LOW); digitalWrite(zolta, LOW); digitalWrite(zolta1, LOW); sprawdz = true; //ustawienie sprawdzenia na true } if (ustawienie - 50 <= podajLiczbe_int == ustawienie + 50 >= podajLiczbe_int) { //zaciagniety parametr (za chiny nie wiedzialem jak to zrobic:-) jest to ustalenie czy liczba jest z zakresie +-50 z ustawionego ) digitalWrite(zielona, HIGH); //zachowanie przy podani prawidlowej odpowiedzi digitalWrite(zolta, LOW); digitalWrite(zolta1, LOW); Serial.println("brawo wygrales"); Serial.print("liczba ustawiona to "); Serial.println(ustawienie); delay(2000); Serial.println("Ustaw potencjometr i nacisnij przycisk"); podajLiczbe_int = 0; while (digitalRead(przycisk) == HIGH) { //wejscie w petle aby zablokowac program do dalszej pracy czeka na wcisniecie przycisku } } else { sprawdz = false; } if (sprawdz == false && podajLiczbe_int > 0 && licznik == 3) { //bledna odpowiedz i zapalienie 1 diody pom oraz zmiejszenie licznika o 1 digitalWrite(zolta, HIGH); Serial.println("Podana liczba jest zla"); licznik = licznik - 1; Serial.print("posostaly "); Serial.print(licznik); Serial.println(" proby"); podajLiczbe_int = 0; } if (sprawdz == false && podajLiczbe_int > 0 && licznik == 2) { //druga zla odpowiedz zmiejszenie licznika o 1 i zapalenie kolejniej zoltej diody digitalWrite(zolta1, HIGH); licznik = licznik - 1; Serial.print("Zle! Pozostala "); Serial.print(licznik); Serial.println(" proba"); podajLiczbe_int = 0; } else if (sprawdz == false && podajLiczbe_int > 0 && licznik == 1) { //3 nieudana proba podania liczby i zarazem ostatnia digitalWrite(czerwona, HIGH); Serial.println("niestety nie udalo sie"); Serial.println("Nacisnij przycisk aby zaczac jeszcze raz"); podajLiczbe_int = 0; while (digitalRead(przycisk) == HIGH) { //wejscie w petle wymuszajaca aby nie mozna bylo juz nic zrobic i oczekiwanie na wcisniecie przycisku } } }
Sefir Kwiecień 16, 2016 Udostępnij Kwiecień 16, 2016 Cześć, pytanko do zadania 4.6: co mają sygnalizować te diody? Trzy to rozumiem, lewo, środek, prawo, a dwie kolejne? Przód, tył? PS. Mega fajny kurs, ciekawe zadania. Bomba
Treker (Damian Szymański) Kwiecień 18, 2016 Udostępnij Kwiecień 18, 2016 Sefir, cześć, dzięki za miłe słowa W tym zadaniu chodziło o zbudowania wskaźnika z 5 LEDów obok siebie. Jeśli oświetlany jest tylko jeden fotorezystor, to powinna świecić się tylko skrajna dioda, jeśli jesteśmy troszkę bliżej środka, to 4 itd. Powinien wyjść tego wskaźnik, który pokazuje, gdzie jest źródło światła.
Artur Kwiecień 19, 2016 Udostępnij Kwiecień 19, 2016 Witam, mój pierwszy post, kurs mi się bardzo podoba, ciesze się, że zacząłem gdy już wyszły wszystkie części. Mam pytanie do 4.5. Gdy wklepię parę liczb np 5, 332, 132, program zapamiętuje te liczby i gdy wcisnę przycisk uruchamiający grę, odrazu je pobiera i używa jako wybranych do grania. Co zrobić by pobierał je dopiero po wciśnieciu przycisku ? Jakieś czyszczenie cache klawiatury ? A może coś w kodzie nie tak ? #define zielona 10 #define zolta 8 #define czerwona 9 // #define potencjometr A5 #define button 3 int OdczytP = 0; // Odczyt z potencjometru String LiczbaString = ""; // Liczba jako string odebrana z konsoli int OtrzymanaLiczba = 0; // Liczba po konwersji string na int byte licznik = 0; // licznik prób boolean wygrana = 0; // używana jako boolean czy gra trwa czy się skończyła tura void setup() { pinMode(zielona,OUTPUT); pinMode(zolta, OUTPUT); pinMode(czerwona, OUTPUT); pinMode(button, INPUT_PULLUP); Serial.begin(9600); // put your setup code here, to run once: } void loop() { Serial.println(" \n Grasz? Wcisnij przycisk i podaj liczbe na jakiej wg Ciebie stanal potencjometr "); wygrana = 0; delay(50); while( digitalRead(button) == HIGH) { delay(50); // tych delay nie jestem pewien gdzie i kiedy wstawiać by nie było zakłoceń czy wielokrotnych wciśnieć } if (digitalRead(button) == LOW) { // Jesli wcisnieto przycisk, zaczynamy gre digitalWrite(zielona, LOW); digitalWrite(czerwona, LOW); // wygaszenie diod, dla nastepnych tur digitalWrite(zolta, LOW); delay(150); while ( wygrana == 0) { // Dopoki gracz nie wygra lub nie skoncza mu sie proby Serial.print("Podaj liczbe "); // bez nowej lini OdczytP = analogRead(potencjometr); // Odczyt potencjometr while(Serial.available() <= 0) {} // oczekiwanie na konsole, zatrzymanie do czasu podania liczby if (Serial.available() > 0) { LiczbaString = ""; // zeruje na wszelki wypadek LiczbaString = Serial.readStringUntil('\n'); // odczyt liczby z konsoli OtrzymanaLiczba = LiczbaString.toInt(); // konwersja na liczbe int Serial.println(OtrzymanaLiczba); // Wyswietlenie podanej liczby obbok słów "Podaj liczbe" if ((OdczytP - 50 < OtrzymanaLiczba) && ( OtrzymanaLiczba < OdczytP + 50)) { // Sprawdzenie czy liczba się miesci w zakresie if (digitalRead(zolta) == HIGH) { // jesli zotla dioda sie swieci np dwa razy bledne zgadniecie digitalWrite(zolta,LOW); delay(200); digitalWrite(zolta, HIGH); // wodotryski delay(200); digitalWrite(zolta, LOW); delay(200); } digitalWrite(zielona,HIGH); // Podswietlenie wygrywajacej diody Serial.println(" Wygrałeś"); licznik = 0; // zerowanie licznika prob wygrana = 1; // boolean, koniec tury } else { digitalWrite(zielona,LOW); digitalWrite(czerwona,LOW); licznik = licznik + 1; if (licznik == 1) { Serial.println("Masz jeszcze 2 proby"); digitalWrite(zolta, HIGH); // pierwszy blad, zapala sie żółta dioda } if (licznik == 2) { Serial.println("Masz jeszcze jedna probe"); digitalWrite(zolta,LOW); delay(100); digitalWrite(zolta, HIGH); // drugi błąd, migniecie dioda } if (licznik == 3) { digitalWrite(zolta,LOW); delay(200); digitalWrite(zolta, HIGH); // wodotryski delay(200); digitalWrite(zolta, LOW); delay(200); digitalWrite(zielona,LOW); digitalWrite(czerwona,HIGH); // przegrana, wygaszenie diod, zapalanie czerwonej Serial.print("Przegrales, liczba to "); Serial.println(OdczytP); // Wyswietlenie wyniku wygrana = 1; // boolean, koniec tury licznik = 0; } } } } } // put your main code here, to run repeatedly: }
Treker (Damian Szymański) Kwiecień 19, 2016 Udostępnij Kwiecień 19, 2016 Artur, witam na forum Zacznijmy od początku. Czego oczekujesz po działaniu poniższego fragmentu? while( digitalRead(button) == HIGH) { delay(50); // tych delay nie jestem pewien gdzie i kiedy wstawiać by nie było zakłoceń czy wielokrotnych wciśnieć } Daj znać, jaki jest Twój zamiar, to ruszymy dalej
Pomocna odpowiedź
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ę »