Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

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

    }

  }
}

 

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

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

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

"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?

 

Udostępnij ten post


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

Udostępnij ten post


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

 

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

@Xanatos to nie jest rozwiązanie problemu tylko jego obejście 😉 Podejrzyj jakie warto pojawiają się w tych zmiennych i zmień odpowiednio zakres danych wejściowych.

Udostępnij ten post


Link to post
Share on other sites

Ok pozmieniałem zakres danych wejściowych na wartości trochę mniejsze od tych pojawiających się w zmiennych i też działa 🙂

  • Lubię! 1

Udostępnij ten post


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

Udostępnij ten post


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

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