Skocz do zawartości
Komentator

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.

Udostępnij ten post


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.

Udostępnij ten post


Link to post
Share on other sites

daniel7745, _kursSprzet

Udostępnij ten post


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

     }


   }
 }
}

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

Fakt o komentarzach zapomniałem 🙂. Nie bardzo rozumiem o co miało by chodzić z tym

proba++;

Udostępnij ten post


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 😉

Udostępnij ten post


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 🙂

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

Witam.

Czy można liczbę wprowadzoną z klawiatury przez Serial.read przypisac do typu int bez przekształcania typu String na int?

Udostępnij ten post


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?

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

Pakos, dziękuję za sugestię przyjrzę się temu podczas aktualizacji kursu 🙂

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ść
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...