Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

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);

     }


   }
 }
}
Link do komentarza
Share on other sites

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++;
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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 🙂

Link do komentarza
Share on other sites

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ł 😉

Link do komentarza
Share on other sites

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);
 }
}
Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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);       
 }

}

Link do komentarza
Share on other sites

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   
} 
Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.