Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Elsefor, w takim przypadku najlepiej spróbować sobie pomóc przez dodanie większej ilości miejsc, w której wysyłasz informacja do komputera. Zacznij np. od wyświetlania wartości obu zmierzonych wyjść A4 i A5. Sprawdź później, czy program wchodzi w odpowiednie warunki właśnie wtedy, gdy się tego spodziewasz. Sprawdzaj krok, po kroku. Dla ułatwienia możesz na końcu pętli dodać sobie opóźnienie, aby danych wysyłanych do komputera było mniej - dzięki temu łatwiej będzie analizować Ci, to co pojawi się w terminalu.

Link to post
Share on other sites

Zastanawia mnie jedna rzecz, dlaczego mój monitor portu szeregowego pokazuje mi tylko 750 kombinacji?

Dodam, że korzystam z Arduino Nano i zasilam swoją płytkę stykową z diodami napięciem 3.3 V. To raczej nie ma wpływu na ilość kombinacji. Bo domyślam się że przetwornik jest również 10 bitowy, bo gdyby był 8 to dochodziło by do 256 kombinacji. Jeśli się mylę, poprawcie mnie.

Link to post
Share on other sites

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

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 to post
Share on other sites

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 😉

Link to post
Share on other sites

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

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.