Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Cześć, Mam problem ze swoim kodem co do zadania 4.5. Mianowicie działa OK, ale nie wiem, gdzie powinienem wkleić linijkę, która wyświetla napis "Podaj liczbę"? Teraz Arduino wyświetla mi ten napis przy każdorazowym kliknięciu i niestety wyświetla go również przy ostatniej próbie, co dziwnie wygląda, bo wyświetlane są napisy:

Podaj liczbę
koniec gry
Nowa gra 

A powinno być wyświetlane bez linijki podaj liczbę. Z kolei jak przeniosę linijkę kodu odpowiedzialną za wyswietlanie tego napisu, pod warunek liczniknac to po kliknięciu guzika Arduino cały czas wysyła do komputera napis Podaj liczbę, co wygląda jeszcze gorzej niż w poprzednim wypadku. Prosze wytłumaczcie mi gdzie powinienem wpisać tą linijkę wyświetlająca napis, aby została wyświetlona tylko raz i dlaczego?

 

Mój kod:

#define diodac 8 // dioda czerwona
#define diodazo 9 // dioda zolta
#define diodaz 10 // dioda zielona
#define guzik 11 // Przycisk
int losowanie = 0;
String liczba = ""; // Pusty ciag odebranych danych
int intliczba = 0;
int liczniknac = 0;

void setup() {
Serial.begin(9600); // uruchomienie transmisji z UART 
pinMode(diodac, OUTPUT); // konf pinu 8 jako wyjscie
pinMode(diodazo, OUTPUT); // konf pinu 9 jako wyjscie
pinMode(diodaz, OUTPUT); // konf pinu 10 jako wyjscie
pinMode(guzik, INPUT_PULLUP); // konf pinu 11 jako wyjscie


digitalWrite(diodac, LOW); // wylaczenie diod
digitalWrite(diodazo, LOW);
digitalWrite(diodaz, LOW);
liczniknac=0;
}

void loop() {
 
losowanie=analogRead(A4); // Odczytujemy losową liczbę na potencjometrze

while (digitalRead(guzik) == LOW) { // Jesli wcisniemy przycisk
  liczniknac = liczniknac + 1; // zwieksz licznik nac o 1
  delay(1000);
  Serial.println("Podaj liczbe");
}
if(liczniknac == 1) {  
  if(Serial.available() > 0) { //Czy Arduino odebrało dane
       liczba = Serial.readStringUntil('\n');  //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba
       intliczba = liczba.toInt(); // konwersja slowa na liczbe
       if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) {
        Serial.println("Wygrana!!");
        digitalWrite(diodaz, HIGH);
        digitalWrite(diodac, LOW);
        digitalWrite(diodazo, LOW);
       }
       if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) {
        Serial.println("Spróbuj jeszcze raz");
        digitalWrite(diodazo, HIGH);
        digitalWrite(diodac, LOW);
        digitalWrite(diodaz, LOW);
       }
}
}
if(liczniknac == 2) {  
  if(Serial.available() > 0) { //Czy Arduino odebrało dane
       liczba = Serial.readStringUntil('\n');  //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba
       intliczba = liczba.toInt(); // konwersja slowa na liczbe
       if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) {
        Serial.println("Wygrana!!");
        digitalWrite(diodaz, HIGH);
        digitalWrite(diodac, LOW);
        digitalWrite(diodazo, LOW);
       }
       if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) {
        Serial.println("Spróbuj jeszcze raz");
        digitalWrite(diodazo, HIGH);
        digitalWrite(diodac, LOW);
        digitalWrite(diodaz, LOW);
       }
}
}
if(liczniknac == 3) {  
  if(Serial.available() > 0) { //Czy Arduino odebrało dane
       liczba = Serial.readStringUntil('\n');  //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba
       intliczba = liczba.toInt(); // konwersja slowa na liczbe
       if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) {
        Serial.println("Wygrana!!");
        digitalWrite(diodaz, HIGH);
        digitalWrite(diodac, LOW);
        digitalWrite(diodazo, LOW);
       }
       if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) {
        Serial.println("Spróbuj jeszcze raz");
        digitalWrite(diodazo, HIGH);
        digitalWrite(diodac, LOW);
        digitalWrite(diodaz, LOW);
       }
}
}
if(liczniknac >3) {
  Serial.println("Koniec Gry");
        digitalWrite(diodaz, LOW);
        digitalWrite(diodac, HIGH);
        digitalWrite(diodazo, LOW);
        liczniknac=0;
        Serial.println("Nowa gra.");
}
}

 

Edytowano przez lleymann
Link do komentarza
Share on other sites

@lleymann witam na forum 🙂 Zacznijmy od tego, że trzeba tu zrobić jakiś mały porządek w tym programie - dlaczego masz tam zmienną "liczniknac" i spora część programu jest powielona 3 razy. Jak to miało działać? Opisz słownie proszę co chciałeś osiągnąć.

Link do komentarza
Share on other sites

#define diodac 8 // dioda czerwona
#define diodazo 9 // dioda zolta
#define diodaz 10 // dioda zielona
#define guzik 11 // Przycisk
int losowanie = 0; // zdefiniowanie zmiennej losowanie
String liczba = ""; // Pusty ciag odebranych danych inaczej podana liczba
int intliczba = 0; // konwersja podanej liczby na wartosc liczbowa, zaczerpnalem to z forum
int liczniknac = 0; // licznik nacisniec guzika, zeby zliczac 3 proby

void setup() {
Serial.begin(9600); // uruchomienie transmisji z UART 
pinMode(diodac, OUTPUT); // konf pinu 8 jako wyjscie
pinMode(diodazo, OUTPUT); // konf pinu 9 jako wyjscie
pinMode(diodaz, OUTPUT); // konf pinu 10 jako wyjscie
pinMode(guzik, INPUT_PULLUP); // konf pinu 11 jako guzika


digitalWrite(diodac, LOW); // wylaczenie diod
digitalWrite(diodazo, LOW);
digitalWrite(diodaz, LOW);
liczniknac=0; // ustawienie licznika nacisniec na 0
}

void loop() {
 
losowanie=analogRead(A4); // Odczytujemy losową liczbę na potencjometrze

while (digitalRead(guzik) == LOW) { // Jesli wcisniemy przycisk
  liczniknac = liczniknac + 1; // zwieksz licznik nac o 1
  delay(1000); // czekamy 1 sekunde, aby guzik nie naciskal sie wiecej razy
  Serial.println("Podaj liczbe"); // wyswietlamy napis podaj liczbe
}
if(liczniknac == 1) {  // Jesli licznik nac bedzie rowny 1 wtedy realizujemy ponizsze warunki
  if(Serial.available() > 0) { //Czy Arduino odebrało dane w zsensie wpisana liczbe
       liczba = Serial.readStringUntil('\n');  //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba
       intliczba = liczba.toInt(); // konwersja slowa na liczbe
       if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { // Jesli wpisana liczba spelnia podany warunek
        Serial.println("Wygrana!!");// Wyswietlany jest napis wygrana
        digitalWrite(diodaz, HIGH); // I zapalana zielona dioda
        digitalWrite(diodac, LOW);
        digitalWrite(diodazo, LOW);
       }
       if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) { // Jesli wpisana liczba nie miesci sie w przedziale
        Serial.println("Spróbuj jeszcze raz"); // wyswietlany napis sprobuj jeszcze raz
        digitalWrite(diodazo, HIGH); // I zapala się dioda zolta
        digitalWrite(diodac, LOW);
        digitalWrite(diodaz, LOW);
       }
}
}
if(liczniknac == 2) {   // Jesli licznik nac bedzie rowny 2 wtedy realizujemy ponizsze warunki
  if(Serial.available() > 0) { //Czy Arduino odebrało dane
       liczba = Serial.readStringUntil('\n');  //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba
       intliczba = liczba.toInt(); // konwersja slowa na liczbe
       if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { // Jesli wpisana liczba spelnia podany warunek
        Serial.println("Wygrana!!"); // Wyswietlany jest napis wygran
        digitalWrite(diodaz, HIGH);// I zapalana zielona dioda
        digitalWrite(diodac, LOW);
        digitalWrite(diodazo, LOW);
       }
       if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) {// Jesli wpisana liczba nie miesci sie w przedziale
        Serial.println("Spróbuj jeszcze raz");// wyswietlany napis sprobuj jeszcze raz
        digitalWrite(diodazo, HIGH);// I zapala się dioda zolta
        digitalWrite(diodac, LOW);
        digitalWrite(diodaz, LOW);
       }
}
}
if(liczniknac == 3) {  // Jesli licznik nac bedzie rowny 3 wtedy realizujemy ponizsze warunki
  if(Serial.available() > 0) { //Czy Arduino odebrało dane
       liczba = Serial.readStringUntil('\n');  //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba
       intliczba = liczba.toInt(); // konwersja slowa na liczbe
       if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) {// Jesli wpisana liczba spelnia podany warunek
        Serial.println("Wygrana!!"); // Wyswietlany jest napis wygran
        digitalWrite(diodaz, HIGH);// I zapalana zielona dioda
        digitalWrite(diodac, LOW);
        digitalWrite(diodazo, LOW);
       }
       if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) {// Jesli wpisana liczba nie miesci sie w przedziale
        Serial.println("Spróbuj jeszcze raz");// wyswietlany napis sprobuj jeszcze raz
        digitalWrite(diodazo, HIGH);// I zapala się dioda zolta
        digitalWrite(diodac, LOW);
        digitalWrite(diodaz, LOW);
       }
}
}
if(liczniknac >3) { // Jesli guzik jest już naciskany 4 raz 
  Serial.println("Koniec Gry"); // wyswtielany ma byc napis Koniec gry
        digitalWrite(diodaz, LOW);
        digitalWrite(diodac, HIGH); // Zapalana jest czerwona dioda
        digitalWrite(diodazo, LOW);
        liczniknac=0; // licznik naciśnięć jest zerowany
        Serial.println("Nowa gra."); // wyswietlany jest napis nowa gra i mozna grać od nowa
}
}

Uzupełniłem kod o opis poszczególnych linii. W trakcie opisywania zauważyłem, że trochę "łopatologicznie" podszedłem do tego. Ponieważ łatwo można skrócić kod używając tylko 2-óch warunków (liczniknac < lub =3      i        liczniknac > 3), zamiast wpisywać 4 warunki ( liczniknac = 1; =2; =3; >3). Ale to nie rozwiązuje mojego problemu z tym napisem podaj liczbę. Nie wiem dlaczego, ale w poprzednich programach też miałem problem z ciągłym powielaniem jakiejś czynności. Wiem dlaczego tak się dzieje (ponieważ program wykonuje to w pętli), ale nie wiem jak sobie z tym poradzić. 

Jeszcze taki krótki opis słowny, jak program miał działać:
Chciałem, żeby przy każdorazowym kliknięciu guzika wyświetlany był napisa podaj liczbę. Podajemy liczbę, program sprawdza, czy mieści się w przedziale, jesli tak wyświetlany jest napis wygrana i zielona dioda, jesli nie to żółta i napis sprubuj jeszcze raz. Po 4-tym kliknięciu guzika zapala sie czerwona dioda napis koniec gry i nowa gra, a oprócz tego wyświetla mi się jeszcze nad nimi napis Podaj liczbę, który chciałbym zlikwidować

 

Pochwalę się, że jak miałem 14 lat (teraz 30) to udało mi się napisać cały kalkulator w takim programie Delphi6 (nie wiem, czy to jeszcze istnieje i jaki tam był język, ale tez były finkcje takie jak tutaj, oprócz tego void loop i void setup). A teraz mam problem z napisaniem takiej wydawałoby się łatwej rzeczy.

Edytowano przez lleymann
Link do komentarza
Share on other sites

@lleymann proponuję w takim razie najpierw zrobić porządek z tym programem i go skrócić. Pokombinuj jak to zrobić, aby nie trzeba było tego wszystkiego powielać - zrób tak, aby pozbyć się tego kodu, który jest powielony 3 razy (powinien być tylko raz). Wiem, że nie o to pytasz, ale zaufaj, że tak będzie lepiej - najpierw trzeba to "zwinąć" do krótszej, poprawnej formy 🙂

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

Poprawiłem, sprawdziłem, działa, tylko nie wiem jak się pozbyć tego napisu: Podaj liczbę po zakończeniu gry.

#define diodac 8 // dioda czerwona
#define diodazo 9 // dioda zolta
#define diodaz 10 // dioda zielona
#define guzik 11 // Przycisk
int losowanie = 0;// zdefiniowanie zmiennej losowanie
String liczba = ""; // Pusty ciag odebranych danych
int intliczba = 0;// konwersja podanej liczby na wartosc liczbowa, zaczerpnalem to z forum
int liczniknac = 0;// licznik nacisniec guzika, zeby zliczac 3 proby

void setup() {
Serial.begin(9600); // uruchomienie transmisji z UART 
pinMode(diodac, OUTPUT); // konf pinu 8 jako wyjscie
pinMode(diodazo, OUTPUT); // konf pinu 9 jako wyjscie
pinMode(diodaz, OUTPUT); // konf pinu 10 jako wyjscie
pinMode(guzik, INPUT_PULLUP); // konf pinu 11 jako przycisku


digitalWrite(diodac, LOW); // wylaczenie diod
digitalWrite(diodazo, LOW);
digitalWrite(diodaz, LOW);
liczniknac=0; // ustawienie licznika nacisniec na 0
}

void loop() {
 
losowanie=analogRead(A4); // Odczytujemy losową liczbę na potencjometrze

while (digitalRead(guzik) == LOW) { // Jesli wcisniemy przycisk
  liczniknac = liczniknac + 1; // zwieksz licznik nac o 1
  delay(1000); // Czekamy 1 sek
  Serial.println("Podaj liczbe"); // Wyswietlamy Podaj Liczbę
}
if((liczniknac == 3) or (liczniknac < 3)) {  // Jesli licznik nac bedzie równy lub mniejszy 3 wtedy realizujemy ponizsze warunki
  if(Serial.available() > 0) { //Czy Arduino odebrało dane
       liczba = Serial.readStringUntil('\n');  //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba
       intliczba = liczba.toInt(); // konwersja slowa na liczbe
       if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { // Jesli wpisana liczba spelnia podany warunek
        Serial.println("Wygrana!!");// Wyswietlany jest napis wygrana
        digitalWrite(diodaz, HIGH);// I zapalana zielona dioda
        digitalWrite(diodac, LOW);
        digitalWrite(diodazo, LOW);
       }
       if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) {// Jesli wpisana liczba nie miesci sie w przedziale
        Serial.println("Spróbuj jeszcze raz");// wyswietlany napis sprobuj jeszcze raz
        digitalWrite(diodazo, HIGH);// I zapala się dioda zolta
        digitalWrite(diodac, LOW);
        digitalWrite(diodaz, LOW);
       }
}
}
if(liczniknac >3) {// Jesli guzik jest już naciskany 4 raz 
  Serial.println("Koniec Gry");// wyswtielany ma byc napis Koniec gry
        digitalWrite(diodaz, LOW);
        digitalWrite(diodac, HIGH);// Zapalana jest czerwona dioda
        digitalWrite(diodazo, LOW);
        liczniknac=0;// licznik naciśnięć jest zerowany
        Serial.println("Nowa gra.");// wyswietlany jest napis nowa gra i mozna grać od nowa
}
}

 

Link do komentarza
Share on other sites

Czy chodzi Ci o takie coś:

#define diodac 8 // dioda czerwona
#define diodazo 9 // dioda zolta
#define diodaz 10 // dioda zielona
#define guzik 11 // Przycisk
int losowanie = 0;// zdefiniowanie zmiennej losowanie
String liczba = ""; // Pusty ciag odebranych danych
int intliczba = 0;// konwersja podanej liczby na wartosc liczbowa, zaczerpnalem to z forum
int liczniknac = 0;// licznik nacisniec guzika, zeby zliczac 3 proby

void setup() {
Serial.begin(9600); // uruchomienie transmisji z UART 
pinMode(diodac, OUTPUT); // konf pinu 8 jako wyjscie
pinMode(diodazo, OUTPUT); // konf pinu 9 jako wyjscie
pinMode(diodaz, OUTPUT); // konf pinu 10 jako wyjscie
pinMode(guzik, INPUT_PULLUP); // konf pinu 11 jako przycisku


digitalWrite(diodac, LOW); // wylaczenie diod
digitalWrite(diodazo, LOW);
digitalWrite(diodaz, LOW);
liczniknac=0; // ustawienie licznika nacisniec na 0
}

void loop() {
 
losowanie=analogRead(A4); // Odczytujemy losową liczbę na potencjometrze

while (digitalRead(guzik) == LOW) { // Jesli wcisniemy przycisk
  liczniknac = liczniknac + 1; // zwieksz licznik nac o 1
  delay(1000); // Czekamy 1 sek
  Serial.println("Podaj liczbe"); // Wyswietlamy Podaj Liczbę
}
if((liczniknac == 3) or (liczniknac < 3)) {  // Jesli licznik nac bedzie równy lub mniejszy 3 wtedy realizujemy ponizsze warunki
  if(Serial.available() > 0) { //Czy Arduino odebrało dane
       liczba = Serial.readStringUntil('\n');  //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba
       intliczba = liczba.toInt(); // konwersja slowa na liczbe
       if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { // Jesli wpisana liczba spelnia podany warunek
        Serial.println("Wygrana!!");// Wyswietlany jest napis wygrana
        digitalWrite(diodaz, HIGH);// I zapalana zielona dioda
        digitalWrite(diodac, LOW);
        digitalWrite(diodazo, LOW);
       }
       else  {// Jesli wpisana liczba nie miesci sie w przedziale
        Serial.println("Spróbuj jeszcze raz");// wyswietlany napis sprobuj jeszcze raz
        digitalWrite(diodazo, HIGH);// I zapala się dioda zolta
        digitalWrite(diodac, LOW);
        digitalWrite(diodaz, LOW);
       }
}
}
if(liczniknac >3) {// Jesli guzik jest już naciskany 4 raz 
  Serial.println("Koniec Gry");// wyswtielany ma byc napis Koniec gry
        digitalWrite(diodaz, LOW);
        digitalWrite(diodac, HIGH);// Zapalana jest czerwona dioda
        digitalWrite(diodazo, LOW);
        liczniknac=0;// licznik naciśnięć jest zerowany
        Serial.println("Nowa gra.");// wyswietlany jest napis nowa gra i mozna grać od nowa
}
}

 

Link do komentarza
Share on other sites

@lleymann dobrze, dobrze, to teraz dalej 😉 Skróć to: "(liczniknac == 3) or (liczniknac < 3)" - znak mniejszy/większy to nie jedyne operatory porównania w Arduino. Do tego pozbądź się jeszcze tego warunku "if(liczniknac >3) {// Jesli guzik jest już naciskany 4 raz".

Link do komentarza
Share on other sites

@Treker czy chodziło o takie poprawki?

#define diodac 8 // dioda czerwona
#define diodazo 9 // dioda zolta
#define diodaz 10 // dioda zielona
#define guzik 11 // Przycisk
int losowanie = 0;// zdefiniowanie zmiennej losowanie
String liczba = ""; // Pusty ciag odebranych danych
int intliczba = 0;// konwersja podanej liczby na wartosc liczbowa, zaczerpnalem to z forum
int liczniknac = 0;// licznik nacisniec guzika, zeby zliczac 3 proby

void setup() {
Serial.begin(9600); // uruchomienie transmisji z UART 
pinMode(diodac, OUTPUT); // konf pinu 8 jako wyjscie
pinMode(diodazo, OUTPUT); // konf pinu 9 jako wyjscie
pinMode(diodaz, OUTPUT); // konf pinu 10 jako wyjscie
pinMode(guzik, INPUT_PULLUP); // konf pinu 11 jako przycisku


digitalWrite(diodac, LOW); // wylaczenie diod
digitalWrite(diodazo, LOW);
digitalWrite(diodaz, LOW);
liczniknac=0; // ustawienie licznika nacisniec na 0
}

void loop() {
 
losowanie=analogRead(A4); // Odczytujemy losową liczbę na potencjometrze

while (digitalRead(guzik) == LOW) { // Jesli wcisniemy przycisk
  liczniknac = liczniknac + 1; // zwieksz licznik nac o 1
  delay(1000); // Czekamy 1 sek
  Serial.println("Podaj liczbe"); // Wyswietlamy Podaj Liczbę
}
if(liczniknac <= 3) {  // Jesli licznik nac bedzie równy lub mniejszy 3 wtedy realizujemy ponizsze warunki
  if(Serial.available() > 0) { //Czy Arduino odebrało dane
       liczba = Serial.readStringUntil('\n');  //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba
       intliczba = liczba.toInt(); // konwersja slowa na liczbe
       if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { // Jesli wpisana liczba spelnia podany warunek
        Serial.println("Wygrana!!");// Wyswietlany jest napis wygrana
        digitalWrite(diodaz, HIGH);// I zapalana zielona dioda
        digitalWrite(diodac, LOW);
        digitalWrite(diodazo, LOW);
       }
       else  {// Jesli wpisana liczba nie miesci sie w przedziale
        Serial.println("Spróbuj jeszcze raz");// wyswietlany napis sprobuj jeszcze raz
        digitalWrite(diodazo, HIGH);// I zapala się dioda zolta
        digitalWrite(diodac, LOW);
        digitalWrite(diodaz, LOW);
       }
}
}
else {// Jesli guzik jest już naciskany 4 raz 
  Serial.println("Koniec Gry");// wyswtielany ma byc napis Koniec gry
        digitalWrite(diodaz, LOW);
        digitalWrite(diodac, HIGH);// Zapalana jest czerwona dioda
        digitalWrite(diodazo, LOW);
        liczniknac=0;// licznik naciśnięć jest zerowany
        Serial.println("Nowa gra.");// wyswietlany jest napis nowa gra i mozna grać od nowa
}
}

 

Link do komentarza
Share on other sites

Przesyłam moje zadania

4.4

#define zielonaD 7

int wartoscFoto = 0;
int wartoscPot = 0;
boolean powiadomienie = false;

void setup() {
  pinMode(zielonaD, OUTPUT);

  digitalWrite(zielonaD, LOW);
  Serial.begin(9600);
}

void loop() {
  wartoscPot = analogRead(A4);
  wartoscFoto = analogRead(A5);
  

  if (wartoscFoto < wartoscPot) {
    digitalWrite(zielonaD, HIGH);
    if (powiadomienie == false) {
      Serial.println("wlaczono swiatlo!");
      powiadomienie = true;
    }
  } else {
    digitalWrite(zielonaD, LOW);
    if (powiadomienie == true) {
      Serial.println("wyłączono swiatlo!");
      powiadomienie = false;
    }
  }
  delay(50);
}

4.5

int wartoscPot = 0; //Zmienna potencjometru
int szukanaWartosc = 0; //Wartość która gracz próbuje zgadnac

String podanaLiczba = ""; //Pusty ciąg odebranych danych
int podanaLiczba_int = 0;

int proba = 0; //Ilosc prób 

boolean grawlaczona = false; //Zmienna określa stan gry

#define przycisk 7
#define zielonaD 8
#define pomaranczowaD1 9
#define pomaranczowaD2 10
#define czerwonaD 11

void setup() {
  pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  
  pinMode (7, INPUT_PULLUP); //Konfiguracja wejścia przycisku

  Serial.begin(9600); //Rozpoczęto komunikacje z PC

  Serial.println("Zagrajmy w grę!");
  delay(2000);
  Serial.println("Przekręć potencjometr w wybrane przec Ciebie miejsce! \nNastępnie wciśnij przycisk aby zacząć gre!");

  digitalWrite(zielonaD, LOW); //Wyłączenie zielonej diody
  digitalWrite(pomaranczowaD1, LOW); //Wyłączenie 1 pomaranczowej diody
  digitalWrite(pomaranczowaD2, LOW); //Wyłączenie 2 pomaranczowej diody
  digitalWrite(czerwonaD, LOW); //Wyłączenie czerwonej diody

}
 
void loop() {
wartoscPot = analogRead(A4);//Odczytanie wartości z potencjometru  
  
if (digitalRead(przycisk) == LOW) {
  szukanaWartosc = wartoscPot;
  Serial.println("Teraz podaj szukaną wartość w zakresie 0-1023!");
  digitalWrite(zielonaD, LOW); //Wyłączenie zielonej diody
  digitalWrite(pomaranczowaD1, LOW); //Wyłączenie 1 pomaranczowej diody
  digitalWrite(pomaranczowaD2, LOW); //Wyłączenie 2 pomaranczowej diody
  digitalWrite(czerwonaD, LOW); //Wyłączenie czerwonej diody
  grawlaczona = true; //właczono gre
  delay(500);
  }
  
if (Serial.available() > 0 && grawlaczona == true) { //Czy arduino odebrało dane?
  podanaLiczba = Serial.readStringUntil('\n'); //Zapisujemy podana Liczbę
  podanaLiczba_int = podanaLiczba.toInt ();
  
    if (podanaLiczba_int < szukanaWartosc + 50 && podanaLiczba_int > szukanaWartosc - 50 && proba <= 3) { //Określenie przedzialu poprawnej odpowiedzi
      Serial.print("Brawo! Poprawna odpowiedź! A dokładna wartosć to:");
      Serial.println(szukanaWartosc);
      digitalWrite(zielonaD, HIGH);
      digitalWrite(pomaranczowaD1, LOW); //Wyłączenie 1 pomaranczowej diody
      digitalWrite(pomaranczowaD2, LOW); //Wyłączenie 2 pomaranczowej diody
      digitalWrite(czerwonaD, LOW); //Wyłączenie czerwonej diody
      delay(5000);
      digitalWrite(zielonaD, LOW);
      proba = 0;
      Serial.println("Przekręć potencjometr potem wcisnij przycisk aby zagrac ponownie!");
      grawlaczona = false; //Wylaczono gre
    } else if (proba <= 2) {
      Serial.println("Błędna wartość!!");
      digitalWrite(pomaranczowaD1, HIGH);
      if (proba == 1) {
        digitalWrite(pomaranczowaD2, HIGH);
      }
      proba ++;
    } 
    if (proba == 3) {
      Serial.print("Wykorzystałeś wszystkie próby! Naciśnij przycisk i spróbuj ponownie! \n Poprawna odpowiedz wynosiła: ");
      Serial.println(szukanaWartosc);
      digitalWrite(czerwonaD, HIGH);
      grawlaczona = false; //Wylaczono gre
      delay(5000);
      digitalWrite(pomaranczowaD1, LOW); //Wyłączenie 1 pomaranczowej diody
      digitalWrite(pomaranczowaD2, LOW); //Wyłączenie 2 pomaranczowej diody
      digitalWrite(czerwonaD, LOW); //Wyłączenie czerwonej diody
      proba = 0; 
    }
  }
}

Ja trochę inaczej zrozumiałem zadanie niż w poleceniu. U mnie po naciśnięciu przycisku zapisuje szukaną wartość z potencjometru i włącza gre.

Pozdrawiam :]

Edytowano przez Achtenbob
  • Lubię! 1
Link do komentarza
Share on other sites

@lleymann tak, już dużo lepiej 🙂 Tylko dla formalności pamiętaj jeszcze, że zamiast:

}
else {// Jesli guzik jest już naciskany 4 raz 

Lepiej jest formatować ten fragment programu w taki sposób:

} else {// Jesli guzik jest już naciskany 4 raz 

To teraz jeszcze raz zobacz na cały swój kod i pomyśl czy wiesz jak rozwiązać swój pierwotny program, jak nie to daj znać - będzie myśleć razem 😉

Link do komentarza
Share on other sites

@Treker wybacz, ale poddaje się, już od godziny próbuje. Nawet próbowałem na ślepo wklejać tą komendę w poszczególne miejsca, ale nic z tego. Wydaje mi się, że to nie jest kwestia miejsca, a jakiejś dodatkowej funkcji. Tylko pytanie, czy ma być to funkcja if, while, czy jeszcze jakaś inna, bo widzę, że niektórzy zastosowali u siebie jakieś wartości true/false.

Link do komentarza
Share on other sites

Siemka,

Przesyłam zadanko 4.6 :]

#define DiodaCzerwonaLewa 9
#define DiodaZoltaLewa 8
#define DiodaZielona 7
#define DiodaZoltaPrawa 6
#define DiodaCzerwonaPrawa 5

int CzerwonaWl = 125; //wloczenie czerwonej diody
int ZoltaWl = 50; //wlaczenie zoltej diody

int WartoscFoto1 = 0; //Zmienna 1 fotorezystora
int WartoscFoto2 = 0; //Zmienna 2 fotorezystora


void setup() {
  Serial.begin(9600);
  
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

}

void loop() {
  WartoscFoto1 = analogRead (A5);
  WartoscFoto2 = analogRead (A4);

  Serial.print(WartoscFoto1); Serial.print("  "); Serial.println(WartoscFoto2);

  digitalWrite(DiodaCzerwonaLewa, LOW);
  digitalWrite(DiodaZoltaLewa, LOW);
  digitalWrite(DiodaZielona, LOW);
  digitalWrite(DiodaZoltaPrawa, LOW);
  digitalWrite(DiodaCzerwonaPrawa, LOW);
  
  if (WartoscFoto1 - WartoscFoto2 < -CzerwonaWl ) {
    digitalWrite(DiodaCzerwonaLewa, HIGH);
  } 
  if (WartoscFoto1 - WartoscFoto2 < -ZoltaWl) {
    digitalWrite(DiodaZoltaLewa, HIGH);
  }
  if (WartoscFoto1 >= WartoscFoto2 - ZoltaWl && WartoscFoto1 <= WartoscFoto2 + ZoltaWl) {
    digitalWrite(DiodaZielona, HIGH);
  }
  if (WartoscFoto1 - WartoscFoto2 > ZoltaWl) {
    digitalWrite(DiodaZoltaPrawa, HIGH);
  }
  if (WartoscFoto1 - WartoscFoto2 > CzerwonaWl) {
    digitalWrite(DiodaCzerwonaPrawa, HIGH);
  }
}

 

Link do komentarza
Share on other sites

@lleymann no dobrze, czyli zakładam, że to jest aktualna wersja Twojego programu (poprawiłem tylko formatowanie):

#define diodac 8 // dioda czerwona
#define diodazo 9 // dioda zolta
#define diodaz 10 // dioda zielona
#define guzik 11 // Przycisk
int losowanie = 0;// zdefiniowanie zmiennej losowanie
String liczba = ""; // Pusty ciag odebranych danych
int intliczba = 0;// konwersja podanej liczby na wartosc liczbowa, zaczerpnalem to z forum
int liczniknac = 0;// licznik nacisniec guzika, zeby zliczac 3 proby

void setup() {
  Serial.begin(9600); // uruchomienie transmisji z UART
  pinMode(diodac, OUTPUT); // konf pinu 8 jako wyjscie
  pinMode(diodazo, OUTPUT); // konf pinu 9 jako wyjscie
  pinMode(diodaz, OUTPUT); // konf pinu 10 jako wyjscie
  pinMode(guzik, INPUT_PULLUP); // konf pinu 11 jako przycisku


  digitalWrite(diodac, LOW); // wylaczenie diod
  digitalWrite(diodazo, LOW);
  digitalWrite(diodaz, LOW);
  liczniknac = 0; // ustawienie licznika nacisniec na 0
}

void loop() {

  losowanie = analogRead(A4); // Odczytujemy losową liczbę na potencjometrze

  while (digitalRead(guzik) == LOW) { // Jesli wcisniemy przycisk
    liczniknac = liczniknac + 1; // zwieksz licznik nac o 1
    delay(1000); // Czekamy 1 sek
    Serial.println("Podaj liczbe"); // Wyswietlamy Podaj Liczbę
  }
  
  if (liczniknac <= 3) { // Jesli licznik nac bedzie równy lub mniejszy 3 wtedy realizujemy ponizsze warunki
    
    if (Serial.available() > 0) { //Czy Arduino odebrało dane
      liczba = Serial.readStringUntil('\n');  //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba
      intliczba = liczba.toInt(); // konwersja slowa na liczbe
      
      if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { // Jesli wpisana liczba spelnia podany warunek
        Serial.println("Wygrana!!");// Wyswietlany jest napis wygrana
        digitalWrite(diodaz, HIGH);// I zapalana zielona dioda
        digitalWrite(diodac, LOW);
        digitalWrite(diodazo, LOW);
      } else {// Jesli wpisana liczba nie miesci sie w przedziale
        Serial.println("Spróbuj jeszcze raz");// wyswietlany napis sprobuj jeszcze raz
        digitalWrite(diodazo, HIGH);// I zapala się dioda zolta
        digitalWrite(diodac, LOW);
        digitalWrite(diodaz, LOW);
      }
      
    }
    
  } else {// Jesli guzik jest już naciskany 4 raz
    
    Serial.println("Koniec Gry");// wyswtielany ma byc napis Koniec gry
    digitalWrite(diodaz, LOW);
    digitalWrite(diodac, HIGH);// Zapalana jest czerwona dioda
    digitalWrite(diodazo, LOW);
    liczniknac = 0; // licznik naciśnięć jest zerowany
    Serial.println("Nowa gra.");// wyswietlany jest napis nowa gra i mozna grać od nowa
    
  }
}

Cały problem polega więc na tym, że poniższa linijka wykonuje się po każdym wciśnięciu przycisku, zgadza się?

Serial.println("Podaj liczbe"); // Wyswietlamy Podaj Liczbę

A chodzi Ci o to, aby była wykonywana tylko, gdy ktoś naciska przycisk pierwszy, drugi, lub trzeci raz - tak? Czyli napis ten powinien się pokazywać tylko, gdy licznik naciśnięć przycisku wskazuje wartość mniejszą lub równą 3, tak?

Link do komentarza
Share on other sites

Dzień dobry, nie wiem czy nie pytam za późno, ale zastanawiam się czy przed zmianą układu powinnam jakoś zatrzymać powtarzający się zadany proces? np po układzie z 5 diodami przed przygotowaniem układu z fotorezystorem? Albo czy jest narzucona kolejność odłączania przewodów od płytki?

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.