Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

Dzięki bardzo za rady! Z tym switch casem nie wpadłem na pomysł rzeczywiście... A co do tej róznicy czemu nagle dodaje do niej 8. 😄 Myślałem żeby zobić to w ten sposób, że w zależnosci od wartości różnicy taka dioda się włącza, po prostu pokiełbasiłem w tych ifach. Miałem tą informację wykorzystać do tego, która dioda powinna świecić, ale jak widać nie zaimplementowałem tego ;(. Ale mimo to kod mógłby być nieczytelny.

Udostępnij ten post


Link to post
Share on other sites

Dzień dobry,

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.

ard_3_4.png

Udostępnij ten post


Link to post
Share on other sites

@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

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites

Owszem jest 🙂

Tutaj:
 

odczytL = map(odczytL, 10, 1020, 1, 5);
odczytR = map(odczytL, 10, 1020, 1, 5);

Widzisz?

  • Lubię! 1
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

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!

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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. ; )

Udostępnij ten post


Link to post
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?

Udostępnij ten post


Link to post
Share on other sites
Serial.print(napiecie);
Serial.println("V");

"ln" przy słowie print przerzuca do następnej linijki. 

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

super bardzo dziękuję!

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

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

 

Udostępnij ten post


Link to post
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😉

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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!

Gość
Napisz odpowiedź...

×   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...