Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

@qubacki123, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

Dnia 10.04.2019 o 18:56, qubacki123 napisał:

Na jakiej zasadzie powinienem dobrać rezystor do fotorezystora w dzielniku napięcia (ze wzoru na dzielnik napięcia)? Posiadam w zestawie dwa fotorezystory 5-10k oraz 20-30k.

Nie ma to większego znaczenia. Użycia innego fotorezystora sprawi jedynie, że Twój układ będzie reagował trochę inaczej, ale nadal poprawnie. W ramach eksperymentu możesz spokojnie zrobić dwa układy z różnymi fototranzystorami i sprawdzić jak działają 😉

  • Lubię! 1
Link do komentarza
Share on other sites

Proszę o pomoc. Czy w moim kodzie jest jakiś błąd?

Jak więcej światła pada na fotorezystor po lewej, zapala się dioda po lewej, jak jest ~po równo, to dioda środkowa, a jak na fotorezystor po prawej to nadal świeci się środkowa dioda.

int odczytL = 0;  //odczyt z lewego fotorezystora
int odczytR = 0;  //odczyt z prawego fotorezystora

#define LL 4 //dioda po lewej
#define LR 2 //dioda po srodku
#define RR 8 //dioda po prawej

void setup() {
  pinMode(LL, OUTPUT);
  pinMode(LR, OUTPUT);
  pinMode(RR, OUTPUT);
  pinMode(A4, INPUT); //fotorezystor po lewej
  pinMode(A5, INPUT); //fotorezystor po prawej

  Serial.begin(9600);
}

void loop() {
  digitalWrite(LL, LOW);
  digitalWrite(LR, LOW);
  digitalWrite(RR, LOW);
  
  odczytL = analogRead(A4);
  odczytR = analogRead(A5);

  Serial.print(odczytL);
  Serial.print("     ");
  Serial.println(odczytR);
  delay(250);
  odczytL = map(odczytL, 10, 1020, 1, 5);
  odczytR = map(odczytL, 10, 1020, 1, 5);

  if (odczytL > odczytR){
    digitalWrite(LL, HIGH);
    digitalWrite(LR, LOW);
    digitalWrite(RR, LOW);
  } else if (odczytL == odczytR){
    digitalWrite(LR, HIGH);
    digitalWrite(LL, LOW);
    digitalWrite(RR, LOW);
  } else if (odczytL < odczytR){
    digitalWrite(RR, HIGH);
    digitalWrite(LR, LOW);
    digitalWrite(LL, LOW);
  }
  delay(250);
}

Przechwytywanie.thumb.PNG.cfadc19b6882af24e347de4965e7a1ea.PNG

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

Hejka.

Podsyłam swoje rozwiązanie zadanie 4.5. Chodź nie jest ono do końca poprawne ;/ 

int odczyt_potencjometru = 0; // do odczytania liczby z potencjometru
int wczytana_liczba = 0;
int roznica = 0;

#define LedZiel 9
#define LedZol 8
#define LedCzer 7
#define przycisk 4
#define potencjometr A5

void setup() {
  Serial.begin(9600); // ustawienie transmisji

  pinMode(przycisk, INPUT_PULLUP); // wyjscie 4 jako przycisk

  // ustawienia diod jako wyjscie
  pinMode(LedZiel, OUTPUT);
  pinMode(LedZol, OUTPUT);
  pinMode(LedCzer, OUTPUT);
  
}

void loop() {
  // ustawienie poczatkowe diod przed kazda gra
  digitalWrite(LedZiel, LOW);
  digitalWrite(LedZol, LOW);
  digitalWrite(LedCzer, LOW);
  int szansa = 3 ; // ile pozostalo szans
  odczyt_potencjometru = analogRead(A5);
  Serial.println(odczyt_potencjometru); // do sprawdzania jaka jest liczba (opcjonalne)
  while (digitalRead(przycisk) == LOW ){ // jesli przycisk nacisniety
    delay(1000);
    Serial.println("Podaj licze z zakresu 0 do 1023 +/- 50 " );
    delay(1000);
    if ( Serial.available() > 0 ) { // jesli przekazana jest liczba
      wczytana_liczba = Serial.parseInt();
      Serial.print("Podales liczbe:");
      Serial.println(wczytana_liczba);
      roznica = odczyt_potencjometru - wczytana_liczba;

      if (roznica <= 50 && roznica >= -50){
        Serial.println("Wygrales");
        digitalWrite(LedZiel, HIGH);
        digitalWrite(LedZol, LOW);
        digitalWrite(LedCzer, LOW);
      }else{
        szansa = szansa - 1;
        Serial.print("masz prob = ");
        Serial.println(szansa);
        digitalWrite(LedZol, HIGH); 
        digitalWrite(LedCzer, LOW);
        digitalWrite(LedZiel, LOW);
        if( szansa <= 0 ){
          Serial.println("Przegrales");
          digitalWrite(LedZol,LOW);
          digitalWrite(LedZiel,LOW);
          digitalWrite(LedCzer, HIGH);
        }
       }
      } else { // gdy nie przakazano liczby
        Serial.println("nie podano liczby");
        delay(1000);
      }
      
     } 
  
  while (digitalRead(przycisk) == HIGH){ // komunitak gdy nie mamy przycsku wduszonego
      delay(3000);
      Serial.println("wdus przycisk");
  }
  

}

Problem jest taki, że jak wpisze jakąś liczbę to Arduino po przejściu wszystkich warunków sam wstawia drugą liczbę wykonuje wszystkie warunki i dopiero potem czeka na wpisanie drugiej liczby. Czy ktoś wie dlaczego tak jest? Ewentualnie czy ktoś ma jakieś uwagi jak ten kod napisać lepiej, poprawniej?

Dziękuje za podpowiedzi!

Link do komentarza
Share on other sites

4 godziny temu, Ronaldo71888 napisał:

sam wstawia drugą liczbę wykonuje wszystkie warunki i dopiero potem czeka na wpisanie drugiej liczby

A sprawdzałeś jaka to liczba? 🙂 Może zwyczajnie chodzi o znaki końca linii wysyłane przez Monitor Portu Szeregowego (wystarczy zmienić odpowiednią opcję w tym okienku).

  • Pomogłeś! 1
Link do komentarza
Share on other sites

16 godzin temu, Treker napisał:

A sprawdzałeś jaka to liczba? 🙂 Może zwyczajnie chodzi o znaki końca linii wysyłane przez Monitor Portu Szeregowego (wystarczy zmienić odpowiednią opcję w tym okienku).

Super. Dzięki za podpowiedź! Teraz już działa. Powiem szczerze, że nawet nie wiedziałem, że coś takiego wystarczy zmienić w terminalu. Myślałem, że jedyne rozwiązanie to poprawienie kodu tak, żeby czytał znak końca linii. 

Więc nauczyłem się kolejnej rzeczy! Jeszcze raz dzięki! 😄

Co do powyższego kodu to teraz wszystko jest okej. ; )

Link do komentarza
Share on other sites

Witajcie mam banalne pytanie niestety nie mogę znaleźć działającej odpowiedzi...

program dokładnie jak w kursie, jak zmodyfikować linię

Serial.println(napiecie);                       tak by w serial monitorze wyświetlana wartość była napiecie + "V" tj 5.00 V zamiast 5.00?

Link do komentarza
Share on other sites

@robal88 witam na forum 🙂

10 godzin temu, robal88 napisał:

nasuwa się kolejne pytanie dlaczego fraza poniżej nie działa w tym przypadku?


Serial.println("Napięcie: "+ napiecie + " V");

W dokumentacji Arduino znajdziesz dokładną informację na ten temat (jest tam praktycznie identyczny "anty" przykład). Zerknij tutaj: https://www.arduino.cc/en/Tutorial/StringAdditionOperator😉

Link do komentarza
Share on other sites

1024 => 5V
1 => x

1024x = 1*5

x = (1*5V)/1024 = ~0,0049V

A napięciu 5V nie odpowiada wartość 1023?
Więc zamiast:

napiecie = odczytanaWartosc * (5.0/1024.0); //Przeliczenie wartości na napięcie

nie powinno być 5.0/1023.0 ?
Owszem, wartości jest 1024, ale 0 reprezentuje zero, więc przedziałów między nimi jest 1023.

Analogicznie, gdyby przetwornik był 2 bitowy czyli od 0 do 4 to 1=>1,67.
0=>0V
1=>1,67V
2=>3,33V
3=>5V

Gdyby liczyć wg Twojego wzoru to by wyszło: 1=> 5/4=1,25 i by się mapowało:
0=>0V
1=>1,25V
2=>2,5V
3=>3,75V
Czyli chyba bęłdnie, albo ja czegoś nie rozumiem.


Zresztą widzę, że w kodzie w komentarzach ludzie też obliczają dzieląc przez 1023

  • Lubię! 1
Link do komentarza
Share on other sites

@voidtec witam na forum 🙂 Ten temat był tutaj omawiany wiele razy - zdania w tej kwestii są podzielone.

7 godzin temu, voidtec napisał:

Zresztą widzę, że w kodzie w komentarzach ludzie też obliczają dzieląc przez 1023

Dzieje się tak, ponieważ pierwotnie w kursie było właśnie pokazane dzielenie przez 1023, a później zostało zaktualizowane na 1024.

Jedna z dyskusji na ten temat:

 

  • Lubię! 1
Link do komentarza
Share on other sites

Hej 😄  mam problem z zadaniem 4.5 program nie chce wczytywać danych kiedy jest w instrukcji if dotyczącej wciśnięcia przycisku. Zaczyna działać dopiero kiedy oddzielam reszte if'ow(kod nr.2) i zastanawiam sie czym jest to spowodowane.

#define zielona 10
#define zolta 13
#define czerwona 11
#define przycisk 12
#define potencjometr A5
int wartoscLosu = 0;
String userInput = "";
int intInput = 0;
int proby = 0;

void setup() {

  Serial.begin(9600);
  pinMode(czerwona, OUTPUT);
  pinMode(zielona, OUTPUT);
  pinMode(zolta, OUTPUT);
  pinMode(przycisk, INPUT_PULLUP);
  Serial.println("Losuj");
}

void loop() {

  if (digitalRead(przycisk) == LOW) {
    wartoscLosu = analogRead(potencjometr);
    Serial.println("Podaj liczbę");

    if (Serial.available() > 0) {
    userInput = Serial.readStringUntil('\n');
    Serial.println(userInput);
    intInput = userInput.toInt();
    if (intInput <= (wartoscLosu + 50) && intInput >= (wartoscLosu - 50) ) {
      digitalWrite(zielona, HIGH);
      digitalWrite(czerwona, LOW);
      digitalWrite(zolta, LOW);
      Serial.println("Wygrałeś");
    } else if (proby < 2) {
      digitalWrite(zolta, HIGH);
      digitalWrite(zielona, LOW);
      digitalWrite(czerwona, LOW);

      proby++;
    } else {
      digitalWrite(czerwona, HIGH);
      digitalWrite(zielona, LOW);
      digitalWrite(zolta, LOW);
      Serial.println("Przegrałeś");

    }

  }
  }
}
#define zielona 10
#define zolta 13
#define czerwona 11
#define przycisk 12
#define potencjometr A5
int wartoscLosu = 0;
String userInput = "";
int intInput = 0;
int proby = 0;

void setup() {

  Serial.begin(9600);
  pinMode(czerwona, OUTPUT);
  pinMode(zielona, OUTPUT);
  pinMode(zolta, OUTPUT);
  pinMode(przycisk, INPUT_PULLUP);
  Serial.println("Losuj");
}

void loop() {

  if (digitalRead(przycisk) == LOW) {
    wartoscLosu = analogRead(potencjometr);
    Serial.println("Podaj liczbę");
  }

  if (Serial.available() > 0) {
    userInput = Serial.readStringUntil('\n');
    Serial.println(userInput);
    intInput = userInput.toInt();
    if (intInput <= (wartoscLosu + 50) && intInput >= (wartoscLosu - 50) ) {
      digitalWrite(zielona, HIGH);
      digitalWrite(czerwona, LOW);
      digitalWrite(zolta, LOW);
      Serial.println("Wygrałeś");
    } else if (proby < 2) {
      digitalWrite(zolta, HIGH);
      digitalWrite(zielona, LOW);
      digitalWrite(czerwona, LOW);

      proby++;
    } else {
      digitalWrite(czerwona, HIGH);
      digitalWrite(zielona, LOW);
      digitalWrite(zolta, LOW);
      Serial.println("Przegrałeś");

    }

  }
}

 

Link do komentarza
Share on other sites

@adrianrogalski witam na forum! W pierwszym przypadku program powinien działać poprawnie, jeśli trzymasz cały czas wciśnięty przycisk, a chyba nie o to tu chodziło 😉 Zwróć uwagę, że program w takiej formie sprawdza czy odebrano jakieś dane przez UART tylko "natychmiast po wciśnięciu przycisku", a nie cały czas. Musisz sprawić, że program poczeka do momentu podania danych lub zapętlić część, w której odbierane są dane 🙂

  • Pomogłeś! 1
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.