Skocz do zawartości

Pomocna odpowiedź

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

  • 5 tygodnie później...

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

  • 4 tygodnie później...

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

 

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

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

 

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

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

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

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.

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

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?

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...