Skocz do zawartości

Pomocna odpowiedź

  • 1 miesiąc później...

Witam.

Z racji choroby rozpocząłem przygodę z arduino. Po wielu bojach zrobiłem lekcje 4.5 Tak to wygląda u mnie jest OK ??

#define zielona 10
#define zolta 9
#define czerwona 8
#define przycisk 13

String liczba = "";
int s1 = 0;
int s2 = 0;
int s3 = 0;
int liczba_int = 0;
int ustawionaliczba = 0;
int proba = 0;

void setup() {
 Serial.begin(9600);
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(13, INPUT_PULLUP);

}

void loop() {

 ustawionaliczba = analogRead(A5);



 if (s1 == 0) {
   Serial.println("Witam. Ustaw potencjometr i nacisnij przycisk");
   s1 = 1;

 }
 if (s3 == 0) {
   if (Serial.available() > 0) {
     liczba = Serial.readStringUntil('\n');
     Serial.println("Nie nacisneles przycisku");
     s3 = 1;
   }


 }
 if (digitalRead(13) == LOW) {
   Serial.println("Podaj Liczbe od 1 do 1000");
   s2 = 1;
   delay(1000);
 }
 if (s2 == 1) {
   if (Serial.available() > 0) {
     liczba = Serial.readStringUntil('\n');
     liczba_int = liczba.toInt();
     if (liczba_int - 50 <= ustawionaliczba && liczba_int + 50 >= ustawionaliczba) {
       Serial.println("Wygrales");
       digitalWrite(zielona, HIGH);
       digitalWrite(zolta, LOW);
       digitalWrite(czerwona, LOW);
       s1 = 0;
     } else if (proba == 0) {
       Serial.println("Zly wynik masz jeszcze 2 proby");
       digitalWrite(zolta, HIGH);
       digitalWrite(zielona, LOW);
       proba = proba + 1;
     } else if (proba == 1) {
       Serial.println("Zly wynik masz jeszcze 1 proby");
       digitalWrite(zolta, HIGH);
       proba = proba + 1;
     } else if (proba == 2) {
       Serial.println("Zly wynik masz ostatnia probe");
       digitalWrite(zolta, HIGH);
       proba = proba + 1;
     } else if (proba == 3) {
       Serial.println("PRZEGRALES !!! Chcesz zagrac jeszcze raz nacisnij reset");
       digitalWrite(zolta, LOW);
       digitalWrite(czerwona, HIGH);

     }


   }
 }
}

RossiQ - witam na forum 🙂

Przydałoby się dodać komentarze, aby cały program był bardziej przejrzysty. Do tego niektóre fragmenty możesz trochę skrócić przykładowo inkrementację można zapisać tak:

proba++;

RossiQ, zapis:

proba = proba + 1;

Można skrócić właśnie do takiej wersji jak:

proba++;

Zabieg czysto estetyczny, działanie będzie takie same 😉

Tego nie wiedziałem ale bazowałem na wiedzy zdobytej w kursie 🙂 nie pokazałeś nie wiedziałem. 🙂 z opcją "toInt" też trochę nie fair ale inaczej nie umiałem. Oczywiście to nie moja wiedza tylko podglądałem u innych 🙂

RossiQ, wybacz mój błąd - faktycznie informacja o skróconym zapisie inkrementacji pojawia się w kursie później 😉 W takim razie będziesz już na przyszłość wiedział 😉

No i mam problem z zadaniem 4.6.

Bazując na zdobytej wiedzy zrobiłem coś takiego ale nie wiem jak mam sprawic aby skraje diody sie swiecily. Potrzebuje zrobić tak aby prawyfoto różnił się o 2 od lewyfoto. Jak to zrobić.

int prawyfoto = 0;
int lewyfoto = 0;

void setup() {


 pinMode(8, OUTPUT); // ustawienie pinow
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(12, OUTPUT);

}

void loop() {
 prawyfoto = analogRead(A5); //odczytanie wartosci z fotorezystorow
 lewyfoto = analogRead(A4);  //odczytanie wartosci z fotorezystorow

 prawyfoto = map(prawyfoto, 30, 970, 1, 5); //zmiana wartosci z fotorezystorow na 1 do 5
 lewyfoto = map(lewyfoto, 30, 970, 1, 5);   //zmiana wartosci z fotorezystorow na 1 do 5
 if (prawyfoto == lewyfoto) {
   digitalWrite(10, HIGH);
 }else{
   digitalWrite(10, LOW);
 }
 if (prawyfoto > lewyfoto) {
   digitalWrite(11, HIGH);
 }else{
   digitalWrite(11, LOW);
 }
 if (prawyfoto < lewyfoto) {
   digitalWrite(9, HIGH);
 }else{
   digitalWrite(9, LOW);
 }
 if (prawyfoto > lewyfoto) { //to wlasnie tu mam problem
   digitalWrite(12, HIGH);
 }else{
   digitalWrite(12, LOW);
 }
}

[ Dodano: 05-01-2017, 18:03 ]

Dobra zrobiłem to tak ale nie wiem czemu ale diody 9 i 11 przy zapalonych 8 i 12 się żarzą.

int prawyfoto = 0;
int lewyfoto = 0;

void setup() {


 pinMode(8, OUTPUT); // ustawienie pinow
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(12, OUTPUT);

}

void loop() {
 prawyfoto = analogRead(A5); //odczytanie wartosci z fotorezystorow
 lewyfoto = analogRead(A4);  //odczytanie wartosci z fotorezystorow

 prawyfoto = map(prawyfoto, 30, 970, 1, 6); //zmiana wartosci z fotorezystorow na 1 do 7
 lewyfoto = map(lewyfoto, 30, 970, 1, 6);   //zmiana wartosci z fotorezystorow na 1 do 7
 if (prawyfoto == lewyfoto) {
   digitalWrite(10, HIGH);
 }else{
   digitalWrite(10, LOW);
 }
 if (prawyfoto < lewyfoto) {
   digitalWrite(11, HIGH);
 }else{
   digitalWrite(11, LOW);
 }
 if (prawyfoto > lewyfoto) {
   digitalWrite(9, HIGH);
 }else{
   digitalWrite(9, LOW);
 }
 if ((prawyfoto - lewyfoto)>2) {
   digitalWrite(8, HIGH);
   digitalWrite(9, LOW);
 }else{
   digitalWrite(8, LOW);
 }
 if ((lewyfoto - prawyfoto)>2) {
   digitalWrite(12, HIGH);
   digitalWrite(11, LOW);
 }else{
   digitalWrite(12, LOW);
 }
}
  • 4 tygodnie później...

No ale przecież z klawiatury dostajesz osobne znaki, które razem tworzą właśnie String, który to z kolei dla procesora nie ma żadnej sensownej wartości przydatnej do jakichś obliczeń. W pamięci RAM wygląda to zupełnie inaczej niż binarny integer. Musisz dokonać konwersji tekstu na liczbę dwójkową. A dlaczego Cię to boli?

Mam kilka uwag do funkcji map(). W artykule zwracasz uwagę, że poprawne działanie "Wskaźnik na diodach" uzyskałeś zmieniając wartość z 1023 na 1021. Zgodnie z kodem funkcji map()

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

dla map(x, 0, 1023, 1, 5); piaty warunek zachodzi tylko gdy x=1023. Czyli sygnał analogowy podzielony jest na 4 przedziały i wystąpienie wartości max. Lepsze działanie kodu uzyskamy poprzez:

map(x, 0, 1023, 0, 5);

i zmieniając warunki lub

map(x, 0, 1023, 1, 6);
  • Lubię! 1

Witam napisałem taki oto kod, ale czy da się to jakoś napisać prościej, bo jakby było np 30 diod, to pisać tyle komend było by bardzo czasochłone. Myslalem nad switch/case, ale nie wiem jak sie do tego zabrać, moglby ktoś rzucic okiem ? Dzięki z góry !

Zadanie 4.6


void setup() {
   pinMode(12, OUTPUT); 
 pinMode(11, OUTPUT); 
 pinMode(10, OUTPUT); 
 pinMode(9, OUTPUT);
 pinMode(8, OUTPUT); 
Serial.begin(9600);
}

void loop()
{
  int LEWY_FOTOREZYSTOR = analogRead(A5); //Odczytywana wartość z lewego fotorezystora
  int PRAWY_FOTOREZYSTOR = analogRead(A4);//Odczytywana wartość z prawego fotorezystora
 Serial.print("Odczyt (L): ");
 Serial.print(LEWY_FOTOREZYSTOR);
 Serial.print("      Odczyt (R): ");
 Serial.println(PRAWY_FOTOREZYSTOR); 
 delay(100);


 if (LEWY_FOTOREZYSTOR<30 && PRAWY_FOTOREZYSTOR <30) { 
     digitalWrite(8, LOW); 
     digitalWrite(9, LOW); 
     digitalWrite(10, HIGH); 
     digitalWrite(11, LOW); 
     digitalWrite(12, LOW); 
 } else if (LEWY_FOTOREZYSTOR > 30 && LEWY_FOTOREZYSTOR <= 60) {
     digitalWrite(8, LOW); 
     digitalWrite(9, LOW); 
     digitalWrite(10, LOW); 
     digitalWrite(11, HIGH); 
     digitalWrite(12, LOW);       
 } else if  (LEWY_FOTOREZYSTOR > 60) {  
     digitalWrite(8, LOW); 
     digitalWrite(9, LOW); 
     digitalWrite(10, LOW); 
     digitalWrite(11, LOW); 
     digitalWrite(12, HIGH);       
 }

else if  (PRAWY_FOTOREZYSTOR > 30 && PRAWY_FOTOREZYSTOR <= 60 ) {
     digitalWrite(8, LOW); 
     digitalWrite(9, HIGH); 
     digitalWrite(10, LOW); 
     digitalWrite(11, LOW); 
     digitalWrite(12, LOW);       
 }
else if  (PRAWY_FOTOREZYSTOR > 60) {  
     digitalWrite(8, HIGH); 
     digitalWrite(9, LOW); 
     digitalWrite(10, LOW); 
     digitalWrite(11, LOW); 
     digitalWrite(12, LOW);       
 }

}

Pewnie jest jakaś możliwość jeszcze jakoś to poprawić 😉

Zadanie 4.5

  #define RED1 8 //Definicja czerwonej diody na pinie 8
#define RED2 9 //Definicja czerwonej diody na pinie 9
#define YELLOW 10 //Definicja żółtej diody na pinie 10
#define GREEN1 11 //Definicja zielonej diody na pinie 11
int odczytanaWartosc = 0; // Zatrzaśnięta wartość od 0 - 1023 odczytana z potencjometru
String odpowiedz = ""; // Odpowiedź wprowadzona przez interfejs szeregowy
int odpowiedz_int = 0; // Zmienna przerobiona z "odpowiedz"
bool losowanie = false; // Zmienna pomocnicza pozwalająca odczytać w którym momencie programu jesteśmy
byte licznik = 0; //zmienna pomocnicza do określenia ilości szans
bool wygrana = false; // Zmienna mówiąca czy się wygrało

void setup() {
 Serial.begin(9600);
 pinMode(7, INPUT_PULLUP); //Konfiguracja przycisku
 pinMode(RED1, OUTPUT); //Konfiguracja wyjść pod diody LED
 pinMode(RED2, OUTPUT);
 pinMode(YELLOW, OUTPUT);
 pinMode(GREEN1, OUTPUT);
}

void loop() {
 // Ustawienie wszystkich parametrów w pozycji początkowej
 digitalWrite(YELLOW, LOW);
 digitalWrite(GREEN1, LOW);
 digitalWrite(RED1, LOW);
 digitalWrite(RED2, LOW);
 licznik = 0;
 // Wyświetlenie w interfejsie poleceń dla gracza
 Serial.println("Przekrec potencjometr i wcisnij przycisk");
 /* do puki nie wciśniemy przycisku możemy zmieniać wartość na potencjometrze
 potem każda zmiana nie będzie miała wpływu na wartość zatrzaśniętą w programie*/
while (digitalRead(7) == HIGH){
 odczytanaWartosc = analogRead(A4); //Odczytanie wartości potencjometru   
 delay(20);
}
 losowanie = true;
while  (digitalRead(7) == LOW){
       //pętla odpowiedzi
       while (losowanie == true) {
       digitalWrite(YELLOW, LOW);
       Serial.println("Podaj liczbę +/- 50 od wskazywanej przez potencjometr");
       while (Serial.available() == 0){}
       odpowiedz = Serial.readStringUntil ('\n'); //Jeśli tak, to odczytaj je do znaku końca linii i zapisz w zmiennej odebrane dane
       odpowiedz_int = odpowiedz.toInt();
       Serial.println("Twoja odpowiedz to " + odpowiedz + "!"); //Wyświetl komunikat
       Serial.println(licznik);
       //Jeżeli odpowiedź jest mniejsza o 50 niż zatrzaśnięta wartość z potencjometru
       if (odczytanaWartosc > odpowiedz_int + 50) {
           Serial.println(" jest zła");  
           digitalWrite(YELLOW, HIGH);
           } 
           //Jeżeli odpowiedź jest o 50 większa niż zatrzaśnięta wartość z potencjometru
           else if (odczytanaWartosc < odpowiedz_int - 50) {
           Serial.println(" jest zła");  
           digitalWrite(YELLOW, HIGH);
           } 
           //Jeżeli zmienna mieści się w przedziale +/- 50
           else {
           Serial.println(" jest dobra");  
           digitalWrite(GREEN1, HIGH);
           digitalWrite(RED1, LOW);
           digitalWrite(RED2, LOW);
           losowanie = false;
           wygrana = true;
           }
           //Zapalanie diod odpowiedzialnych za pokazanie ilości szans
           if (licznik == 1){
             digitalWrite(RED1, HIGH);
           }
           if (licznik == 2){
             digitalWrite(RED2, HIGH);
           }
           Serial.println(licznik);
           delay(100);
           //Jeżeli się nie powiedzie i licznik dojdzie 3 wychodzimy z pętli
        if (licznik == 3){
         losowanie = false;
        }
        //Zwiększenie licznika przy którego pomocą w końcu wyjdziemy z pętli wyjdziemy z pętli
        licznik++;
        }
       if (wygrana == true){
         Serial.println("Gratulacje wygrales"); //Wyświetl komunikat o wygranej
       } else {
         Serial.println("Niestety przegrales"); //Wyświetl komunikat o przegranej
       }
       Serial.println(odczytanaWartosc); //Wyświetl komunikat
 }



  delay(1000); //Opóźnienie, aby nie odczytywać ADC zbyt szybko   
} 

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ę »
×
×
  • Utwórz nowe...