Skocz do zawartości

samemilerzeczy

Użytkownicy
  • Zawartość

    15
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

samemilerzeczy wygrał w ostatnim dniu 13 sierpnia

samemilerzeczy ma najbardziej lubianą zawartość!

Reputacja

10 Dobra

O samemilerzeczy

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna

Ostatnio na profilu byli

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

  1. Zadanie 7.1 #include <LiquidCrystal.h> //biblioteka ekranu LiquidCrystal lcd(2,3,4,5,6,7); //podłączenie wyświetlacza void setup() { lcd.begin(16,2); lcd.setCursor(0,0); lcd.print(" MIKOLAJ!"); lcd.setCursor(0, 1); lcd.print("--> forbot.pl<--"); } void loop() { } Zadanie 7.2 W wyniku zastosowania funkcji clear() program czyści wszystko co zostało przez nas wyświetlone. Napis "Nap. Odczytane" znika na zawsze, natomiast sama wartość napięcia odczytana z fotorezystora pojawia się ponownie ponieważ jest odczytywana i wyświetlana w pętli loop przez cały czas działania programu. Zadanie 7.3 Poniżej 100ms wynik jest już ciężki do odczytania, ponieważ zmiany wartości następują bardzo szybko. Około 50ms ciężko już odczytać cokolwiek ponieważ wartość nie jest ani przez moment stała. Zadanie 7.4 Niedawno z bratem robiliśmy podobne zadanie bo ma zajęcia z Arduino w technikum #include <LiquidCrystal.h> //dołączenie biblioteki wyświetlacza LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //zadeklarowanie pinów wyświetlacza float czas = 0.0; int licznik = 0; enum licznik {oczekiwanie, pomiar, wynik}; //wyliczeniowy typ danych; zmienna typu licznik może przyjąć 3 różne wartości zapisane w klamrach unsigned long aktualnyCzas = 0; //zadeklarowanie zmiennych umożliwiających sprawne posługiwanie się czasem unsigned long zmianaCzasu = 0; unsigned long zmiana = 0; void setup() { Serial.begin(9600); pinMode(8, INPUT_PULLUP); //przypisanie przycisków do odpowiednich pinów pinMode(9, INPUT_PULLUP); pinMode(10, INPUT_PULLUP); lcd.begin(16, 2); //deklaracja typu wyświetlacza } void loop() { aktualnyCzas = millis(); //millis zwraca czas w milisekundach, który minął od momentu uruchomienia programu switch (licznik) { //instrukcja warunkowa wielokrotnego wyboru case oczekiwanie: //przypadek pierwszy, gdy licznik jest w stanie oczekiwania lcd.setCursor(0, 0); //ustawienie kursora w 1 linijce lcd.print("Wcisnij przycisk"); //piszemy w 1 linijce lcd.setCursor(0, 1); //ustawienie kursora w 2 linijce lcd.print("..."); //piszemy w 2 linijce if (digitalRead(8) == LOW) { //gdy przycisk nr 1 zostanie wcisniety lcd.clear(); //czyscimy zawartosc wyswietlacza zmianaCzasu = aktualnyCzas; //przypisanie do zmiennej "zmianaCzasu" ilości milisekund które upłynęły od momentu uruchomienia programu licznik = pomiar; //przeniesienie stanu licznika w tryb pomiaru } break; case pomiar: //etap drugi, gdy licznik jest w stanie pomiaru lcd.setCursor(0, 0); //ustawienie kursora w 1 linijce lcd.print("Pomiar czasu:"); //piszemy w 1 linijce //Serial.print("Aktualny czas: "); Serial.print(aktualnyCzas); //Serial.print("zmianaCzasu: "); Serial.print(zmianaCzasu); zmiana = aktualnyCzas - zmianaCzasu; //odjecie od aktualnej ilosci czasu, czasu ktory uplynal w momencie wcisniecia 1 przycisku if (zmiana >= 10) { //jesli zmiana jest wieksza niz 10ms zmianaCzasu = aktualnyCzas; //znowu przypisujemy do zmiennej "zmianaCzasu" czas który upłynął od początku uruchomienia programu; czas = czas + 0.01; //czas się zwiększa symulując stoper } lcd.setCursor(0, 1); //piszemy w 2 linijce lcd.print(czas); //wyswietlamy aktualna ilosc czasu, zmieniajaca sie o 0.01 if (digitalRead(9) == LOW) { //jesli wcisniemy przycisk nr 2 lcd.clear(); //czyscimy aktualna zawartosc wyswietlacza licznik = wynik; //i aktualny status licznika ustawiamy na ostatni tryb czyli wynik } break; case wynik: //etap trzeci, gdy licznik jest w stanie wyniku lcd.setCursor(0, 0); //kursor na 1 linijke lcd.print("Koniec pomiaru!"); //piszemy w 1 linijce lcd.setCursor(0, 1); //kursor na 2 linijke lcd.print(czas); //wyswietlamy aktualny czas i pozostawiamy go bez zmian if (digitalRead(10) == LOW) { //jesli wcisniemy 3 przycisk lcd.clear(); //czyscimy zawartosc wyswietlacza czas = 0; //zerujemy czas licznik = oczekiwanie; //licznik ustawiamy w tryb 1: oczekiwanie } else if (digitalRead(8) == LOW) { //jesli wcisniemy ponownie przycisk nr 1 lcd.clear(); //czyscimy zawartosc wyswietlacza licznik = pomiar; //licznik jest w trybie 2, pomiaru i kontynuuje mierzenie czasu od momentu w ktorym zostal zatrzymany } break; } }
  2. @ethanak Wychodzi na to, że już po jednokrotnym wykonaniu pętli zawsze coś będzie znajdywało się w buforze. W związku z czym warunek while (Serial.available() == 0) nie będzie już w ogóle spełniony (chyba, że w jakiś sposób resetowałbym bufor). Tak samo czytając trochę z ciekawości o funkcjach malloc() i free() powodem dla którego program może przestać działać jest zapchanie pamięci "lukami" spowodowanymi właśnie np takim niepotrzebnym warunkiem. To taka upośledzona teoria zrozumiała na mój język, ale teoria w 90% przypadków wydaje się prosta. Gorzej jest z implementacją w praktyczne zastosowania.. Więc myśląc o tym jak uniknąć stosowania takiej konstrukcji jak while ( Serial.available() == 0) wpadłem póki co tylko na jedno rozwiązanie. Wrzucić zapytanie o kolor diody do wyświetlenia w SETUP tak żeby było wywoływane tylko raz. I wtedy jeśli chciałbym np móc dokonać wyboru znowu to zresetowanie tego buforu tak żeby zapytało ponownie. Nawet dla mnie brzmi to głupio. Ale szukając pomocy w sieci nie znalazłem zbyt wiele alternatywnych rozwiązań za to znalazłem mnóstwo próśb żeby nie używać tej konstrukcji bo jest błędna. Także prosiłbym o HELP!
  3. @ethanak 1. Błąd znika gdy ustawię w monitorze portu szeregowego opcję brak zakończenia linii. Nowa linia oznacza, że za każdym razem gdy wyślemy tekst będzie on zakończony nową linią. Rozumiem to tak, że arduino dostanie jakby dwie dane: nasz tekst i znak nowej linii i dlatego 2 razy pojawia mi się wtedy zapytanie o kolor diody którą chce zapalić. Brak zakończenia linii oznacza, że wiadomości czekają na odbiór w buforze i zostają odczytane dopiero z najbliższą wiadomością, którą zakończymy znakiem nowej linii. Także mamy tylko jedną daną w związku z czym tylko jedno pytanie o kolor diody. 2. Błąd znika również gdy pozostawię zakończenie nową linią natomiast zmodyfikuje program tak żeby odbierał cały string jako dane wejściowe a nie tylko jeden znak. #define Zielona 9 #define Czerwona 8 String odebraneDane = ""; byte kolor = 0; void setup() { Serial.begin(9600); pinMode(Zielona, OUTPUT); pinMode(Czerwona, OUTPUT); digitalWrite(Zielona, LOW); digitalWrite(Czerwona, LOW); } void loop() { Serial.print("Podaj czy uruchomić diodę ZIELONĄ czy CZERWONĄ: \n"); while (Serial.available() == 0) { delay(1000); } if (Serial.available() > 0) { //jeśli Arduino otrzymało jakieś dane odebraneDane = Serial.readStringUntil('\n'); //przypisujemy wpisane dane do zmiennej odebraneDane } if (odebraneDane == "zielona") { kolor = 1; } else if (odebraneDane == "czerwona") { kolor = 2; } switch (kolor) { case 1: //jeśli odebrana wartosc brzmi Zielona to zapalamy zieloną diodę digitalWrite(Zielona, HIGH); delay(1000); digitalWrite(Zielona, LOW); break; case 2: //tu zapalamy czerwoną diodę digitalWrite(Czerwona, HIGH); delay(1000); digitalWrite(Czerwona, LOW); break; default: Serial.println("Nie posiadamy takiego koloru!"); break; } delay(1000); }
  4. Początkowo było Serial.readStringUntil('\n'); bo miałem trochę inny zamiar na to zadanie. Kod zmieniłem a komentarz został stary, mój błąd
  5. Nagraliśmy z bratem też krótki filmik na którym widać lekko 'upośledzone' działanie naszego czujnika natężenia światła. Musiałbym jakoś stabilnie przymocować cały serwomechanizm żeby to wytrzymało bez trzymania przeze mnie. Ale nie mam przy sobie taśmy dwustronnej, a nie chce tego na ten moment zaklejać sztyftem i niepotrzebnie brudzić Następnym razem umiejętności nagrywania brata jak i umiejętności edycji filmów wideo moje zostaną poprawione i dodamy do tego jakąś melodyjkę.
  6. Zadanie 6.1 #define FotorezystorJeden A5 #define Potencjometr A4 #define FotorezystorDrugi A3 #define Przycisk 8 int counter = 0; //licznik ile razy wcisnieto przycisk int valFoto1 = 0; //zmienne do przechowywania wartosci odczytanych z peryferiow int valFoto2 = 0; int valPotencjometr = 0; void setup() { Serial.begin(9600); //rozpoczęcie komunikacji przez UART pinMode(Przycisk, INPUT_PULLUP); //przypisanie przycisku pod pin } void loop() { valFoto1 = analogRead(FotorezystorJeden); //odczytanie wartosci z peryferiow valFoto2 = analogRead(FotorezystorDrugi); valPotencjometr = analogRead(Potencjometr); if (digitalRead(Przycisk) == LOW) { counter += 1; //za kazdym kliknieciem przycisku ilosc klikniec bedzie sie zwiekszac o 1 Serial.print("Fotorezystor 1: "); Serial.print(valFoto1); Serial.print(", Fotorezystor 2: "); Serial.print(valFoto2); Serial.print(", Potencjometr: "); Serial.print(valPotencjometr); Serial.print(" Przycisk wciśnięto "); Serial.print(counter); Serial.print(" razy.\n"); delay(1000); //opoznienie zeby z kazdym wcisnieciem przycisku wyswietlalo nam wartosci tylko raz a nie kilka na raz } } Efekt w monitorze portu szeregowe: Zadanie 6.2 #define Zielona 9 #define Czerwona 8 int odebraneDane = 0; void setup() { Serial.begin(9600); pinMode(Zielona, OUTPUT); pinMode(Czerwona, OUTPUT); digitalWrite(Zielona, LOW); digitalWrite(Czerwona, LOW); } void loop() { Serial.print("Podaj jaką diodę mamy uruchomić ('C' -> czerwona, 'Z' -> zielona: \n"); while (Serial.available() == 0) { delay(1000); } if (Serial.available() > 0) { //jeśli Arduino otrzymało jakieś dane odebraneDane = Serial.read(); //przypisujemy wpisane dane do zmiennej odebraneDane switch (odebraneDane) { case 'Z': //jeśli odebrana wartosc brzmi Zielona to zapalamy zieloną diodę digitalWrite(Zielona, HIGH); delay(1000); digitalWrite(Zielona, LOW); break; case 'C': //tu zapalamy czerwoną diodę digitalWrite(Czerwona, HIGH); delay(1000); digitalWrite(Czerwona, LOW); break; } } delay(1000); } Działa, tylko nie mogę sobie poradzić z jedną rzeczą. Na początku pyta raz czy chcemy uruchomić diodę czerwoną czy zieloną. Po wybraniu jednorazowo opcji, np. Z, zapala diodę zieloną, czeka sekundę i ją gasi. Ale wtedy pytanie pojawia się zamiast raz, dwa razy z rzędu chwilę po sobie. Może ktoś podpowie jak usunąć ten nie zbyt istotny natomiast mało estetyczny aspekt. Zadanie 6.3 Dodałem 2 przyciski po wciśnięciu jednego serwomechanizm wskazuje wartość minimalną, po wciśnięciu drugiego wskazuje wartość maksymalną. #include <Servo.h> //biblioteka odpowiedzialna za serwomechanizm #define fotorezystor A5 //zadeklarowanie pinów dla peryferiów #define przyciskMIN 6 #define przyciskMAX 7 Servo serwomechanizm; byte pozycja = 0; //aktualna pozycja serwa w skali 0-180 stopnii int pozycjaPoprzednia = 0; int valMIN = 0; //wartosc minimalna dla swiatla int valMAX = 958; //wartosc maksymalna void setup() { serwomechanizm.attach(11); Serial.begin(9600); //rozpoczęcie komunikacji przez UART pinMode(przyciskMIN, INPUT_PULLUP); pinMode(przyciskMAX, INPUT_PULLUP); } void loop() { int odczytCzujnika = analogRead(fotorezystor); while (digitalRead(przyciskMAX) == LOW) { valMAX = odczytCzujnika; delay(100); } while (digitalRead(przyciskMIN) == LOW) { valMIN = odczytCzujnika; delay(100); } //odczytujemy wartosc z fotorezystora pozycja = map(odczytCzujnika, valMIN, valMAX, 180, 0); //mapujemy ja na mozliwy zakres ruchu serwomechanizmu pozycja = constrain(pozycja, 180, 0); if (abs(pozycja - pozycjaPoprzednia) > 5) //sprawdzamy czy różnica jest większa niż 5 stopni { serwomechanizm.write(pozycja); //wykonujemy ruch pozycjaPoprzednia = pozycja; //nadpisujemy aktualną pozycje jako poprzednia } Serial.println("Aktualna wartość fotorezystora: "); Serial.println(odczytCzujnika); //wysyłamy wartość do terminala UART delay(300); } Zadanie 6.4 Poniosło mnie z kolorami. Ale korzystałem wyłącznie z tego co miałem pod ręką w domu rodzinnym
  7. @Gieneq @ethanak DOBRA! Trochę się spóźnię do pracy ale musiałem zakończyć temat tego zadania. Zmieniłem trochę sposób podłączenia diod do układu i DZIAAAAAAAAŁAAAAAAAA! Będę teraz pamiętał, że ten sposób sprawdza się lepiej od poprzedniego. Dziękuje jeszcze raz bardzo wszystkim za pomoc!
  8. @Gieneq Problem tkwi chyba w samym podłączeniu diód do układu mimo, że jest wręcz podręcznikowe tak jak w każdym przerabianym przykładzie w kursie. Ponieważ odczytywanie wartości z fotorezystorów czy to czystych, czy to zmapowanych i ograniczonych przebiega jak najbardziej pomyślnie i dobrze. Samo odpalanie diód nie działa ponieważ w żadnym z możliwych przypadków nie świeci się ani jedna
  9. @Gieneq Miło usłyszeć komplement. Dodaje to skrzydeł, a one są bardzo potrzebne gdy się codziennie ciężko pracuje. Ale kurs mimo wszystko nadal jest wymagający i stanowi przyjemne wyzwanie co sprawia też, że jest dużo ciekawszy. Zauważam też, jak wielu rzeczy nie mówią nam na Politechnice Gdańskiej więc się cieszę, że mogę sobie te braki w ten sposób zakleić A ta liczba 9 to tak została z zadania przykładowego z serwomechanizmem. Czasami z braku czasu zamiast pisać zadanie od nowa wykorzystuje co mogę z poprzedniego i tak się przewinęła ta 9 przez wszystkie zadania z tej części
  10. @Gieneq #define PotencjometrL A4 //przypisanie fotorezystorów do odpowiednich pinów #define PotencjometrP A5 int ValueL = 0; //początkowe wartości fotorezystorów int ValueP = 0; int leds[] = {5, 6, 7, 8, 9}; //utworzenie tablicy o rozmiarze 4 (czyli posiadającej 5 elementów, ponieważ tablice są zero indeksowe) int roznica = 0; int led_index = 0; int i = 0; //zmienna wykorzystana przy funkcji for void setup() { Serial.begin(9600); //rozpczęcie komunikacji przez UART; for (i = 5; i <= 9; i++) { //pętla definiująca diody na pinach 5-9 jako OUTPUT pinMode(i, OUTPUT); } for (i = 5; i <= 9; i++) { //pętla przypisująca diodom na pinach 5-9 stan NISKI digitalWrite(i, LOW); } } void loop() { ValueL = analogRead(PotencjometrL); //odczytanie wartosci z potencjometrow ValueP = analogRead(PotencjometrP); roznica = ValueL - ValueP; led_index = map(roznica, -519 , 482, 0, 5); //zmapowanie zakresu wartosci roznicy na wartosci 0-5 (łatwiejsze warunki) led_index = constrain(led_index, 0, 5); //ograniczenie wartosci led_index zeby nie wychodzila poza zakres for (int i = 0; i < 6; ++i) { //instrukcja warunkowa przypisujaca odpowiedniej diodzie stan wysoki w zaleznosci od wartosci roznicy if (i == led_index) digitalWrite(leds[i], HIGH); else digitalWrite(leds[i], LOW); } Serial.println(roznica); } Sprawdziłem poprzez monitor portu szeregowego: mapowanie działa; constrain spełnia swoją funkcję; Wartości zmiennych roznica i led_index mieszczą się w zadanych przedziałach i ograniczeniach. Możliwe, że coś mam źle umieszczone ale sam po paru próbach/zmianach już tego nie widzę @ethanak Poprawione zgodnie z sugestią Chociaż może teraz ograniczyć to już na wartościach po zmapowaniu czyli od 0 do 5?
  11. Zadanie 5.1 Zmienna byte obsługuje wartości od 0 do 255. Jeśli zmienimy typ zmiennej wypelnienie z int na byte to możemy usunąć instrukcję warunkową if, ponieważ wypełnienie będzie się automatycznie zerowało po osiągnięciu maksymalnej wartości dozwolonej, czyli 255. Zadanie 5.2 #define Dioda 3 //przypisanie nazwy Dioda do elementu podpiętego pod pin 3 int wypelnienie = 0; int zmiana = 5; void setup() { Serial.begin(9600); //rozpoczęcie komunikacji przez UART pinMode(Dioda, OUTPUT); //ustawienie pinu 3 jako OUTPUT } void loop() { analogWrite(Dioda, wypelnienie); //nadpisanie w aktualnym stanie wartosci wypelnienia do Diody while (wypelnienie != 255) { analogWrite(Dioda, wypelnienie); //ROZŚWIETLANIE wypelnienie += zmiana; //zmiana aktualnego poziomu wypelnienia poprzez zwiekszenie o zadany próg Serial.print(wypelnienie); Serial.print("\n"); delay(50); } while (wypelnienie != 0) { analogWrite(Dioda, wypelnienie); //PRZYCIEMNIANIE wypelnienie -= zmiana; //zmiana aktualnego poziomu wypelnienia poprzez zmniejszenie o zadany próg Serial.print(wypelnienie); Serial.print("\n"); delay(50); } Serial.print(wypelnienie); Serial.print("\n"); //wyświetlenie aktualnej wartości wypełnienia w UART delay(100); } Zadanie 5.3 #include <Servo.h> //biblioteka odpowiedzialna za serwomechanizmy Servo serwomechanizm; int pozycja = 0; int zmiana = 6; int opoznienie = 200; void setup() { Serial.begin(9600); serwomechanizm.attach(9); } void loop() { if (pozycja < 100) { serwomechanizm.write(pozycja); } else { pozycja = 0; } pozycja = pozycja + zmiana; delay(opoznienie); opoznienie = opoznienie + 25; Serial.print("Aktualne opoznienie: "); Serial.print(opoznienie); } Zadanie 5.4 #include <Servo.h> //biblioteka odpowiedzialna za serwomechanizmy Servo serwomechanizm; String stringKat; int gotowyKat; void setup() { Serial.begin(9600); //rozpoczecie komunikacji przez UART serwomechanizm.attach(9); //przypisanie serwomechanizmu do pinu 9 Serial.print("Gdzie chcesz przesunąć śmigło (podaj liczbę z zakresu 0-180): \n"); } void loop() { if (Serial.available() > 0) { stringKat = Serial.readStringUntil('\n'); //czytamy podaną wartość gotowyKat = stringKat.toInt(); if ((gotowyKat >= 0) && (gotowyKat <= 180)) { serwomechanizm.write(gotowyKat); Serial.print("\nUstawiłeś serwomechanizm w pozycji: " + stringKat); } else { Serial.print("Wartość nie prawidłowa, podaj wartość z prawidłowego przedziału, 0-180!\n"); } } delay(200); } Zadanie 5.5 #include <Servo.h> //biblioteka odpowiedzialna za serwomechanizmy Servo serwomechanizm; int katPotencjometr; int Kat; void setup() { Serial.begin(9600); //rozpoczecie komunikacji przez UART serwomechanizm.attach(9); //przypisanie serwomechanizmu do pinu 9 Serial.print("Przekręć potencjometr i obserwuj zachowanie serwomechanizmu!"); } void loop() { katPotencjometr = analogRead(A5); Kat = map(katPotencjometr, 0, 1023, 0, 180); //zmapowanie wartości napięcia na możliwe wartości kąta dla serwa serwomechanizm.write(Kat); delay(200); } Czekam na uwagi, możliwe ulepszenia i każdą możliwą krytykę. W ten sposób uczę się najlepiej. SUPER KURS! Aktualnie jestem w trakcie studiów i ten kurs jest idealnym uzupełnieniem zdobywanej wiedzy o praktyczne podejście. Dzięki za czas włożony w jego przygotowanie
  12. @Gieneq Dobra, więc tak: 1) Wartości prezentują się następująco, widać momenty w których świeciłem bezpośrednio na prawy fotorezystor i na lewy: 2) Tak jak napisałeś stworzyłem jedną zmienną, która wiąże odczyty z obu fotorezystorów. Nazwałem ją StosunekNapiec i znajduje się ona też w instrukcjach warunkowych. 3) Warunki też zależą teraz (Tak jak o to prosiłeś) od różnic między wartościami odczytanymi z Lewego i Prawego fotorezystora i na tej podstawie powinny się świecić konkretne diody. Kod aktualnie wygląda tak: #define ZielonaL 12 //zadeklarowanie zmiennych diód i przypisanie do nich pinów #define ZoltaL 11 #define Czerwona 10 #define ZoltaP 9 #define ZielonaP 8 int FotoLewy = 0; //zadeklarowanie potrzebnych zmiennych int FotoPrawy = 0; float NapiecieLewy = 0; //float, ponieważ mnożenie przez 5/1023 w 99,9% przypadków da nam liczbę zmiennoprzecinkową float NapieciePrawy = 0; float StosunekNapiec = 0; int i = 0; //zmienna wykorzystana przy funkcji for void setup() { Serial.begin(9600); pinMode(ZielonaP, OUTPUT); pinMode(ZielonaL, OUTPUT); pinMode(Czerwona, OUTPUT); pinMode(ZoltaL, OUTPUT); pinMode(ZoltaP, OUTPUT); digitalWrite(ZoltaL, LOW); digitalWrite(ZoltaP, LOW); digitalWrite(Czerwona, LOW); digitalWrite(ZielonaP, LOW); digitalWrite(ZielonaL, LOW); } void loop() { FotoLewy = analogRead(A4); //odczytanie wartości z lewego fotorezystora FotoPrawy = analogRead(A5); //odczytanie natezenia oswietlenia z prawego fotorezystora NapiecieLewy = FotoLewy * (5.0 / 1023.0); //przeksztalczenie odczytu w napiecie NapieciePrawy = FotoPrawy * (5.0 / 1023.0); StosunekNapiec = (NapiecieLewy / NapieciePrawy); if ((NapiecieLewy > NapieciePrawy) && (StosunekNapiec > 1.2)) { digitalWrite(ZielonaP, LOW); digitalWrite(ZoltaP, LOW); digitalWrite(Czerwona, LOW); digitalWrite(ZoltaL, HIGH); digitalWrite(ZielonaL, HIGH); } if ((NapieciePrawy > NapiecieLewy) && (StosunekNapiec < 0.8)) { digitalWrite(ZielonaP, HIGH); digitalWrite(ZoltaP, HIGH); digitalWrite(Czerwona, LOW); digitalWrite(ZoltaL, LOW); digitalWrite(ZielonaL, LOW); } if ((StosunekNapiec > 0.7) && (StosunekNapiec < 1.3)) { digitalWrite(ZielonaP, LOW); digitalWrite(ZoltaP, LOW); digitalWrite(Czerwona, HIGH); digitalWrite(ZoltaL, LOW); digitalWrite(ZielonaL, LOW); } Serial.print("\nAktualne wartości napięcua"); Serial.print("\nNapięcie na prawym fotorezystorze: "); Serial.print(NapieciePrawy); Serial.print("\nNapięcie na lewym fotorezystorze: "); Serial.print(NapiecieLewy); delay(3000); } I tu pojawia się problem.. te diody nadal nie świecą Aktualnie pobieram program Fritzing żeby stworzyć schemat połączeń jak u mnie na płytce bo na zdjęciu tego nie widać.
  13. Poprawiłem trochę, ale na diodach dalej nie widać efektu mimo tego, że patrząc na UART widać, że w miarę zmiany oświetlenia na odpowiednich fotorezystorach wartość napięcia odczytywana jest poprawnie i zmienia się na bieżąco gdy zmieniam kąt padania/natężenie latarki. Aktualny kod do 4.6 prezentuje się tak: #define CzerwonaL 5 #define ZoltaL 6 #define Zielona 7 #define ZoltaP 8 #define CzerwonaP 9 int i = 0; //dla funkcji for int FotoLewy = 0; //przechowuje przechwycona wartosc z lewego fotorezystora int FotoPrawy = 0; // -//- z prawego fotorezystora void setup() { Serial.begin(9600); //komunikacja przez USART for (i = 5; i <= 9; i++) { //pętla definiująca diody na pinach 5-9 jako OUTPUT pinMode(i, OUTPUT); } for (i = 5; i <= 9; i++) { //pętla przypisująca diodom na pinach 5-9 stan NISKI digitalWrite(i, LOW); } } void loop() { FotoLewy = analogRead(A4); //zczytanie wartości z fotorezystorów FotoPrawy = analogRead(A5); delay(1000); FotoLewy = map(FotoLewy, 0, 1000, 1, 4); //wartość skalowana z 0-1000 na 1-4 FotoPrawy = map(FotoPrawy, 0, 1000, 1, 4); Serial.println("Wartość odczytana z lewego fotorezystora: "); Serial.println(FotoLewy); Serial.println("Wartość odczytana z prawego fotorezystora: "); Serial.println(FotoPrawy); if ((FotoLewy == 1) == (FotoPrawy == 1)) { digitalWrite(Zielona, HIGH); digitalWrite(ZoltaL, LOW); digitalWrite(CzerwonaL, LOW); } if (FotoPrawy == 2) { digitalWrite(Zielona, LOW); digitalWrite(ZoltaL, HIGH); digitalWrite(CzerwonaL, LOW); } if (FotoPrawy == 3) { digitalWrite(Zielona, LOW); digitalWrite(ZoltaL, LOW); digitalWrite(CzerwonaL, HIGH); } else { if ((FotoLewy == 1) == (FotoPrawy == 1)) { digitalWrite(Zielona, HIGH); digitalWrite(ZoltaP, LOW); digitalWrite(CzerwonaP, LOW); } if (FotoLewy == 2) { digitalWrite(Zielona, LOW); digitalWrite(ZoltaP, HIGH); digitalWrite(CzerwonaP, LOW); } if (FotoLewy == 3) { digitalWrite(Zielona, LOW); digitalWrite(ZoltaP, LOW); digitalWrite(CzerwonaP, HIGH); } } } Możliwe, że problem tkwi w moim podłączeniu układu. Będę tu zaglądał może ktoś wstawi swojego rozwiązanie ze schematem i zauważę swój błąd. W międzyczasie ruszam z 5 częścią Dzięki bardzo za pomoc!
  14. Cześć. Postanowiłem również podzielić się moim rozwiązaniem w związku z tym, że zadania są coraz dłuższe a ja z chęcią posłucham podpowiedzi i uwag. Mam też pytanie. Widzę u niektórych, że mają takie króciutkie kabelki do wykonywania połączeń. W jaki sposób mogę sobie taki kabelek/złączkę wykonać? Poniżej rozwiązanie zadania nr 4.5: #define zielona 5 #define zolta 6 #define czerwona 7 #define przycisk 4 #define potencjometr A5 int proba = 0; int liczba = 0; //zamieniony na int wybor gracza int wartosc = 0; //pobrana wartosc z potencjometru String wybor = ""; int pozostaleProby = 3; void setup() { Serial.begin(9600); //rozpoczęcie komunikacji przez USART pinMode(zielona, OUTPUT); pinMode(zolta, OUTPUT); pinMode(czerwona, OUTPUT); pinMode(przycisk, INPUT_PULLUP); digitalWrite(czerwona, LOW); digitalWrite(zielona, LOW); digitalWrite(zolta, LOW); } void loop() { if (proba < 3) { Serial.println("Pozostała liczba prób wynosi: "); Serial.println(pozostaleProby); Serial.println("Przekręć pokrętło i wciśnij przycisk gdy będziesz gotowy"); while (digitalRead(przycisk) == HIGH) { delay(50); } wartosc = analogRead(potencjometr); Serial.println("Podaj liczbę od 0 do 1023: "); while (Serial.available() == 0) { delay(50); } if (Serial.available() > 0) { //oczekiwanie na dane wybor = Serial.readStringUntil('\n'); liczba = wybor.toInt(); if ((wartosc - liczba <= 50) and (wartosc - liczba >= -50)) { digitalWrite(zielona, HIGH); Serial.println("WYGRAŁEŚ! Dokładna wartość to: "); Serial.println(wartosc); delay(2000); digitalWrite(zielona, LOW); delay(1000); pozostaleProby = 3; } else { digitalWrite(zolta, HIGH); Serial.println("Spróbuj jeszcze raz! Poprawna wartość to: "); Serial.println(wartosc); delay(1000); digitalWrite(zolta, LOW); delay(1000); proba++ ; pozostaleProby = pozostaleProby - 1; } } } else if (proba = 3) { digitalWrite(czerwona, HIGH); Serial.println("Przegrales! Poprawna wartość to: "); Serial.println(wartosc); delay(1000); digitalWrite(czerwona, LOW); Serial.println("Zaczynamy od nowa!"); delay(1000); proba = 0; pozostaleProby = 3; } } A tutaj zadanie 4.6: In progress, ponieważ mimo iż 2 razy napisałem kod to na samym urządzeniu dalej nie widzę zamierzonego efektu. int FotoLewy = 0; //przechowuje przechwycona wartosc z lewego fotorezystora int FotoPrawy = 0; // -//- z prawego fotorezystora float NapiecieLewy = 0; float NapieciePrawy = 0; // int prog = 0; //próg włączenia światła void setup() { Serial.begin(9600); //komunikacja przez USART pinMode(9, OUTPUT); //prawa dioda pinMode(8, OUTPUT); pinMode(7, OUTPUT); //środkowa dioda pinMode(6, OUTPUT); pinMode(5, OUTPUT); //lewa dioda digitalWrite(9, LOW); digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(5, LOW); } void loop() { // prog = analogRead(A3); FotoLewy = analogRead(A4); FotoPrawy = analogRead(A5); FotoLewy = map(FotoLewy, 0, 1023, 1, 3); //wartość skalowana z 0-1023 na 1-3 FotoPrawy = map(FotoPrawy, 0, 1023, 1, 3); Serial.println("Wartość odczytana z lewego fotorezystora: "); Serial.println(FotoLewy); Serial.println("Wartość odczytana z prawego fotorezystora: "); Serial.println(FotoPrawy); if(NapieciePrawy == 2) { digitalWrite(9, LOW); digitalWrite(8, HIGH); digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(5, LOW); } else if(NapieciePrawy == 3) { digitalWrite(9, HIGH); digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(5, LOW); } else if(NapiecieLewy == 3) { digitalWrite(9, LOW); digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(5, HIGH); } else if(NapiecieLewy == 2) { digitalWrite(9, LOW); digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, HIGH); digitalWrite(5, LOW); } else { digitalWrite(9, LOW); digitalWrite(8, LOW); digitalWrite(7, HIGH); digitalWrite(6, LOW); digitalWrite(5, LOW); } delay(1000); } Posiłkowałem się za drugim razem rozwiązaniem innych użytkowników bo kompletnie zgłupiałem przy moim 1 podejściu. Możliwe, że problem tkwi w podłączeniu układu. (niewyraźne zdjęcie z Xiaomi in 3.. 2.. 1..)
  15. Cześć, nazywam się Mikołaj i aktualnie od niedawna mam 23 lata. Studiuję Elektronikę i Telekomunikację na Politechnice Gdańskiej, od paru lat amatorsko programuję a w celach zarobkowych od pełnoletności pracuje za barem. Jestem melomanem, fanatykiem biegania i takie tam... może kiedyś spotkamy się w pracy to pogadamy Cieszę się, że natrafiłem na źródło wiedzy jakim jest Wasze forum. Czuję, że jestem w dobrych rękach żeby jeszcze bardziej zaprzyjaźnić się z elektroniką. Pozdrawiam wszystkich serdecznie
×
×
  • Utwórz nowe...