Skocz do zawartości

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

    }

  }
}

 

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

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

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

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

 

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 😉

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

 

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 🙂

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

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.

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 😉

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.