Treker 3 074 Luty 12, 2019 Udostępnij Luty 12, 2019 @wmaker, dziękuję za zgłoszenie - już poprawione Cytuj Link to post Share on other sites
eMECHANiK 0 Lipiec 31, 2019 Udostępnij Lipiec 31, 2019 (edytowany) Wydaje mi się, że jest niewielki błąd treści kodu w stosunku do grafiki. W kodzie jest napisane, iż wpinamy się buzzerem do pinu nr3, natomiast w grafice zielony kabelek idzie do pinu nr 2. Pozdrawiam. Edytowano Lipiec 31, 2019 przez Treker Usunięcie zbędnego taga. Cytuj Link to post Share on other sites
Treker 3 074 Lipiec 31, 2019 Udostępnij Lipiec 31, 2019 @eMECHANiK słusznie! Gratuluję spostrzegawczości - już poprawione Cytuj Link to post Share on other sites
Neko 1 Wrzesień 29, 2019 Udostępnij Wrzesień 29, 2019 Bardzo chaotyczne ale działające rozwiązanie 9.1: int figura = ""; //deklaracja zmiennej do rozpoznawania figur String wymiar1 = ""; //zmienna wymiarowa String wymiar2 = ""; //zmienna wymiarowa 2 int wynik = 0; int kwadrat (int a){ //liczenie pola kwadratu wynik= a*a; return wynik; } int prostokat (int a, int b){ //liczenie pola prostokata wynik = a*b; return wynik; } int kolo (int r){ //liczenie pola kola wynik = 3.14*r*r; return wynik; } int trojkat (int a, int h){ //liczenie pola trojkata wynik = (a*h)/2; return wynik; } void setup() { Serial.begin(9600); //rozpoczecie transmisji Serial.println("podaj figure"); //napis powitalny Serial.print("kwadrat (k) \t"); Serial.print("prostokat (p) \t"); Serial.print("kolo (o) \t"); Serial.print("trojkat (t) \n"); } void loop() { if (Serial.available()>0){ //sprawdzenie czy sa dane wyslane figura=Serial.read(); //zapisanie ich do rozpoznania switch (figura){ case 'k': //jezeli jest to k Serial.println("podaj dlugosc boku"); delay(2000); //oczekiwanie na dlugosc boku if (Serial.available()>0){ //jezeli jest podana wymiar1=Serial.readStringUntil('\n'); //zapisanie wymiaru boku wynik = kwadrat (wymiar1.toInt()); //obliczanie wyniku Serial.println(wynik); //wyswietlenie wyniku }else{ //jesli nie uda sie wpisac boku Serial.println("Masz 2 sekundy na podanie boku"); Serial.println ("Spróbuj ponownie"); } break; case 'p': //jezeli p Serial.println("podaj dlugosc boku a"); delay(2000); //oczekiwanie na pierwszy bok if (Serial.available()>0){ wymiar1=Serial.readStringUntil('\n'); //zapisanie go jako wymiar 1 } Serial.println("podaj dlugosc boku b"); delay(2000); // oczekiwanie na drugi bok if (Serial.available()>0){ wymiar2=Serial.readStringUntil('\n'); //zapisanie go jako wymiar2 wynik = prostokat(wymiar1.toInt(), wymiar2.toInt()); Serial.println(wynik); //wyswietlenie wyniku }else{ //jesli nie uda sie podac bokow Serial.println("Masz 2 sekundy na podanie boku"); Serial.println ("Spróbuj ponownie"); } break; case 'o': //jesli wybrano kolo o Serial.println("podaj promien"); delay(2000); //oczekiwanie na promien if (Serial.available()>0){ wymiar1=Serial.readStringUntil('\n'); //zapisanie promienia pod wymiar1 wynik = kolo (wymiar1.toInt()); Serial.println(wynik);//wyswietlenie wyniku }else{ //jesli nie uda sie podac promienia Serial.println("Masz 2 sekundy na podanie promienia"); Serial.println ("Spróbuj ponownie"); } break; case 't': //jesli wybrano trojkat Serial.println("podaj dlugosc boku a"); delay(2000); //oczekiwanie na bok if (Serial.available()>0){ wymiar1=Serial.readStringUntil('\n'); //zapisanie pod zmienna wymiar1 } Serial.println("podaj wysokosc h"); delay(2000); //oczekiwanie na wysokosc if (Serial.available()>0){ wymiar2=Serial.readStringUntil('\n'); //zapisanie wysokosci pod zmienna wymiar2 wynik = trojkat(wymiar1.toInt(), wymiar2.toInt()); Serial.println(wynik); //wyswietlenie wyniku }else{ //jesli sie nie uda odac wymiarow Serial.println("Masz 2 sekundy na podanie boku"); Serial.println ("Spróbuj ponownie"); } break; } } } 1 Cytuj Link to post Share on other sites
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
Treker 3 074 Wrzesień 29, 2019 Udostępnij Wrzesień 29, 2019 @Neko witam na forum! Faktycznie, wiele w tym programie się dzieje, ale najważniejsze, że działa. Powodzenia podczas dalszych eksperymentów z Arduino Cytuj Link to post Share on other sites
Itap88 3 Listopad 9, 2019 Udostępnij Listopad 9, 2019 @Neko Tak sobie czytam Twój kod i... Dnia 29.09.2019 o 09:36, Neko napisał: int figura = ""; //deklaracja zmiennej do rozpoznawania figur String wymiar1 = ""; //zmienna wymiarowa String wymiar2 = ""; //zmienna wymiarowa 2 int wynik = 0; Zaraz... Skoro wynik jest zmienną globalną... Dnia 29.09.2019 o 09:36, Neko napisał: int kwadrat (int a){ //liczenie pola kwadratu wynik= a*a; return wynik; } ...to po co funkcja zwraca wartość zmiennej wynik... Dnia 29.09.2019 o 09:36, Neko napisał: wynik = kwadrat (wymiar1.toInt()); //obliczanie wyniku ...do zmiennej wynik!? Dnia 29.09.2019 o 09:36, Neko napisał: Serial.println("podaj dlugosc boku"); delay(2000); //oczekiwanie na dlugosc boku if (Serial.available()>0){ //jezeli jest podana A zamiast tego fragmentu o wiele łatwiej użyć pauzy pętlą while: Serial.println("Podaj dlugosc boku"); while(Serial.available()<=0){ //czekanie na odpowiedź 2 Cytuj Link to post Share on other sites
Dami12250 0 Grudzień 28, 2019 Udostępnij Grudzień 28, 2019 (edytowany) Hej Chciałem zrobić prosty program który miałby za zadanie po kliknięciu przycisku zamigać diodą, piknąć buzzerem, odczytać pomiar z czujnika odległości i wyświetlić go w cm na LCD. Problem w tym że na wyświetlaczu nic się nie ukazuje. Sprawdzałem kilka razy czy wszystko jest dobrze napisane w kodzie i czy jest dobrze podłączone Postanowiłem sprawdzić czy kod jest poprawny więc dopisałem: Serial.print(dystans); Serial.println(" cm"); Włączyłem monitor portu szeregowego i normalnie pokazywały się wyniki w cm. Czy to możliwe, że wyświetlacz się przepalił lub uszkodził? To jest kod programu: //Biblioteki #include<LiquidCrystal.h> LiquidCrystal lcd(8,9,10,11,12,2); //definiowanie pinów #define ziel 3 #define klik 6 #define pik 7 #define trig 5 #define echo 4 //zmienne int czas1 = 100; long czas, dystans; void setup() { // konfiguracja wejść i wyjść pinMode(pik, OUTPUT); pinMode(klik, INPUT_PULLUP); //diody pinMode(ziel, OUTPUT); //odległościomierz pinMode(trig, OUTPUT); pinMode(echo, INPUT); //LCD Serial.begin(9600); } void loop() { if(digitalRead(klik) == LOW) { //buzzer przez 100 setnych digitalWrite(pik, HIGH); delay(100); digitalWrite(pik, LOW); zamigaj2LED (); //zmierz odległość digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); czas = pulseIn(echo, HIGH); dystans = czas / 58; lcd.begin(16,2); lcd.print(dystans); lcd.println(" cm"); Serial.print(dystans); Serial.println(" cm"); } while(digitalRead(klik) == LOW) {} } // własne argumenty void zamigaj2LED() { digitalWrite(ziel, HIGH); delay(czas1); digitalWrite(ziel, LOW); delay(czas1); digitalWrite(ziel, HIGH); delay(czas1); digitalWrite(ziel, LOW); delay(czas1); } PS: w ostatnim projekcie miałem też problemy z wyświetlaczem i pisałem tu na forum. Edytowano Grudzień 28, 2019 przez Dami12250 Cytuj Link to post Share on other sites
Treker 3 074 Grudzień 29, 2019 Udostępnij Grudzień 29, 2019 Aby nie robić zamieszania usunąłem posty, które pojawiły się zanim edytowałeś swój post 17 godzin temu, Dami12250 napisał: Czy to możliwe, że wyświetlacz się przepalił lub uszkodził? @Dami12250 w takiej sytuacji warto byłoby odstawić na chwilę gotowy program i zwyczajnie sprawdzić czy LCD działa. Próbowałeś wgrać najprostszy kod, który testuje tylko LCD? Warto wyrobić sobie taki nawyk, bo dzięki temu od razu sprawdzasz czy wyświetlacz działa i czy jest poprawnie podłączony. Co więcej, od razu masz wtedy wskazówkę, że jeśli LCD działa osobno to znaczy, że problemem jest reszta programu i np. mogą gryźć się jakieś biblioteki Cytuj Link to post Share on other sites
bakardi92 5 Styczeń 6, 2020 Udostępnij Styczeń 6, 2020 (edytowany) zadanie 9.3 - czy są sposoby aby ładniej zapisać ten długi kod z funkcji void wskaznik? pomijam opcję z pętlą for która zapala piny a następnie wszystkie gasi i tak w kółko. #define trigger 12 #define echo 11 void setup() { pinMode(trigger, OUTPUT); pinMode(echo, INPUT); Serial.begin(9600); pinMode(2, OUTPUT); for (int i = 10; i > 5; i--) { pinMode(i, OUTPUT); } } void loop() { wskaznik(); delay(25); } int odleglosc() { int czas = 0; digitalWrite(trigger, LOW); delayMicroseconds(2); digitalWrite(trigger, HIGH); delayMicroseconds(10); digitalWrite(trigger, LOW); czas = pulseIn(echo, HIGH); czas = czas / 58.0; return czas; } void wskaznik() { if (odleglosc() < 50) { digitalWrite(10, HIGH); digitalWrite(9, HIGH); digitalWrite(8, HIGH); digitalWrite(7, HIGH); digitalWrite(6, HIGH); } else if (odleglosc() < 100) { digitalWrite(10, LOW); digitalWrite(9, HIGH); digitalWrite(8, HIGH); digitalWrite(7, HIGH); digitalWrite(6, HIGH); } else if (odleglosc() < 150) { digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, HIGH); digitalWrite(7, HIGH); digitalWrite(6, HIGH); } else if (odleglosc() < 200) { digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, LOW); digitalWrite(7, HIGH); digitalWrite(6, HIGH); } else if (odleglosc() < 250) { digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, HIGH); } else { digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, LOW); } } Zadanie 9.1 bool blokadastart=0; // blokada pierwszego if'a int wybor=0; // deklarowanie wyboru obliczenia int a=0; // pole prostokata int b=0; float aa=0; // pole trojkata zmienne float h=0; float r=0; // pole kola float wynik=0; void setup(){ Serial.begin(9600); } void loop(){ if (blokadastart==0){ Serial.println("Wybierz ktore pole chcesz obliczyc"); Serial.println("Pole kwadratu wcisnij 1"); Serial.println("Pole prostokata wcisnij 2"); Serial.println("Pole trojkata wcisnij 3"); Serial.println("Pole kola wcisnij 4"); blokadastart=1; } if (Serial.available()>0){ String zmienna=Serial.readStringUntil('\n'); wybor=zmienna.toInt(); } switch(wybor){ case 1: // pole kwadratu Serial.println("Wybrales pomiar pola kwadratu"); Serial.println("Podaj wymiar boku a"); while (Serial.available()==0){} if (Serial.available()>0){ String dane=Serial.readStringUntil('\n'); int a=dane.toInt(); Serial.print("Podany wymiar: "); Serial.println(a); int wynik=polekwardaru(a); Serial.print("Pole powierzchni kwadratu wynosi: "); Serial.println(wynik); } blokadastart=0; wybor=0; break; case 2: //pole prostokata Serial.println("Wybrales pomiar pola prostokata"); Serial.println("Podaj wymiar boku a"); while (Serial.available()==0){} if (Serial.available()>0){ String dane=Serial.readStringUntil('\n'); a=dane.toInt(); Serial.print("Podany wymiar boku a: "); Serial.println(a); } Serial.println("Teraz prosze podac wymiar boku b"); while (Serial.available()==0){} if (Serial.available()>0){ String dane=Serial.readStringUntil('\n'); b=dane.toInt(); Serial.print("Podany wymiar boku b: "); Serial.println(b); int wynik=prostokatpole(a,b); Serial.print("Pole powierzchni prostokatu wynosi: "); Serial.println(wynik); } blokadastart=0; wybor=0; break; case 3: //pole trojkata Serial.println("Podaj wymiar podstawy a"); while (Serial.available()==0){} if (Serial.available()>0){ String dane=Serial.readStringUntil('\n'); aa=dane.toInt(); Serial.print("Wartosc podstawy to: "); Serial.println(aa); } Serial.println("Podaj wysokosc trojkata"); while (Serial.available()==0){} if (Serial.available()>0){ String dane=Serial.readStringUntil('\n'); h=dane.toInt(); Serial.print("Wartosc wysokosci to: "); Serial.println(h); } wynik=poletrojkata(aa,h); Serial.print("Pole powierzchni prostokata wynosi: "); Serial.println(wynik); blokadastart=0; wybor=0; break; case 4: //pole kola Serial.println("Wybrales pomiar powierzchni kola"); Serial.println("Podaj wartosc promienia kola"); while(Serial.available()==0){} if (Serial.available()>0){ String dane=Serial.readStringUntil('\n'); r=dane.toInt(); float wynik=polekola(r); Serial.print("pole kola: "); Serial.println(wynik); } blokadastart=0; wybor=0; break; } // zakonczenie funkcji switch case } // zakonczenie void loop // funkcje int polekwardaru (int a){ int wynik=a*a; return wynik; } int prostokatpole (int a, int b){ //funkcja na pole pow. prostokatu int wynik=a*b; //zmienna lokalna wynik return wynik; // wynik dzialania ktore pokaze zmienna int wynik } float poletrojkata (float a, float h){ //funkcja na pole trojkata float wynik=0.5*(a*h); //zmienna lokalna wynik return wynik; // wynik dzialania pole trojkata } float polekola (float r){ //funkcja na pole kola float wynik=PI*(r*r); //zmienna lokalna wynik return wynik; // wynik dzialania pole kola } Jest haos, są zmienne globalne i zmienne lokalne które nazywają się tak samo a mimo wszystko program działa. Pisany w 100% przeze mnie ale logicznie nie umiem wyjaśnić dlaczego działa. Dlatego w mojej głowie pojawiły się poytanie dotyczące zmiennych i to gdzie są one widoczne w trakcie trwania programu @Treker czy mógłbyś trochę rozjaśnić moją niepewność dotyczącą tych zmiennych? Edytowano Styczeń 6, 2020 przez bakardi92 Cytuj Link to post Share on other sites
Dami12250 0 Styczeń 6, 2020 Udostępnij Styczeń 6, 2020 Może funkcja case break? Cytuj Link to post Share on other sites
Treker 3 074 Styczeń 7, 2020 Udostępnij Styczeń 7, 2020 @bakardi92 popracuj trochę nad nazewnictwem zmiennych, bo nazywanie ich "a", "aa" to raczej zły pomysł. Szybko się pomylisz, a do tego nie wiadomo co one oznaczają. Jeśli chodzi o widoczność zmiennych to: zmienne globalne widoczne są wszędzie - dosłownie w całym programie. Zmienne zadeklarowane wewnątrz danej funkcji będą widoczne tylko w danej funkcji. Cytuj Link to post Share on other sites
BHBmacieg 26 Luty 11, 2020 Udostępnij Luty 11, 2020 Cześć, piszę sobie zadanie 9.1 i mam mały problem. Z jakiegoś powodu nie działa mi poprawnie warunek switch.. case... Otóż poprawnie wykonuje się tylko "pierwszy" case wyszczególniony w kodzie. Przy wpisaniu litery odpowiedzialnej za drugi case program jakby starował od nowa i znów prosi o podanie litery. Prześledziłem kod parę razy ale nie widzę błędu. Może "cudze oko" wyłapie gdzie coś jest nie tak. Wysyłam kod: int figura = ""; //odczytanie jaka figure chcemy wyliczyc String dlugoscBoku1 = ""; //zmienna dla dlugosci boku podana int dlugoscBoku1INT = 0; //zmienan dla dlugosic boku INT String dlugoscBoku2 = ""; //zmienna dla dlugosci boku podana int dlugoscBoku2INT = 0; //zmienan dla dlugosic boku INT String promien = ""; //zmienna dla promienia podana int promienINT = 0; //zmienna dla promienia String wysokosc = ""; //zmienan dla wysokosci podana int wysokoscIN = 0; //zmienna dla wysokosci void setup() { Serial.begin(9600); //rozpoczecie komunikacji z pc } void loop() { Serial.println("Pole jakiej figury checsz obliczyc? Prostokąt - p, Koło - k, Trójkąt - t"); //zapytanie jaka figure chcemy obliczyc czekaj(); if (Serial.available() > 0) { //jesli uzytkownik podal cos z klawiatury figura = Serial.read(); } switch (figura) { case 'k': //jesli uzytkownik chce obliczyc pole kola Serial.println("Podaj długość promienia."); czekaj(); if (Serial.available() > 0) { promien = Serial.readString(); promienINT = promien.toInt(); } double poleKolo = kolo(promienINT); Serial.println("Pole twojego koła to: " + String(poleKolo) + " [mm^2]"); break; case 'p': //jesli uzytkownik chce obliczyc pole prostokąta Serial.println("Podaj długość pierwszego boku."); czekaj(); if (Serial.available() > 0) { dlugoscBoku1 = Serial.readStringUntil('\n'); dlugoscBoku1INT = dlugoscBoku1.toInt(); } Serial.println("Podaj długość drugiego boku."); czekaj(); if (Serial.available() > 0) { dlugoscBoku2 = Serial.readString(); dlugoscBoku2INT = dlugoscBoku2.toInt(); } int poleProstokat = prostokat(dlugoscBoku1INT, dlugoscBoku2INT); Serial.println("Pole twojego prostokąta to: " + String(poleProstokat) + " [mm^2]"); break; default: Serial.println("podałeś złą literę!"); break; } } int prostokat(int a, int b) { //funkcja odpowiedzialna za obliczanie pola kwardratu int poleProstokat = 0; poleProstokat = a * b; return poleProstokat; } double kolo(double r) { //funkcja odpowiedzialna za obliczanie pola kola double poleKolo = 0; poleKolo = 3.14 * r * r; return poleKolo; } double trojkat(double a, double h) { //funkcja odpowiedzialna za obliczanie pola trojkata double poleTrojkat = 0; poleTrojkat = 0.5 * a * h; return poleTrojkat; } void czekaj() { while (Serial.available() == 0) { delay(50); } } Cytuj Link to post Share on other sites
Gieneq 1 794 Luty 12, 2020 Udostępnij Luty 12, 2020 Takie podwójne zagnieżdżenie odczytywania znaków może być mylące. Na razie spróbuj dać blokujące pętle przy oczekiwaniu na podanie argumentów. Pierwszą tego typu pętlę masz na zewnątrz switch - case (pętla loop), gdzie jak coś się pojawi to przetwarzasz te dane. Możesz np. zamienić if na while i sprawdzać czy String jest niepusty i kończy się znakiem nowej linii (pamiętaj żeby mieć ustawione to w monitorze portu szeregowego). Ale najlepiej jakbyś dał odczytywanie portu szeregowego tylko w jednym miejscu i przetwarzanie tego co z niego przyjdzie. Zamiast wpadania w pętle możesz dać zmienne określające stan, np. teraz przetwarzamy dane dotyczące koła, to zmienna int tryb = 0.... itp. Cytuj Link to post Share on other sites
BHBmacieg 26 Luty 12, 2020 Udostępnij Luty 12, 2020 Pogrzebałem trochę, przeszedłem z funkcji switch case na zwykłe funkcje warunkowe if i o dziwo działa bez problemu. Wygląda tak jakby nie podwójne zagnieżdżanie odczytywania znaków było problemem. W wolnej chwili postaram się wrócić do switch case i naprawić kod tak aby działał poprawnie. Póki co prace domowe: 9.1. Obliczanie pola powierzchni wybranej figury String figura = ""; //odczytanie jaka figure chcemy wyliczyc String dlugoscBoku1 = ""; //zmienna dla dlugosci boku podana int dlugoscBoku1INT = 0; //zmienan dla dlugosic boku INT String dlugoscBoku2 = ""; //zmienna dla dlugosci boku podana int dlugoscBoku2INT = 0; //zmienan dla dlugosic boku INT String promien = ""; //zmienna dla promienia podana int promienINT = 0; //zmienna dla promienia String wysokosc = ""; //zmienan dla wysokosci podana int wysokoscINT = 0; //zmienna dla wysokosci void setup() { Serial.begin(9600); //rozpoczecie komunikacji z pc } void loop() { Serial.println("Pole jakiej figury checsz obliczyc? Prostokąt - p, Koło - k, Trójkąt - t"); //zapytanie jaka figure chcemy obliczyc czekaj(); if (Serial.available() > 0) { //jesli uzytkownik podal cos z klawiatury figura = Serial.readStringUntil('\n'); } if (figura == "k") { //jesli wybieramy koło Serial.println("Podaj długość promienia."); //prosimy użytkownika o podanie długości promienia czekaj(); if (Serial.available() > 0) { //odczytanie wartości podanej przez użytkownika promien = Serial.readStringUntil('\n'); promienINT = promien.toInt(); } double poleKolo = kolo(promienINT); //obliczenie pola za pomocą funkcji Serial.println("Pole twojego koła to: " + String(poleKolo) + " [mm^2]"); } else if (figura == "p") { //jesli wybieramy prostokąt Serial.println("Podaj długość pierwszego boku."); //prosimy o podanie długości pierwszego boku czekaj(); if (Serial.available() > 0) { //odczytanie wartości podanej przez użytkownika dlugoscBoku1 = Serial.readStringUntil('\n'); dlugoscBoku1INT = dlugoscBoku1.toInt(); } Serial.println("Podaj długość drugiego boku."); czekaj(); if (Serial.available() > 0) { //odczytanie wartosci podanej przez użytkownika dlugoscBoku2 = Serial.readStringUntil('\n'); dlugoscBoku2INT = dlugoscBoku2.toInt(); } int poleProstokat = prostokat(dlugoscBoku1INT, dlugoscBoku2INT); //obliczenie pola za pomocą funkcji Serial.println("Pole twojego prostokąta to: " + String(poleProstokat) + " [mm^2]"); } else if (figura == "t") { //jesli wybieramy trójkąt Serial.println("Podaj wysokość."); //prosimy użytkownika o podanie wysokości czekaj(); if (Serial.available() > 0) { //odczytanie wartości podanej przez użytkownika wysokosc = Serial.readStringUntil('\n'); wysokoscINT = wysokosc.toInt(); } Serial.println("Podaj dlugość podstawy."); czekaj(); if (Serial.available() > 0) { //odczytanie wartosci podanej przez użytkownika dlugoscBoku1 = Serial.readStringUntil('\n'); dlugoscBoku1INT = dlugoscBoku1.toInt(); } double poleTrojkat = trojkat(dlugoscBoku1INT, wysokoscINT); //obliczenie pola za pomoca funkcji Serial.println("Pole twojego trójkąta to: " + String(poleTrojkat) + " [mm^2]"); } else { Serial.println("Podałeś zły argument!"); } } int prostokat(int a, int b) { //funkcja odpowiedzialna za obliczanie pola kwardratu int poleProstokat = 0; poleProstokat = a * b; return poleProstokat; } double kolo(double r) { //funkcja odpowiedzialna za obliczanie pola kola double poleKolo = 0; poleKolo = 3.14 * r * r; return poleKolo; } double trojkat(double a, double h) { //funkcja odpowiedzialna za obliczanie pola trojkata double poleTrojkat = 0; poleTrojkat = 0.5 * a * h; return poleTrojkat; } void czekaj() { while (Serial.available() == 0) { delay(50); } } 9.2. program z funkcją umożliwiającą zdefiniowanie pinu, na którym znajduje się dioda, czas przez jaki dioda ma świeci, czas przez jaki dioda ma być wyłączona oraz ile razy sekwnencja ma się powtórzyć. void setup() { zamigajLED(3, 2000, 1000, 5); zamigajLED(13, 2000, 1000, 5); } void loop() { } void zamigajLED(int PIN, int czasWlaczenia, int czasWylaczenia, int ile) { pinMode(PIN, OUTPUT); //konfiguracja pinu wyjscia for (int a = 0; a < ile; a++) { digitalWrite(PIN, HIGH); // zapalenie diody delay(czasWlaczenia); //wlaczenie na okreslony czas digitalWrite(PIN, LOW); //wylaczenie diody delay(czasWylaczenia); //wylaczenie na okreslony czas } } 9.3. Tutaj zbudowałem sobie prosty czujnik parkowania. Użyłem tutaj również buzzera, którego częstotliwość pikania jest zależna od odległości w jakiej znajduje się przedmiot. #define czerwona1 3 #define czerwona2 2 #define zolta1 5 #define zolta2 4 #define zielona1 7 #define zielona2 6 #define buzzer 8 #define echo 11 #define trigger 12 void setup() { pinMode(czerwona1, OUTPUT); //deklaracja pinów dla ledów pinMode(czerwona2, OUTPUT); pinMode(zolta1, OUTPUT); pinMode(zolta2, OUTPUT); pinMode(zielona1, OUTPUT); pinMode(zielona2, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(echo, INPUT); pinMode(trigger, OUTPUT); Serial.begin(9600); //rozpoczęcie komunikacji z PC } void loop() { if (zmierzOdleglosc() > 60) { //jesli powyzej metra diod0(); //wywołaj funkcje diod0 } else if ((zmierzOdleglosc() <= 60) && (zmierzOdleglosc() > 50)) { //jesli odleglosc w pierwszym zakresie diod1(); } else if ((zmierzOdleglosc() <= 50) && (zmierzOdleglosc() > 40)) { //jesli odlegosc w drugim zakresie diod2(); } else if ((zmierzOdleglosc() <=40) && (zmierzOdleglosc() > 30)) { //jesli odlegloscw trzecim zakresie diod3(); } else if ((zmierzOdleglosc() <= 30) && (zmierzOdleglosc() > 20)) { //jesli odlegosc w czwartym zakresie diod4(); } else if ((zmierzOdleglosc() <= 20) && (zmierzOdleglosc() > 10)) { //jesli odlegosc w piatym zakresie diod5(); } else if (zmierzOdleglosc() <= 10) { //jeśli odległość w szóstym zakresie diod6(); } delay(100); } void pikanieBuzzera(int czas) { //funkcja odpowiedzialna za pikanie buzzera digitalWrite(buzzer, HIGH); delay(czas); digitalWrite(buzzer, LOW); delay(czas); } void diod0() { //wszystkie zgaszone digitalWrite(zielona1, LOW); digitalWrite(zielona2, LOW); digitalWrite(zolta1, LOW); digitalWrite(zolta2, LOW); digitalWrite(czerwona1, LOW); digitalWrite(czerwona2, LOW); } void diod1() { //jedna zielona digitalWrite(zielona1, HIGH); digitalWrite(zielona2, LOW); digitalWrite(zolta1, LOW); digitalWrite(zolta2, LOW); digitalWrite(czerwona1, LOW); digitalWrite(czerwona2, LOW); } void diod2() { //dwie zielone digitalWrite(zielona1, HIGH); digitalWrite(zielona2, HIGH); digitalWrite(zolta1, LOW); digitalWrite(zolta2, LOW); digitalWrite(czerwona1, LOW); digitalWrite(czerwona2, LOW); pikanieBuzzera(1000); } void diod3() { //dwie zielone, jedna zolta digitalWrite(zielona1, HIGH); digitalWrite(zielona2, HIGH); digitalWrite(zolta1, HIGH); digitalWrite(zolta2, LOW); digitalWrite(czerwona1, LOW); digitalWrite(czerwona2, LOW); pikanieBuzzera(600); } void diod4() { //dwie zielone, dwie zolte digitalWrite(zielona1, HIGH); digitalWrite(zielona2, HIGH); digitalWrite(zolta1, HIGH); digitalWrite(zolta2, HIGH); digitalWrite(czerwona1, LOW); digitalWrite(czerwona2, LOW); pikanieBuzzera(400); } void diod5() { //dwie zielone, dwie zolte, jedna czerwona digitalWrite(zielona1, HIGH); digitalWrite(zielona2, HIGH); digitalWrite(zolta1, HIGH); digitalWrite(zolta2, HIGH); digitalWrite(czerwona1, HIGH); digitalWrite(czerwona2, LOW); pikanieBuzzera(150); } void diod6() { //wszystkie digitalWrite(zielona1, HIGH); digitalWrite(zielona2, HIGH); digitalWrite(zolta1, HIGH); digitalWrite(zolta2, HIGH); digitalWrite(czerwona1, HIGH); digitalWrite(czerwona2, HIGH); digitalWrite(buzzer, HIGH); } int zmierzOdleglosc() { //funkcja do pomiaru odległosci long czas, dystans; //deklaracja zmiennych digitalWrite(trigger, LOW); delayMicroseconds(2); digitalWrite(trigger, HIGH); delayMicroseconds(10); digitalWrite(trigger, LOW); czas = pulseIn(echo, HIGH); //odczytanie czasu potrzebnego na odbicie i powrot dźwięku dystans = czas / 58; //przeliczenie czasu na dystans return dystans; } Film z działania czujnika: Zestaw do drugiej części kursu już leży i czeka na swoją kolej 2 Cytuj Link to post Share on other sites
Gieneq 1 794 Luty 12, 2020 Udostępnij Luty 12, 2020 Faktycznie ładnie wykonałeś zadania domowe, tak trzymaj powodzenia w drugiej części kursu! 1 Cytuj Link to post Share on other sites
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!