Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


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

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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
Link do komentarza
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

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

@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
Link do komentarza
Share on other sites

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
Link do komentarza
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.