Skocz do zawartości

Pomocna odpowiedź

Tak wcześniej pisałem to sobie w notatniku. Wydaje mi się że program powinien działać, tylko jakbym nie kombinował z nawiasami to albo nie reaguje na przycisk/wpisanie wartości (jak pisałem {delay(25);}  ), albo wykonuje wszystko bez względu na to czy coś wcisnę, napiszę ( jak piszę {delay(25); ...} , jak wyżej  ).  

(edytowany)
void loop() 
{
  Serial.println("Ustaw potencjometr i wciśnij przycisk"); // drukujesz komunikat ok
  odczytanaWartosc = analogRead(A5); // odczytujesz wartość z potencjometru po co?
  Serial.println(odczytanaWartosc);	// drukujesz jego warość po co? No chyba że chwilowo do testów
  while (odczytanaWartosc >= 0)	// dopóki warunek jest prawdziwy (odczytana wartość jest większa/równa 0 ??) taki warunek jest zawsze spełniony i co on niby ci daje??
  {					// to wykonuje się pętla
    delay(25);		// czekaj 25 			
    while (digitalRead(11) == LOW)	// kiedy przycisk wciśnięty	
    {														
      Serial.println("Podaj liczbe od 20 do 1023:"); // drukuj Podaj liczbę...
      while (Serial.available() == 0)	// kiedy nic nie wpisałeś w terminalu...
      {							
        delay(25);				// czekaj 25
        while (proby < 3)
        {

na pewno tak to miało wyglądać? 

Edytowano przez Screwdriv

{ delay(25);    tutaj już nie mają już sensu, wcześniej stosowałem je z nawiasem z obu stron {delay(25);}   ,po to żeby program w tym miejscu wpadał w pustą pętlę, do momentu aż gracz wciśnie przycisk lub wpisze liczbę. Nie chciało mi to działać, ponieważ program się zatrzymywał i nie reagował. To jest cały mój problem,  żeby program w tych miejscach zatrzymał się, a po otrzymaniu sygnału od gracza (wciśnięty przycisk, wpisana liczba), działał dalej.

Wszystko co było jest nieaktualne. W końcu i ja zrozumiałem o co chodzi 🙂

Teraz już działa

zad 4.5

String liczbastring = "";
int odczytanaWartosc = 0;
int liczba = 0;
int roznica = 0;
int proby = 0;
int poczatek = 0;


void setup() {
  Serial.begin(9600);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, INPUT_PULLUP);
  pinMode(A5, INPUT);

  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
}

void loop()
{
  if (poczatek == 0)
  {
    poczatek = 1;
    Serial.println("Ustaw potencjometr i wciśnij przycisk");
    odczytanaWartosc = analogRead(A5);
      
  while (digitalRead(11) == HIGH)
  {
    delay(25);
  }
  }
  if (digitalRead(11) == LOW)
  {
    Serial.println("Podaj liczbe od 20 do 1023: (możesz sie pomylić o +/-50");
    while (digitalRead(11) == LOW)
    {
      delay(25);
    }
  }
  else
  {
    if (proby < 3)
    {
      if (Serial.available() > 0)
      {
        liczbastring = Serial.readStringUntil('\n');
        liczba = liczbastring.toInt();
        Serial.println(liczba);

        roznica = liczba - odczytanaWartosc;
        if (roznica <= 50 && roznica >= -50)
        {
          Serial.println("WYGRAŁEŚ");
          digitalWrite(9, LOW);
          digitalWrite(8, HIGH);
          delay(3000);
          digitalWrite(8, LOW);
          poczatek = 0;
          proby = 0;
        }
        else
        {
          proby = proby + 1;
          if (proby < 3)
          {
          Serial.println("błędna odpowiedz, spróbuj jeszcze raz");
          digitalWrite(9, HIGH);
          }
        }
      }
    }
    else
    { 
      Serial.println("PRZEGRAŁEŚ");
      digitalWrite(9, LOW);
      digitalWrite(10, HIGH);
      delay(3000);
      digitalWrite(10, LOW);
      poczatek = 0;
      proby = 0;
    } 
  } 
}

 

  • Lubię! 2
(edytowany)

Zadanie 4.4 Może być?

int odczytanaWartosc = 0;//Zmienna do przechowania odczytu z ADC
int prog = 0;//Próg włączenia światła - ustawiany potencjometrem
float napiecie = 0;//Wartość przeliczona na napiecie

void setup() {
  Serial.begin(9600);//Uruchomienie komunikacji przez USART
  pinMode(8, OUTPUT); //Konfiguracja wyjść pod diode LED
  if (8,HIGH) {//Gdy dioda swieci
  napiecie = analogRead(A5);//Odczytujemy wartosc napięcia
  napiecie = napiecie * (5.0/1024.0);//Przeliczenie wartosci odczytanej w napiecie
  Serial.println(napiecie);//Wysyłamy zmierzone napiecie
  }
}

void loop() {
  odczytanaWartosc = analogRead(A5);//Odczytane wartośći z ADC
  prog = analogRead(A4);//Odczytanie wartości z ADC

  if (odczytanaWartosc < prog) {//Czy jest ciemniej od ustawionego progu?
    digitalWrite(8, HIGH);// Włączenie diody
  } else {
    digitalWrite(8, LOW); //Wyłączenie diody
  }
  delay(50);
}

 

Edytowano przez Vova

@Vova oj tutaj chyba jest coś źle, nie "zjadłeś czegoś"?

if (8,HIGH) {//Gdy dioda swieci

Ten warunek będzie zawsze prawdziwy (w obecnej formie).

(edytowany)

Moje rozwiązanie zadania 4.5

 

int losowa=0;
String odpowiedz="";
int licznik=0;

void setup()
{
  Serial.begin(9600);
  pinMode(5,INPUT_PULLUP);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT); 
  pinMode(8, OUTPUT);
  pinMode(A4, INPUT);
}

void loop()
{
  if (digitalRead(5)==LOW){
    losowa=analogRead(A4);
    Serial.println("Podaj liczbe:");  
 	digitalWrite(6,LOW);
    digitalWrite(7,LOW);
    digitalWrite(8,LOW);
    licznik=2;
    delay(200);
  	Serial.println(losowa); //kontrolne wyswietlenie wylosowanej liczby
  }
  
  if (Serial.available() > 0) {
    odpowiedz=Serial.readStringUntil('\n');
    if ((odpowiedz.toInt()>losowa-50) & (odpowiedz.toInt()<losowa+50)) {
      digitalWrite(6,HIGH);
      Serial.println("BRAWO!");
      licznik=licznik-1;
    }
    else if (licznik>=1) {
      digitalWrite(7,HIGH);
      Serial.println("ZLE! pozostalo prob: " + String(licznik));
      licznik=licznik-1;
      digitalWrite(7,LOW);
    }
    else { 
      digitalWrite(8,HIGH);
      Serial.println("ZLE! Przegrales. Prawidlowa odpowiedz to "+ String(losowa));    
  }
  }
}

W konsoli wygląda to tak:

 

Podaj liczbe:
737
ZLE! pozostalo prob: 2
ZLE! pozostalo prob: 1
ZLE! Przegrales. Prawidlowa odpowiedz to 733
Podaj liczbe:
532
ZLE! pozostalo prob: 2
BRAWO!

 

arduino.png

Edytowano przez spider_pajak
  • Lubię! 1

@spider_pajak witam na forum! Fajnie, że udało się rozwiązać zadanie - powodzenia podczas dalszych eksperymentów 🙂

if ((odpowiedz.toInt()>losowa-50) & (odpowiedz.toInt()<losowa+50)) {

Ale tutaj masz chyba mały błąd - widzisz o co chodzi? 😉

Trzeba by to na spokojnie przeanalizować. Spójnik & działa tuaj pewnie jako Bitwise AND, czyli działa jako operator bitowy. Mądrzejsze głowy muszą się wypowiedzieć, bo ja też dopiero zaczynam przygodę z programowaniem w c++ 🙂

  • Lubię! 1

@spider_pajak w tym przypadku "&" robi u Ciebie za operator bitowy. Może to działać, ale to przypadek i nie działa tak jak sobie wyobrażasz, bo operator ten nie służy do łączenia warunków. Gdyby warunki były były trochę inne to już by nie działało 🙂 Nie ma co zagłębiać się w ten temat na samym początku - na razie najlepiej przyjąć, że przy łączeniu warunków trzeba tam wpisać "&&" lub po prostu można rozbić to na 2 osobne warunki.

  • Lubię! 2
(edytowany)

Witam, chciałbym się też pochwalić zadaniem 4.5 zadziałało, ale musiałem trochę przy tym poświęcić czasu i trochę się wspomóc forum 😉

#define zolta 8  // przypisanie nazw do pinów
#define zielona 9
#define czerwona 10
#define przycisk 3
#define pin_odczyt A4

int odczyt = 0; // zmienna potrzebna do odczytu z potencjometru
String podana_liczba = ""; // zmienna typu string podawana na terminalu
int podana_liczba_int = 0; // zmienna potrzebna do zmiany liczby ze stringa na int
int proby = 2; // ilosc prob 
boolean jeszcze_raz = true; // zmienna potrzebna do zagrania jeszcze raz w gre

void setup() {
 pinMode (przycisk, INPUT_PULLUP); // ustawienia początkowe ledów 
 pinMode (zolta, OUTPUT);
 pinMode (zielona,OUTPUT);
 pinMode ( czerwona, OUTPUT);
 Serial.begin(9600);
}
void loop() {
  if (jeszcze_raz == true) {    // jesli jeszcze raz jest w stanie wysokim to wykonaj:
      proby = 2;
      digitalWrite (zolta, LOW); 
      digitalWrite (zielona,LOW);
      digitalWrite (czerwona, LOW);

      while(!Serial) delay(10); // czekam na otwarcie okna dialogowego
      Serial.println ( "Przekrec potencjometr i nacisnij przycisk");

      while(digitalRead(przycisk) == HIGH) delay(20); // czekam na wcisniecie przycisku 
      odczyt = analogRead(pin_odczyt); // odczyt wartosci z potencjometru
      Serial.println ("podaj liczbe \n powinna byc w zakresie od 0 - 1023"); 
      Serial.println ( " Wygrasz jeżeli pomylisz się nie więcej niż o 50");
      Serial.println ( "Powodzenia"); 
  }

  while (Serial.available() == 0); // czekamy na podanie liczby
  podana_liczba = Serial.readStringUntil('\n');
  podana_liczba_int = podana_liczba.toInt(); // przeksztalcenie liczby typu string na int

  if ( odczyt - podana_liczba_int <=50 && odczyt-podana_liczba_int >= -50) { // jesli liczba mieści sie w zakresie to wygrałeś
    Serial.println (" Wygrałes, ustawiona liczba to: " );
    Serial.println (odczyt);
    digitalWrite( zielona, HIGH);
    digitalWrite( zolta, LOW);
    Serial.println( "Jesli chcesz grac jeszcze raz nacisnij przycisk");
    while(digitalRead(przycisk) == HIGH) delay(20);
    delay(500); // opóźnienie dla przycisku żeby nie przeskoczył do kolejnej linijki kodu zbyt szybko
    jeszcze_raz = true; // zaczynamy od nowa

  } else {
     if (proby > 0){
        jeszcze_raz = false; // nie zaczynamy od nowa
        digitalWrite ( zolta, HIGH);
        digitalWrite ( czerwona, LOW);
        //proby = proby -1;
        Serial.println (" niestety liczba jest z poza zakresu zostało Ci: ");
        Serial.println (proby);
        Serial.println ( "prob, podaj liczbe");
        proby = proby -1; // przypisanie nowej wartosci dla proby 
     }  else { // bez prób
        digitalWrite(czerwona, HIGH); 
        digitalWrite(zolta, LOW);
        Serial.println ( " przegrales, ustawiona liczba to:");
        Serial.println (odczyt);
        Serial.println ("jesli chcesz zagrac jeszcze raz, nacisnij przycisk");
        while(digitalRead(przycisk) == HIGH) delay(20);
        jeszcze_raz = true;
        
     }
    
     delay (500); // opóźnienie do wciskania przycisku gdy wartosc byla mniejsza przechodzil odrazu za daleko w programie
  }
  

}

 

Edytowano przez kristof900
źle wstawiony kod

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