Skocz do zawartości

jogaszu

Użytkownicy
  • Zawartość

    7
  • Rejestracja

  • Ostatnio

Reputacja

4 Neutralna

O jogaszu

  • Ranga
    2/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. oto wynik mojego dłubania zad 7,4: #include <LiquidCrystal.h> //Dołączenie bilbioteki #define przycisk1 8 //podpiecie przycisku start #define przycisk2 9 ////podpiecie przycisku stop LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza byte godziny = 0; //przechowuje godziny byte minuty = 0 ; //minuty byte sekundy = 0; //sekundy byte pozycjaSekund = 7; byte pozycjaMinut = 4; byte pozycjaGodzin = 1; bool czyWcisnieto1 = 0; //flaga czy wciśnieto przycisk 1 bool czyWcisnieto2 = 0; //flaga czy wciśnieto przycisk 2 void setup() { pinMode (przycisk1, INPUT_PULLUP); pinMode (przycisk2, INPUT_PULLUP); lcd.begin(16, 2); //Deklaracja typu lcd.clear(); lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("STOPER"); lcd.setCursor(0, 1); lcd.print("00:00:00"); } void loop() { while (digitalRead(przycisk1) == HIGH) { } //zatrzymanie w pustej petli na poczatek if (digitalRead (przycisk1) == LOW) { //jak wcisniesz przycisk 1 czyWcisnieto1 = 1; //flaga inforuje ze wcisnieto przycisk 1 lcd.clear(); //ustawienie poczatkowe ekranu (i po kazdym wcisnieciu przycisku 1) lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("STOPER"); lcd.setCursor(0, 1); lcd.print("00:00:00"); } while (czyWcisnieto1 == 1) { //jak juz wcisnieto przycisk to wpadnij w petle dopuki flaga czyWcisnieto1 bedzie 1 lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("AKTUALNY CZAS"); lcd.setCursor(pozycjaGodzin, 1); lcd.print(godziny); lcd.setCursor(pozycjaMinut, 1); lcd.print(minuty); lcd.setCursor(pozycjaSekund, 1); lcd.print(sekundy); sekundy++; //naliczanie sekund if (sekundy == 10) { //jezeli sekundy przechodza do 2 cyfr, przesuniecie wyswietlania pozycjaSekund--; } if (sekundy == 60) { //jezeli mija 60s trzeba wyzerowac sekundy i naliczyc godziny sekundy = 0; minuty++; lcd.setCursor(pozycjaSekund, 1); lcd.print("00"); pozycjaSekund = 7 ; } if (minuty == 10) { //jezeli minuty przechodza do 2 cyfr, przesuniecie wyswietlania pozycjaMinut = 3; } if (minuty == 60) { //jezeli mija 60min trzeba wyzerowac min i naliczyc godziny minuty = 0; godziny++; lcd.setCursor(pozycjaMinut, 1); lcd.print("00"); pozycjaMinut = 4; } if (godziny == 10) { //przesuniecie wyswietlania godzin pozycjaGodzin = 0; } if (godziny == 100) { //jak dojdzie do 100 kończymy liczenie, bo przesunal by sie tekst na wyswietlaczu godziny = 0; lcd.setCursor(pozycjaGodzin, 1); lcd.print("00"); pozycjaGodzin = 4; lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("ZA DLUGO MIERZYSZ:)"); } delay(1000); //Tutaj przerwa w programie naliczajaca sekundy, sterujemy szybkoscia naliczania if (digitalRead (przycisk2) == LOW) { //jezeli wciscnieto przycisk 2 to pokaz ile sekund minelo lcd.clear(); lcd.setCursor(0, 0); //Ustawienie kursora lcd.print("KONIEC"); lcd.setCursor(0, 1); int czasSekundach = godziny * 3600 + minuty * 60 + sekundy; //zliczenie sekund,ktore minel lcd.print(czasSekundach); czyWcisnieto1 = 0; //flaga do przerwania petli wyswietlajacej naliczanie czasu } } }
  2. Hmm jako początkujący teraz ja nie do końca rozumiem. Czy jest jakieś specjalne polecenie pobrania z bufora? Czy po prostu trzeba dopisać jakąś funkcję, która zabierze dane i nic z nimi nie zrobi?
  3. Dobrze jest na początku nabyć dobre nawyki od doświadczonych osób. Czy może ukazał się jakiś artykuł na temat podstaw formatowania kodu? Jeżeli nie to myślę, że jest to dobry pomysł na nowy artykuł.
  4. Też podpiąłem odwrotnie (dopiero teraz zobaczyłem, że to robi różnicę). Dzięki odwrotnemu przepięciu dowiedziałem się również, że funkcja map() skaluje również jeżeli jako pierwszą damy większą wartość, a jako drugą mniejszą (przykład w kodzie poniżej). Dodałem również opcję auto-kalibracji #include <Servo.h> //Biblioteka odpowiedzialna za serwa Servo serwomechanizm; //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa byte pozycja = 0; //Aktualna pozycja serwa 0-180 int pozycjaPoprzednia = 0; int minWartosc = 50; //wartosc min odczytu dla przeskalowania int maxWartosc = 700; //wartosc max odczytu void setup() { serwomechanizm.attach(11); //Serwomechanizm podłączony do pinu 11 Serial.begin(9600); } void loop() { int odczytCzujnika = analogRead(A5); //Odczytujemy wartość z czujnika pozycja = map(odczytCzujnika, minWartosc, maxWartosc, 180, 0); //Zamieniamy ją na pozycję serwa if (odczytCzujnika < minWartosc) { //Autokalibracja-sprwdzenie czy odczytana wartosc jest mniejsza od min ustawionej minWartosc = odczytCzujnika; //jezeli mniejsza to zamiana } else if (odczytCzujnika > maxWartosc) { //jak wyzej maxWartosc = odczytCzujnika; } else if (abs(pozycja - pozycjaPoprzednia) > 5) { //Sprawdzamy czy pozycje różnią się o ponad 5 stopni serwomechanizm.write(pozycja); //Wykonajujemy ruch pozycjaPoprzednia = pozycja; //Zapamiętujemy aktualną pozycję jako poprzednią } Serial.print("Min: "); Serial.println(minWartosc); Serial.print("Max: "); Serial.println(maxWartosc); Serial.println(odczytCzujnika); //Wysyłamy wartość do terminala delay(300); //Opóźnienie dla lepszego efektu } oto mój wskaźnik
  5. Chciałem uzyskać taki efekt, żeby nic program nie rejestrował dopóki nie wcisnę przycisku na plytce. Teraz jak włączę aplikację i przed przyciśnięciem przycisku wprowadzę dane, to na ekranie widnieje komunikat "Zakrec potencjometrem i wciśnij przycisk" i do póki go nie wcisnę komunikat z ekranu nie zniknie. I teraz jeżeli przed wciśnięciem przycisku wprowadzę dane, to na ekranie nie widać, że je wprowadziłem ale po wciśnięciu przycisku są one automatycznie odbierane przez program. Chciałem uzyskać taki efekt, że jeżeli program czeka na wciśnięcie przycisku jest "zamrożony" to z mogę wpisywać co chcę i nie były to dane odbierane przez program. Jak nie piszę zbyt jasno to trudno, uczymy się dalej
  6. Zadanie 4.5 GRA Na tą chwilę kod wygląda tak: int odczyt = 0; //odczytana wartosc z potencjometru int proba = 0; //licznik odpowiedzi bool komunikat = 0; //kontrolka komunikatu o roczpoczeciu gry #define zielona 9 //definiowanie pinow #define czerwona 10 #define zolta 11 #define przycisk 3 #define potencjometr A5 void setup() { Serial.begin(9600); while (!Serial) { ; //bylo w tutorialu Arduino to dodalem :) } pinMode (zielona, OUTPUT); pinMode (zolta, OUTPUT); pinMode (czerwona, OUTPUT); pinMode (przycisk, INPUT_PULLUP); } void loop() { odczyt = analogRead(potencjometr); //odczyt z potencjometru Serial.println("Zakrec potencjometrem i wciśnij przycisk"); while (digitalRead(przycisk) == HIGH) {}//czekamy na wciśnięcie przycisku if (digitalRead(przycisk) == LOW) {} //jeżeli wciśnięty if (komunikat != 1) { //jeżeli komunikat nie został wywietlony digitalWrite(zielona, LOW); //gasimy LEDY digitalWrite(zolta, LOW); digitalWrite(czerwona, LOW); Serial.println("Zaczynamy grę"); Serial.println("Odgadnij wartość z zakresu 0-1023"); komunikat = 1; //oznaczenie ze komunikat zostal wyswietlony proba = 0; //zerowanie licznika prob delay(50); } while (proba < 3) { //powtorka do 3 prob Serial.println("Podaj liczbę"); while (Serial.available() == 0) {} String tekst = Serial.readStringUntil('\n'); int liczba = tekst.toInt(); //string na int int roznica = odczyt - liczba; //wyliczenie roznicy if (abs(roznica) <= 50) { //roznica jako modół, żeby sprawdzić Serial.println("Wygrałes"); proba = 3; digitalWrite(zielona, HIGH); delay(2000); } else { Serial.println("Pudlo"); digitalWrite(zielona, LOW); digitalWrite(zolta, HIGH); digitalWrite(czerwona, LOW); delay(800); digitalWrite(zolta, LOW); } komunikat = 0; //zezwolenie na komunikat proba++; //kolejna proba } Serial.println("Koniec Gry"); digitalWrite(zielona, LOW); digitalWrite(zolta, LOW); digitalWrite(czerwona, HIGH); } Trochę się namęczyłem, żeby to działo. Niektórzy użytkownicy mogą znaleźć tutaj swoje fragmenty kodu Największe problemy miałem z przekształceniem string i int. Poszukując rozwiązania w pomocy Arduino natknąłem się na taki fragment przy konfikurowaniu: void setup() { //Initialize serial and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB } } i mam teraz kilka pytań: Do czego służy ten while(!Serial){;} ? W moim kodzie na początku w terminalu pojawia się komunikat: Zakrec potencjometrem i wciśnij przycisk. I niby program czeka na wciśnięcie przycisku. Ale zaobserwowałem, że wpisując liczby i zatwierdzając je program rejestruje je w tle i po wciśnięciu przycisku gra toczy się automatycznie na wprowadzonych liczbach. Jak poprawić kod, żeby czekał na wciśnięcie przycisku i dopiero po tym fakcie można było wprowadzać liczby?
  7. Cześć, Wiek 35+, Trafiłem tutaj bo zawsze chciałem dowiedzieć co to są te rezystory, tranzystory, kondensatory... i jak to wszystko działa. Zacząłem od I kursu elektroniki, teraz dłubie przy Arduino, zobaczymy co będzie dalej
×
×
  • Utwórz nowe...