Skocz do zawartości

Pomocna odpowiedź

co wiecej kiedy dopisalem komende by wyswietlal na koputerze wartosci cyftrowe napiec to pokazuje caly przekroj od 1 do 5, ale diody przy wartosci 4 i 5 sie nie zapalaja...

przepraszam za zamieszanie, znalazlem blad. przyporzadkowalem dla 3 diody nie znak  == a znak  =co powodowalo ze uklad klinowal sie na wartosci napiecia 3 i nie chcial isc w gore, a tylko w dól. pozdrawiam.

  • Lubię! 2

witam. podziele sie swoim rozwiazaniem zadania domowego 4,5 z. na plytce program dziala. ale byc moze mozna to bylo jakos bardziej eleganccko napiac. jesli tak to poprosze o rady. pozdrawiam

# define zielona 12
# define zolta 11
# define czerwona 10
int zagadka = 0; // wynik liczbowy z potencjometru
bool jedenKomunikat = true;
String wpisanaLiczba = "";
int liczbaGracza = 0; // liczba gracza do porownania
int zakresMin = 0; // określenie dolnego zakresu wygranej
int zakresMax = 0; // okreslenie gornego zakresu wygranej
int licznikProb = 0; //okresla ilosc szans ktorą ma gracz
 
void setup() {
pinMode(zielona, OUTPUT); //wyjscie diody zielonej
pinMode(zolta, OUTPUT); //wyjscie diody zoltej
pinMode(czerwona, OUTPUT); //wyjscie diody czerwonej
pinMode(9, INPUT_PULLUP); //wejscie przycisku styku
digitalWrite(zielona, LOW); // diody są wyłączone
digitalWrite(zolta, LOW);
digitalWrite(czerwona, LOW);
Serial.begin(9600);// ustalenie komunikacji z komputerem
}
void loop() {
  zagadka = analogRead(A5); // przyporzadkuj zagadce wynik z potencjometru
  zakresMin = zagadka - 50; // okresl zakres wartosci wygrywajacych zgodnie z wynikiem potencjometru
  zakresMax = zagadka + 50;
   while (digitalRead(9) == LOW) { // jesli jest właczony przycisk włacznika
    if (jedenKomunikat == true) {
  Serial.println("podaj liczbę"); //napisz na ekranie ' podaj liczbe'
  jedenKomunikat = false; // napisz tylko raz ten komunikat
    } // zakonczenie petli if
  } // zakończenie while
  if (Serial.available() > 0) { // jesli gracz napisze jakąś liczbe
  wpisanaLiczba = Serial.readStringUntil('\n'); //przeczytaj te liczbe
  liczbaGracza = wpisanaLiczba.toInt(); // i zamien na zapis cyfrowy
  if (liczbaGracza >= zakresMin && liczbaGracza <= zakresMax ) { // jesli wpisana liczba miesci sie w zakresei wygranej
  digitalWrite(zielona, HIGH); // mignij zielona dioda
  delay(1000); 
  digitalWrite(zielona, LOW); 
  } else { //w innym przypdaku gry liczba gracza nie miesci sie w zakresie wygranej
  if (licznikProb == 2) { // i jesli wyczerpal sie limit prob
    digitalWrite(czerwona, HIGH); //zakoncz gre mignieciem czerwonej diody
    delay(1000);
    digitalWrite(czerwona, LOW);
    delay(1000);
    licznikProb = 0; // daj ponownie 3 szanse grającemu
  } else { // jesli gracz ma jeszcze szanse
  digitalWrite(zolta, HIGH); //mignij zolta dioda
  delay(1000); 
  digitalWrite(zolta, LOW); 
  licznikProb = licznikProb + 1; // zmniejsz limit szans
 
  } //zakonczenie petli else
  } // zakonczenie petli else
  } // zakonczenie petli if
} //zakończenie loop
  • 1 miesiąc później...
(edytowany)

Moja wersja zadania domowego 4.5 - może komuś kiedyś się przyda 🙂

 

Zadanie 4.5

#define redDiodePin 8
#define yellowDiodePin 9
#define greenDiodePin 10
#define buttonPin 13
#define analogPin A4
#define buffor 50

int trialCounter = 0;

void setup() {
  Serial.begin(9600);
  pinMode(redDiodePin, OUTPUT); //Konfiguracja wyjść pod diodę LED
  pinMode(yellowDiodePin, OUTPUT); //Konfiguracja wyjść pod diodę LED
  pinMode(greenDiodePin, OUTPUT); //Konfiguracja wyjść pod diodę LED
  pinMode(buttonPin, INPUT_PULLUP);

  digitalWrite(redDiodePin, LOW);
  digitalWrite(yellowDiodePin, LOW);
  digitalWrite(greenDiodePin, LOW);
}

void turnDiodeOn(bool success)
{
  if(success)
  {
    digitalWrite(greenDiodePin, HIGH);
    trialCounter = 0;
  }
  else if(trialCounter <= 2)
  {
    digitalWrite(yellowDiodePin, HIGH);
  }
  else
  {
    digitalWrite(redDiodePin, HIGH);
    trialCounter = 0;
  }
 
  delay(1000);
  digitalWrite(greenDiodePin, LOW);
  digitalWrite(yellowDiodePin, LOW);
  digitalWrite(redDiodePin, LOW);
}

void loop()
{
  if(digitalRead(buttonPin) == LOW) //przycisk nacisniety
  {
    if(Serial.available() > 0)
    {
      String userInput = Serial.readStringUntil('\n');
      int userNumber = userInput.toInt();
      if(userNumber || userInput=="0")
      {
        trialCounter++;
        int adcValue = analogRead(analogPin);
        bool success = userNumber >= adcValue-buffor && userNumber <= adcValue+buffor;
        turnDiodeOn(success);
      }
      else
      {
        Serial.print("Wprowadzony tekst: '");
        Serial.print(userInput);
        Serial.println("' nie jest liczba!"); 
      }
    }
    else
    {
      Serial.println("Nie podano liczby!"); 
    }

    while(digitalRead(buttonPin) == LOW) {}; //czekamy na puszczenie przycisku
  }
}

 

Edytowano przez swirus
  • Lubię! 1
(edytowany)
Dnia 3.11.2025 o 21:55, zabek napisał:

witam. podziele sie swoim rozwiazaniem zadania domowego 4,5 z. na plytce program dziala. ale byc moze mozna to bylo jakos bardziej eleganccko napiac. jesli tak to poprosze o rady. pozdrawiam

# define zielona 12
# define zolta 11
# define czerwona 10
int zagadka = 0; // wynik liczbowy z potencjometru
bool jedenKomunikat = true;
String wpisanaLiczba = "";
int liczbaGracza = 0; // liczba gracza do porownania
int zakresMin = 0; // określenie dolnego zakresu wygranej
int zakresMax = 0; // okreslenie gornego zakresu wygranej
int licznikProb = 0; //okresla ilosc szans ktorą ma gracz
 
void setup() {
pinMode(zielona, OUTPUT); //wyjscie diody zielonej
pinMode(zolta, OUTPUT); //wyjscie diody zoltej
pinMode(czerwona, OUTPUT); //wyjscie diody czerwonej
pinMode(9, INPUT_PULLUP); //wejscie przycisku styku
digitalWrite(zielona, LOW); // diody są wyłączone
digitalWrite(zolta, LOW);
digitalWrite(czerwona, LOW);
Serial.begin(9600);// ustalenie komunikacji z komputerem
}
void loop() {
  zagadka = analogRead(A5); // przyporzadkuj zagadce wynik z potencjometru
  zakresMin = zagadka - 50; // okresl zakres wartosci wygrywajacych zgodnie z wynikiem potencjometru
  zakresMax = zagadka + 50;
   while (digitalRead(9) == LOW) { // jesli jest właczony przycisk włacznika
    if (jedenKomunikat == true) {
  Serial.println("podaj liczbę"); //napisz na ekranie ' podaj liczbe'
  jedenKomunikat = false; // napisz tylko raz ten komunikat
    } // zakonczenie petli if
  } // zakończenie while
  if (Serial.available() > 0) { // jesli gracz napisze jakąś liczbe
  wpisanaLiczba = Serial.readStringUntil('\n'); //przeczytaj te liczbe
  liczbaGracza = wpisanaLiczba.toInt(); // i zamien na zapis cyfrowy
  if (liczbaGracza >= zakresMin && liczbaGracza <= zakresMax ) { // jesli wpisana liczba miesci sie w zakresei wygranej
  digitalWrite(zielona, HIGH); // mignij zielona dioda
  delay(1000); 
  digitalWrite(zielona, LOW); 
  } else { //w innym przypdaku gry liczba gracza nie miesci sie w zakresie wygranej
  if (licznikProb == 2) { // i jesli wyczerpal sie limit prob
    digitalWrite(czerwona, HIGH); //zakoncz gre mignieciem czerwonej diody
    delay(1000);
    digitalWrite(czerwona, LOW);
    delay(1000);
    licznikProb = 0; // daj ponownie 3 szanse grającemu
  } else { // jesli gracz ma jeszcze szanse
  digitalWrite(zolta, HIGH); //mignij zolta dioda
  delay(1000); 
  digitalWrite(zolta, LOW); 
  licznikProb = licznikProb + 1; // zmniejsz limit szans
 
  } //zakonczenie petli else
  } // zakonczenie petli else
  } // zakonczenie petli if
} //zakończenie loop

 

A jak zachowa sie Twoj program gdy uzytkownik wpisze litery zamiast cyfr a AnalogRead zwroci wynik mniejszy od 50, np. 40? 🙂 Bedzie wygrana, a to chyba bledne zachowanie 🙂

Edytowano przez swirus
  • Lubię! 1
  • 3 miesiące później...
(edytowany)

Witam, naprawdę fajny kurs. Do chwili obecnej zjadałem go jak wściekły ale w końcu trafiła kosa na kamień 😂😂😂.

Zadanie z grą przysporzyło mi problemów, spędziłem przy nim około 3h i chciałem się podzielić moim rozwiązaniem jego, chętnie też wysłucham wszelakich podpowiedzi odnośnie mojego kodu. Pozdrawiam Serdecznie.

#include <Arduino.h>

#define ledRed 2
#define ledGreen 4
#define ledYellow 3
#define button 8

int wartoscPotencometru = 0;
int odczytanaLiczbaInt = 0;
String odczytanaLiczba = "";
byte szanse = 3;


void sprawdzanie(){
  if(odczytanaLiczbaInt - wartoscPotencometru >= -50 && odczytanaLiczbaInt - wartoscPotencometru <= 50){  // sprawdzanie czy wprowadzona liczba jest w zakresie +/- 50 od wartości potencjometru
  Serial.println("Brawo trafiłeś");
  digitalWrite(ledGreen, HIGH);
  delay(1000);
  digitalWrite(ledGreen, LOW);
  }else{          // jeśli liczba jest poza zakresem +/- 50 od wartości potencjometru
  szanse = szanse - 1;
    Serial.println("Pódło, spróbuj ponownie " + String(szanse) + " szansy");
  digitalWrite(ledRed, HIGH);
  delay(1000);
  digitalWrite(ledRed, LOW);
  }
}


void szprawdzanieSzans(){
  if(szanse <= 2 && szanse > 0){    // jeśli użytkownik ma 2 lub mniej ale więcej niż 0 szans, zapal żółtą diodę i wyświetl komunikat "Spróbuj ponownie"
    digitalWrite(ledYellow, HIGH);
    Serial.println("Spróbuj ponownie");
  }else if (szanse == 0){       // jeśli użytkownik stracił wszystkie szanse, zapal czerwoną diodę i wyświetl komunikat "Przegrałeś naciśnij reset na Arduino"  
    digitalWrite(ledYellow, LOW);
    digitalWrite(ledRed, HIGH);
    Serial.println("Przegrałeś naciśnij reset na Arduino");
    while(true){}    // zatrzymaj program, aby użytkownik musiał zresetować Arduino, aby zagrać ponownie
  }
}


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(ledYellow, OUTPUT);
  pinMode(button, INPUT_PULLUP);

}


void loop() {
  // put your main code here, to run repeatedly:
  while (!Serial){        // czekaj aż port szeregowy będzie gotowy
    delay(100);
  }
  
  Serial.println("Przekręć potencjometr i naciśnij przycisk");
  
  while(digitalRead(button) == HIGH){}     // czekaj aż przycisk zostanie naciśnięty
  wartoscPotencometru = analogRead(A5);   // odczytaj wartość potencjometru i zapisz ją do zmiennej
  

  Serial.print("Podaj Liczbe z zakresu od 0 do 1023: ");

  while (Serial.available() == 0){} // czekaj aż użytkownik wprowadzi dane przez port szeregowy
    
  while (Serial.available() > 0){
    odczytanaLiczba = Serial.readStringUntil('\n');
    odczytanaLiczbaInt = odczytanaLiczba.toInt(); // konwertuj wprowadzoną liczbę na typ int
  }

  sprawdzanie();    //wywołuje funkcje sprawdzania wyniku
  
  szprawdzanieSzans();    //wywołuje funkcje sprawdzania szans

}

Jeszcze chciałem pokazać swój kod odnośnie zadania z diodami LED efekt fajny ale mam wątpliwości czy oto chodziło

#define lRed 2
#define lYellow 3
#define cGreen 4
#define rYellow 5
#define rRed 6

int wartoscLewa = 0;
int wartoscPrawa = 0;
int skalowanaLewa = 0;
int skalowanaPrawa = 0;

void lewaStrona(){    // Funkcja dla lewej strony, która zapala odpowiednie diody w zależności od wartości odczytanej z fotorezystora. Im większa wartość, tym więcej diod się zapala.
    if(skalowanaLewa == -1){    // -1, bo mapowanie jest od -1 do -3
    digitalWrite(cGreen, HIGH);
    digitalWrite(lYellow, LOW);
    digitalWrite(lRed, LOW);
  }

  if(skalowanaLewa == -2){  // -2, bo mapowanie jest od -1 do -3
    digitalWrite(cGreen, HIGH);
    digitalWrite(lYellow, HIGH);
    digitalWrite(lRed, LOW);
  }

  if(skalowanaLewa == -3){  // -3, bo mapowanie jest od -1 do -3
    digitalWrite(cGreen, HIGH);
    digitalWrite(lYellow, HIGH);
    digitalWrite(lRed, HIGH);
  }
  
}

void prawaStrona(){   // Funkcja dla prawej strony, która zapala odpowiednie diody w zależności od wartości odczytanej z fotorezystora. Im większa wartość, tym więcej diod się zapala. 
  if(skalowanaPrawa == 1){    // 1, bo mapowanie jest od 1 do 3
    digitalWrite(cGreen, HIGH);
    digitalWrite(rYellow, LOW);
    digitalWrite(rRed, LOW);
  }

  if(skalowanaPrawa == 2){    // 2, bo mapowanie jest od 1 do 3
    digitalWrite(cGreen, HIGH);
    digitalWrite(rYellow, HIGH);
    digitalWrite(rRed, LOW);
  }
  
  if(skalowanaPrawa == 3){   // 3, bo mapowanie jest od 1 do 3
    digitalWrite(cGreen, HIGH);
    digitalWrite(rYellow, HIGH);
    digitalWrite(rRed, HIGH);
  }
}

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

  pinMode(lRed, OUTPUT);
  pinMode(lYellow, OUTPUT);
  pinMode(cGreen, OUTPUT);
  pinMode(rYellow, OUTPUT);
  pinMode(rRed, OUTPUT);
}


void loop(){
  wartoscLewa = analogRead(A5);
  wartoscPrawa = analogRead(A4);
  skalowanaLewa = map(wartoscLewa, 0, 500, -1, -3);   //Mapowanie wartości odczytanych z fotorezystorów na zakres od -1 do -3 dla lewej strony
  skalowanaPrawa = map(wartoscPrawa, 0, 500, 1, 3);   //i od 1 do 3 dla prawej strony.

  if(wartoscLewa > wartoscPrawa){   // Jeśli wartość z lewej strony jest większa niż z prawej, zapala diody po lewej stronie i gasi po prawej.
    lewaStrona();
    digitalWrite(rYellow, LOW);
    digitalWrite(rRed, LOW);
  }
  
  if(wartoscLewa < wartoscPrawa){   // Jeśli wartość z prawej strony jest większa niż z lewej, zapala diody po prawej stronie i gasi po lewej.
    prawaStrona();
    digitalWrite(lYellow, LOW);
    digitalWrite(lRed, LOW);
  }
  delay(100);
}

 

Edytowano przez DonDiego
Dodanie kodo od zadania z ledami

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