Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Czy zadanie 4.5 w ogóle da się zrobić wykorzystując wiedzę TYLKO zaczerpniętą z tego kursu? Bo na moje to wychodzi, że nie....

Kolejne pytanko, zanim włączę grę przyciskiem, wpisuje sobie losowo jakieś liczby do terminala(niech będzie, że 5 różnych liczb). Dlaczego po naciśnięciu przycisku 5 razy, Arduino  wszystkie je "wypluwa", gdzie i w jaki sposób je przechowuje? Skoro wartość podana przez terminal jest przypisywana zmiennej, to każde nowe wprowadzenie powinno zmienić przypis?

 

#define greenLed 8
#define yellowLed 9
#define redLed 10

#define startButton 13
int generatedNumber = 0;
String stringNumber = "";
int intNumber = 0;
int tryCounter = 0;



void setup() {
  Serial.begin(9600);

  pinMode(greenLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(redLed, OUTPUT);
  pinMode(startButton, INPUT_PULLUP);

  digitalWrite(greenLed, LOW);
  digitalWrite(yellowLed, LOW);
  digitalWrite(redLed, LOW);




}

void loop() {
  //generatedNumber = analogRead(A5); //
  if (digitalRead(startButton) == LOW) {
   Serial.println("Enter the number");   
       
    if (Serial.available() > 0) {
      stringNumber = Serial.readStringUntil('\n'); //
     intNumber = stringNumber.toInt(); // convert string to int
     Serial.println(intNumber);
    }
  }


  delay(250);



}

 

 

Edytowano przez Rakragul
Link do komentarza
Share on other sites

Dnia 25.07.2019 o 23:22, Rakragul napisał:

Czy zadanie 4.5 w ogóle da się zrobić wykorzystując wiedzę TYLKO zaczerpniętą z tego kursu? Bo na moje to wychodzi, że nie....

Tak masz rację, jest tutaj mały podstęp, bo trzeba wygooglać jak zamienić odebrany tekst na liczbę 😉

Dnia 25.07.2019 o 23:22, Rakragul napisał:

Kolejne pytanko, zanim włączę grę przyciskiem, wpisuje sobie losowo jakieś liczby do terminala(niech będzie, że 5 różnych liczb). Dlaczego po naciśnięciu przycisku 5 razy, Arduino  wszystkie je "wypluwa", gdzie i w jaki sposób je przechowuje? Skoro wartość podana przez terminal jest przypisywana zmiennej, to każde nowe wprowadzenie powinno zmienić przypis?

Wszystkie dane trzymane są w buforze (to działa "w tle"). Więc faktycznie, Arduino zapamiętuje wartości wysłane do niego przed rozpoczęciem gry. Ten problem można jednak rozwiązać bardzo prosto. Wystarczy, że po rozpoczęciu gry odczytasz szybko wszystkie dane z bufora i zwyczajnie nic z nimi nie zrobisz 😉

Link do komentarza
Share on other sites

@emBeb0n nie jest to błędem, ale przy najbliższej okazji będę ujednolicał ten zapis. Dzięki za zwrócenie uwagi 🙂

Tutaj masz przykład z dokumentacji Arduino:

Cytat

 All Arduino boards have at least one serial port (also known as a UART or USART), and some have several.

Źródło: https://www.arduino.cc/reference/en/language/functions/communication/serial/

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

"Jeśli wysłana do Arduino liczba będzie zgadzała się z odczytem ADC o +/- 50, to gracz wygrywa. W przeciwnym wypadku włącza się żółta dioda i gracz ma jeszcze 2 próby. Gdy za każdym razem zostanie wpisana zła liczba, to na płytce stykowej włącza się czerwona dioda. Natomiast w przypadku wygranej zielona."

Nie do końca rozumiem jak zinterpretować ten tekst. Gdy podam złą liczbę, nie mieszczącą się w zakresie to ma zapalić się żółta i czerwona, czy raz żółta a raz czerwona, czy obie na raz?

Może po 3 próbach ma się zapalić czerwona, ale czy wtedy ma się zapalić też żółta?

 

Link do komentarza
Share on other sites

@husadam5 czerwona dioda powinna włączać się w momencie, gdy gracz przegra (czyli za każdym razem wpisze złą wartość). Dioda pomarańczowa ma sygnalizować błędne podanie wartości, może (ale nie musi) świecić się po trzeciej złej odpowiedzi. To nie jest tutaj kluczowe 😉

Link do komentarza
Share on other sites

Cześć,

Napisałem taki program w którym jedna z diod (skrajna lewa - 12) nie chce się zapalać. Pozostałe 4 działają superaśnie. Czy ktoś jest w stanie mi pomóc z tym probemem?

#define LF A0
#define PF A5

int roznica=0;
int fotoLewy=0;
int fotoPrawy=0;
String fotoPrawy_Str="";
String fotoLewy_Str="";
String roznica_Str="";


void setup() {
  Serial.begin(9600);       //Uruchomienie komunikacji z PC
  pinMode(8,OUTPUT);   //Konfiguracja wyjść diod
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT); 

}

void loop(){
  fotoLewy=analogRead(LF);
  fotoPrawy=analogRead(PF);
  
  delay(1000);
  fotoPrawy_Str=fotoPrawy;
  fotoLewy_Str=fotoLewy;
  
  
  Serial.println("Lewy  " + fotoLewy_Str + "                          Prawy  " + fotoPrawy_Str);

  
  roznica =   analogRead(LF)-analogRead(PF); 
  roznica_Str = roznica;
  Serial.println("            Różnica" + roznica_Str);
    
  roznica = map(roznica, -1000, 1000, 1, 5);//Przeskalowanie wartości
  
  
  if (roznica == 1) { //Skrajna prawa dioda
      digitalWrite(8, HIGH); 
      digitalWrite(9, LOW); 
      digitalWrite(10, LOW); 
      digitalWrite(11, LOW); 
      digitalWrite(12, LOW); 
  } else if (roznica == 2) { //prawa dioda
      digitalWrite(8, LOW); 
      digitalWrite(9, HIGH); 
      digitalWrite(10, LOW); 
      digitalWrite(11, LOW); 
      digitalWrite(12, LOW);       
  } else if (roznica == 3) {  //środkowa dioda
      digitalWrite(8, LOW); 
      digitalWrite(9, LOW); 
      digitalWrite(10, HIGH); 
      digitalWrite(11, LOW); 
      digitalWrite(12, LOW);       
  } else if (roznica == 4) {  //lewa dioda
      digitalWrite(8, LOW); 
      digitalWrite(9, LOW); 
      digitalWrite(10, LOW); 
      digitalWrite(11, HIGH); 
      digitalWrite(12, LOW);       
  } else if (roznica == 5){  //skrajna lewa dioda
      digitalWrite(8, LOW); 
      digitalWrite(9, LOW); 
      digitalWrite(10, LOW); 
      digitalWrite(11, LOW); 
      digitalWrite(12, HIGH);       
  }
  delay(50);
  
  
}

 

Link do komentarza
Share on other sites

@Xanatos witam na forum 🙂 A sprawdziłeś czy zmienna różnica przyjmuje kiedykolwiek taką wartość, która powinna włączyć tę diodę? Jakie maksymalnie różnice odczytów fotorezystorów uzyskujesz?

PS Kody programów należy umieszczać za pomocą odpowiedniego narzędzia dostępnego w edytorze (przycisk "Wstaw kod"). Programy są wtedy prezentowane w czytelny sposób, a ich składania jest kolorowana. Tym razem poprawiłem to za Ciebie, ale pamiętaj o tej opcji w przyszłości. Z góry dziękuję za zrozumienie 🙂

Link do komentarza
Share on other sites

7 minut temu, Treker napisał:

@Xanatos witam na forum 🙂 A sprawdziłeś czy zmienna różnica przyjmuje kiedykolwiek taką wartość, która powinna włączyć tę diodę? Jakie maksymalnie różnice odczytów fotorezystorów uzyskujesz?

PS Kody programów należy umieszczać za pomocą odpowiedniego narzędzia dostępnego w edytorze (przycisk "Wstaw kod"). Programy są wtedy prezentowane w czytelny sposób, a ich składania jest kolorowana. Tym razem poprawiłem to za Ciebie, ale pamiętaj o tej opcji w przyszłości. Z góry dziękuję za zrozumienie 🙂

Ok, będę pamiętał 🙂 Dzięki za pomoc. Problem rozwiązała zmiana wartości wyjściowej z 1 , 5  na 1, 6

Link do komentarza
Share on other sites

int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC
int prog = 0;
float napiecie = 0;
bool asis = 0;

void setup() {
  pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED
  Serial.begin(9600);
}

void loop() {
  odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC
  prog = analogRead(A4);
 
  if (odczytanaWartosc < prog) {
    digitalWrite(8, HIGH);//Włączenie diody
    if (asis == 0) {
      napiecie = odczytanaWartosc * 5.0 / 1023.0;
         Serial.println("Napięcie wynosi "+(napiecie)+" Voltów");
    }
    asis = 1;
  } else {
     digitalWrite(8, LOW);//Wyłączenie diody
    asis = 0;
  }
 
  delay(50);
}

Zastanawia mnie, dlaczego 'Serial.println("Napięcie wynosi "+(napiecie)+" Voltów");' zostaje uznane za błąd.

Link do komentarza
Share on other sites

@Itap88 witam na forum 🙂

11 godzin temu, Itap88 napisał:

Zastanawia mnie, dlaczego 'Serial.println("Napięcie wynosi "+(napiecie)+" Voltów");' zostaje uznane za błąd.

Taki zapis nie działa, ponieważ nie można w takim przypadku łączyć operatorem plusa 3 wartości. Możesz to rozpisać na dwie linijki lub wykorzystać bardziej zaawansowaną funkcję sprintf (ale to na początku może wydawać się trochę trudne). Więcej na ten temat znajdziesz w dokumentacji Arduino: https://forum.arduino.cc/index.php?topic=324733.0

PS Kody programów należy umieszczać za pomocą odpowiedniego narzędzia dostępnego w edytorze (przycisk "Wstaw kod"). Programy są wtedy prezentowane w czytelny sposób, a ich składania jest kolorowana. Tym razem poprawiłem to za Ciebie, ale pamiętaj o tej opcji w przyszłości. Z góry dziękuję za zrozumienie i pomoc w utrzymaniu porządku na forum 😉

Link do komentarza
Share on other sites

int lives;
int right;
int guess;
String sent;

void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, INPUT);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  Serial.begin(9600);
  lives = 3;
  right = analogRead(A5);
}

void loop() {
  if(lives == 0){
    digitalWrite(10, HIGH);
    return;
  }else{
    Serial.println("Podaj liczbę");
    while(Serial.available() == 0){}
    sent = Serial.readStringUntil('\n');
    guess = sent.toInt();
    if((right - 50) < guess < (right + 50)){
      digitalWrite(8, HIGH);
      return;
    }else{
      digitalWrite(9, HIGH);
      lives = lives - 1;
    }
  }
}

Próbowałem zrobić zadanie 4.5. Wydaje mi się, że ten kod powinien działać, ale zielona(8) i żółta(9) dioda nie zapalają się w ogóle, a czerwona(10) włączyła się tylko raz po podaniu 3 błędnych odpowiedzi. Potencjometr jest podłączony do A5, a jako przycisk postanowiłem użyć tego już wbudowanego w płytkę. Co zrobiłem źle?

Link do komentarza
Share on other sites

2 minuty temu, Itap88 napisał:

Potencjometr jest podłączony do A5, a jako przycisk postanowiłem użyć tego już wbudowanego w płytkę. Co zrobiłem źle?

@Itap88 zacznijmy od najważniejszego... Na Arduino UNO nie ma żadnego przycisku, który można wykorzystać we własnych programach. Jest tam ewentualnie tylko RESET... Co dokładnie wykorzystałeś w roli przycisku? Po drugie w Arduino nie można tworzyć warunków tego typu:

if((right - 50) < guess < (right + 50)){

Jest wiele sposobów na rozwiązanie tego problemu (np. najprostszy to rozbicie tego na dwa warunki), ale na pewno nie można robić tego tak, jak w cytowanym tutaj fragmencie.

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