Skocz do zawartości

Losowanie cyfry po naciśnięciu przycisku


Pomocna odpowiedź

Miałem się już tu nie wypowiadać, ale przecieram trochę oczy z zaskoczenia. Skąd nagle u Ciebie taki kod jak poniżej? Co miałby on robić? Przeprowadź monolog do żółtej kaczuszki i wklej nam tu jego zapis.

12 godzin temu, Kenshin napisał:

      while (digitalRead(PRZYCISK) == LOW){} {
      digitalWrite(PRZYCISK, LOW);
      while (digitalRead(PRZYCISK) == HIGH){}
      digitalWrite(PRZYCISK, HIGH); //Czerwona włącz

 

Nie jestem fanem pisania za kogoś, ale spróbujmy tak. W sumie sam też kiedyś uczyłem się tak, że przepisywałem gotowce w Assemblerze z PC Kuriera i analizowałem jak działają 😉
Nie testowałem, ale poniżej powinien być działający kod (bez liczb 7,8,9, bo ich nie zdefiniowałeś, a mi się nie chciało 😉 to łatwe zadanie do uzupełnienia). Dorzuciłem kilka komentarzy do poczytania.

//Definiowanie pinów wyświetlacza i Arduino
#define SEG_C 3
#define SEG_E 6
#define SEG_D 5
#define SEG_B 7
#define SEG_G 2
#define SEG_A 11
#define SEG_F 10

//Definiowanie pinu przycisku  12 i przycisk
//Arduino UNO +5
//Arduino UNO przez rezystor 10 k GND

#define PRZYCISK 12
#define CZAS_WYSWIETLANIA_LICZBY 2000

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

  pinMode(PRZYCISK, INPUT_PULLUP);

  //Konfiguracja pinow jako wyjscia
  pinMode(SEG_A, OUTPUT);
  pinMode(SEG_B, OUTPUT);
  pinMode(SEG_C, OUTPUT);
  pinMode(SEG_D, OUTPUT);
  pinMode(SEG_E, OUTPUT);
  pinMode(SEG_F, OUTPUT);
  pinMode(SEG_G, OUTPUT);
}

void loop() {
  int losowaLiczba = random(1, 7);
  Serial.println(losowaLiczba);

  if (digitalRead(PRZYCISK) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
    wyswietlacz(losowaLiczba); //Wyswietl wartosc na wyswietlaczu
    delay(CZAS_WYSWIETLANIA_LICZBY); //czekaj 2s z wyświetloną liczbą
    wyswietlacz(-1); //gasimy wyświetlacz
  }
  delay(50); //oddech dla uC, tak dla świętego spokoju
}

void wyswietlacz(int cyfra) {
  //Instrukcja switch ustawia odpowiednie stany na wyjsciach
  //w zaleznosci od podanej cyfry
  switch (cyfra) {
    case -1:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, HIGH);
      break; //tego zabrakło, więc case -1 tak na prawdę wyświetlał liczbę poniżej, czyli "0"


    case 0:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, LOW);
      break;

  //wyjaśnienie w sprawie Twojego komentarza w jednym z postów..
  //to, że dla "1" zapalamy tylko dwa segmenty nie oznacza, że reszty nie musimy ustawić
  //jeśli wcześniej gasiliśmy, to rzeczywiście tak jest, ale bezpieczniej jest gasić je tutaj gdybyś miał kiedyś użyć tej funkcji w innym miejscu
  //tu masz pewność, że wyświetli się "1", a nie "1" nałożone na cokolwiek było wcześniej na wyświetlaczu
  //dlatego pozostałe segmenty zdecydowanie gasimy (ustawiamy HIGH w tym wypadku)
    case 1:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, HIGH);
      break;

    case 2:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, HIGH);
      break;

    case 3:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, HIGH);
      break;

    case 4:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, LOW);
      break;

    case 5:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, LOW);
      break;

    case 6:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, LOW);
      break;

    case 7:
      //TODO: zadanie dla Ciebie, dopisać pozostałe brakujące liczby
      break;

    case 8:
      break;

    case 9:
      break;
  }
}

 

Link to post
Share on other sites
while (digitalRead(PRZYCISK) == LOW){} {
      digitalWrite(PRZYCISK, LOW);
      while (digitalRead(PRZYCISK) == HIGH){}
      digitalWrite(PRZYCISK, HIGH);

To zatrzumuje automatyczne wyświetlanie liczb losowych. Bez tego wkoło bez naciśnięcia przycisku losują się liczby i wyświetla je.1,6,5,54,4,1..............

Link to post
Share on other sites

Ustawiasz pin PRZYCISK jako wyjście z rezystorem podciągającym (INPUT_PULLUP), a potem poprzed digitalWrite próbujesz ustawić mu wartość. To nie ma sensu.

Jeśli mówisz, że naciśnięcie przycisku zatrzymuje losowanie, a przy zwolnionym liczby są losowane, to wygląda na to, jakby Twój przycisk był NC, czyli zwierał do masy cały czas, a rozwierał gdy go naciśniesz. Jeśli tak jest, to moim kodzie zamień if (digitalRead(PRZYCISK) == LOW) na if (digitalRead(PRZYCISK) == HIGH).

  • Lubię! 2
Link to post
Share on other sites
(edytowany)
//Definiowanie pinów wyświetlacza i Arduino
#define SEG_C 3
#define SEG_E 6
#define SEG_D 5
#define SEG_B 7
#define SEG_G 2
#define SEG_A 11
#define SEG_F 10

//Definiowanie pinu przycisku  12 i przycisk
//Arduino UNO +5
//Arduino UNO przez rezystor 10 k GND

#define PRZYCISK 12
#define CZAS_WYSWIETLANIA_LICZBY 5000

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

  pinMode(PRZYCISK, INPUT_PULLUP);

  //Konfiguracja pinow jako wyjscia
  pinMode(SEG_A, OUTPUT);
  pinMode(SEG_B, OUTPUT);
  pinMode(SEG_C, OUTPUT);
  pinMode(SEG_D, OUTPUT);
  pinMode(SEG_E, OUTPUT);
  pinMode(SEG_F, OUTPUT);
  pinMode(SEG_G, OUTPUT);
}

void loop() {
  
  int losowaLiczba = random(0,10);
  Serial.println(losowaLiczba);

  if (digitalRead(PRZYCISK) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
    wyswietlacz(losowaLiczba); //Wyswietl wartosc na wyswietlaczu
    delay(CZAS_WYSWIETLANIA_LICZBY); //czekaj 5 sek. z wyświetloną liczbą
    wyswietlacz(-1); //gasimy wyświetlacz
  }
  delay(50); //oddech dla uC, tak dla świętego spokoju
}

void wyswietlacz(int cyfra) {
  //Instrukcja switch ustawia odpowiednie stany na wyjsciach
  //w zaleznosci od podanej cyfry
  switch (cyfra) {
    case -1:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, HIGH);
      break; //tego zabrakło, więc case -1 tak na prawdę wyświetlał liczbę poniżej, czyli "0"


    case 0:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, LOW);
      break;

  //wyjaśnienie w sprawie Twojego komentarza w jednym z postów..
  //to, że dla "1" zapalamy tylko dwa segmenty nie oznacza, że reszty nie musimy ustawić
  //jeśli wcześniej gasiliśmy, to rzeczywiście tak jest, ale bezpieczniej jest gasić je tutaj gdybyś miał kiedyś użyć tej funkcji w innym miejscu
  //tu masz pewność, że wyświetli się "1", a nie "1" nałożone na cokolwiek było wcześniej na wyświetlaczu
  //dlatego pozostałe segmenty zdecydowanie gasimy (ustawiamy HIGH w tym wypadku)
    case 1:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, HIGH);
      break;

    case 2:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, HIGH);
      break;

    case 3:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, HIGH);
      break;

    case 4:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, LOW);
      break;

    case 5:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, LOW);
      break;

    case 6:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, LOW);
      break;

    case 7:
       digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D,HIGH);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, HIGH);
      break;

    case 8:
     digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, LOW);
      break;

    case 9:
     digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, LOW);
      break;
  }
}

Dzisiaj mam trochę czasu i zrobiłem zadania. Czyli jak znapisać sterowanie  przyciskiem jak jest rezystor? Output? Zmieniłem na OUTPUT i wstawiłem na początku void loop linie . Jak zrobić aby na 2 albo3 wyświetlaczach losowało cyfry? Na każdym osobno. Np.6,3,2.


      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, HIGH);

 

Edytowano przez Kenshin
Poprawki kodu
Link to post
Share on other sites

Szukam prostego menu jednopoziomowego jako przykładu jak zrobić menu wyboru.

//Menu
//* Wybór Ilości Graczy
//*  2
//*  3
//*  4
 
#include <Wire.h>
#include <hd44780.h>                       // main hd44780 header
#include <hd44780ioClass/hd44780_I2Cexp.h> // i2c 
int wybor=0;//Wybór graczy od 2 do 4
int gr=0;//ilość graczy od 2 do 4

int currentMenuPos = 0;// Pozycja menu?
int menuSize();// Wielkość menu?

#define PRZDOWN 11
#define PRZUP 10
#define PRZOK 9
#define PRZRZUT 8
#define PRZMENU 7

// LCD
const int LCD_COLS = 20;
const int LCD_ROWS = 4;

hd44780_I2Cexp lcd; 
int status;
void setup() {

   pinMode(11, INPUT_PULLUP); //Konfiguracja pinu 12 jako wyjście PRZDOWN-przycisk w dól
   pinMode(10, INPUT_PULLUP); //Konfiguracja pinu 11  jako wyjście PRZUP-przycisk w górę
   pinMode(9,  INPUT_PULLUP); //Konfiguracja pinu 10 jako wyjście PRZOK-Przycisk zatwierdzenia wyboru
   pinMode(8,  INPUT_PULLUP); //Konfiguracja pinu 9 jako wyjście PRZRZUT-przycisk rzutu kostkami
   pinMode(7,  INPUT_PULLUP); //Konfiguracja pinu 8 jako wyjście PRZMENU- Menu wyboru
 
  status = lcd.begin(LCD_COLS, LCD_ROWS);
  if(status) {   hd44780::fatalError(status); 
  }  
  Serial.begin(9600);
  }

void loop() {
  // Print a message to the LCD.
  // po naciśnięcu przycisku menu wyświetl
  //Wybór ilości graczy przycisk PRZMENU
  
  lcd.setCursor(0, 0);
  lcd.print("  Witam Wszystkich   ");
  lcd.setCursor(0, 1);
  lcd.print("     Gra w 1000");  
  lcd.setCursor(0, 2);
  lcd.print("   Kenshin Himura");  
  lcd.setCursor(0,3 );
  lcd.print("       2020"); 
 
  if (digitalRead(PRZMENU) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
  delay(PRZMENU);
  while (digitalRead(7) == LOW) { 
   digitalWrite(PRZMENU, LOW); //
   digitalWrite(PRZMENU, HIGH); 
     
 if (digitalRead(PRZDOWN) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
      delay(PRZDOWN);
      while (digitalRead(11) == LOW) { //Jeśli przycisk jest wciśnięty 
    digitalWrite(PRZDOWN, LOW); // Przesuń w menu wyboru ilości  graczy w dół
    digitalWrite(PRZDOWN, HIGH); // Nie przesuwaj w menu
      } 
 if (digitalRead(PRZUP) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
    delay(PRZUP);
    while (digitalRead(10) == LOW) { //Jeśli przycisk jest wciśnięty 
    digitalWrite(PRZUP, LOW); // Przesuń w menu wyboru ilości  graczy w górę
    digitalWrite(PRZUP,HIGH); // Nie przesuwaj w menu
   }   
 if (digitalRead(PRZOK) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
    delay(PRZOK);
    while (digitalRead(9) == LOW) { //Jeśli przycisk jest wciśnięty 
    digitalWrite(PRZOK, LOW); // Zatwierdź wybór
    digitalWrite(PRZOK, HIGH); 
  }  
 if (digitalRead(PRZRZUT) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
    delay(PRZRZUT);
    while (digitalRead(8) == LOW) { //Jeśli przycisk jest wciśnięty 
    digitalWrite(PRZRZUT, LOW); // Rzut kośćmi
    digitalWrite(PRZRZUT, HIGH); 
    
 lcd.setCursor(0,0);
 lcd.print("Wybor Ilosci Graczy:    ");// to ma się palić  menu wyboru
 lcd.setCursor(0,1);
 lcd.print("  2.               ");    //to wybierane
 lcd.setCursor(0,2);
 lcd.print("  3.               ");  //to wybierane
 lcd.setCursor(0,3); 
 lcd.print("  4.               ");    //to wybierane
 
    
   } } } }}}}}

    

 

Link to post
Share on other sites

Nie analizowałem całości, ale wyłowiłem kilka linijek, które skomentowałem. Szkoda Twoich nerwów i czasu, serio.. jeden prosty tutorial o podstawach rozwiąże Ci wiele problemów.

#define PRZMENU 7
pinMode(7, INPUT_PULLUP); //Konfiguracja pinu 8 jako wyjście PRZMENU- Menu wyboru -> 8? nie 7? I czemu 7 a nie PRZMENU?
delay(PRZMENU); //wiesz co robi i do czego służy funkcja delay? Dlaczego przekazujesz jej nr pinu jako parametr? co robi delay(7) wg Ciebie?
digitalWrite(PRZMENU, LOW); //w setup() ustawiłeś PRZMENU jako INPUT - dlaczego używasz zapisu do pinu wejściowego?
digitalWrite(PRZMENU, HIGH);
"Wybor Ilosci Graczy" //liczby, nie ilości - gracze są policzalni
} } } }}}}} //co pisałałem o wcięciach i formatowaniu w poprzednim poście? ;-) nie oczekuj, że ktoś będzie się wgryzał w takie coś
Edytowano przez Marooned
  • Lubię! 1
Link to post
Share on other sites
(edytowany)

Poprawiłem to. Nie mogę znaleść prostego menu aby chodziło na moim wyświetlaczu. Znalazłem taki program ale wyskakuje błąd lcd was not declared  in this scope. Dlaczego? Gotowy przykład od jednego.

#define SELECT_KEY   1
#define LEFT_KEY     2
#define DOWN_KEY     3
#define UP_KEY       4
#define RIGHT_KEY    5

/*-----( Import needed libraries )-----*/
#include <Wire.h>
#include <hd44780.h>                       // main hd44780 header
#include <hd44780ioClass/hd44780_I2Cexp.h> // i2c expander i/o class header
int menuPos = 0;

String menuLines[6] =
{
  "Ustawienia",
  "Reset",
  "Strona glowna",
  "Serwer IP",
  "Pobierz dane",
  "Powrot"
};

void setup() {

  lcd.begin(20, 4 );
  
}

void loop() {

  // lcd.clear();
   lcd.print(">"); lcd.print( menuLines[ menuPos ] );
   lcd.setCursor(0, 1); lcd.print( menuLines[ menuPos + 1] );

   if( getKeyID() == UP_KEY ) menuPos--;
   if( getKeyID() == DOWN_KEY ) menuPos++;

   if( menuPos < 0 ) menuPos = 0;
   if( menuPos > 5 ) menuPos = 5;

   delay(500);
  

}




int getKeyID()
{
  int aRead = analogRead( A0 );

  if( aRead > 1000 ) return 0;                //no key is pressed
  if( aRead > 600  ) return SELECT_KEY;
  if( aRead > 400  ) return LEFT_KEY;
  if( aRead > 200  ) return DOWN_KEY;
  if( aRead > 90   ) return UP_KEY;
  if( aRead < 10   ) return RIGHT_KEY;
}

 

Edytowano przez Kenshin
Link to post
Share on other sites

Tak jak napisałeś, nie masz określone "co to jest lcd". Używasz obiektu o nazwie "lcd" ale nigdzie w programie nie powiedziałeś co kryje się za tą nazwą. Najpierw deklaracja, potem inicjacja a dopiero na końcu użycie. To, że trafiają Ci się błędy kompilacji, to normalne, ale to, że nie poprawiłeś błędu mimo precyzyjnego komunikatu kompilatora ...

Weź sobie do serca radę jaką dał Ci @Marooned i przeczytaj cokolwiek o programowaniu.

  • Lubię! 2
Link to post
Share on other sites

Myślę że teraz dobrze. Urzyłem innej biblioteki.Teraz czytam o if i innych instrukcjach warunkowych. Nie wiem jak zrobić aby strzałką wybierać a OK zatwierdzić wybur.

#include <Wire.h>   // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C_Hangul.h>//biblioteka Arduino lcd IC2
LiquidCrystal_I2C_Hangul lcd(0x27, 20, 4);

int currentMenuPos = 0;// Pozycja menu?
int menuSize(3);// Wielkość menu?
byte gr = 2;// Liczba Graczy od 2 do 4
int menuPos = 0;

String menuLines[3] =
{
  " 2.   ",
  " 3.   ",
  " 4.   ",
  };

#define PRZMENU 7
#define PRZRZUT 8
#define PRZOK 9
#define PRZUP 10
#define PRZDOWN 11

void setup(){

  pinMode(PRZMENU, INPUT_PULLUP); //Konfiguracja pinu 7 jako wyjście PRZMENU-
  lcd.init();
  lcd.begin(20,4);   // Inicjalizacja LCD 2x16

  lcd.backlight(); // zalaczenie podswietlenia
  lcd.setCursor(2, 0);  
  lcd.print("Witam Wszystkich");
  lcd.setCursor(3, 1);  
  lcd.print("Kenshin Himura");
  lcd.setCursor(5, 2);  
  lcd.print("Gra w 1000");
  lcd.setCursor(5, 3);  
  lcd.print("28.12.2020");
 
}

void loop() 
{
  
gr ++;// Graczy 2 + 1
 

  
   if (digitalRead(PRZMENU) == HIGH) { //wyświetl menu tylko, jeśli naciśnięto przycisk
   delay(PRZMENU);
   while (digitalRead(PRZMENU) == LOW) { 
   digitalWrite(PRZMENU, LOW); //
   digitalWrite(PRZMENU, HIGH);  
  
   lcd.setCursor(1,0);
   lcd.print("     Liczba Graczy:    ");// to ma się palić  menu wyboru 
   lcd.setCursor(0,1);
   lcd.print("  2.               ");    //to wybierane gr = 0
   lcd.setCursor(0,2);
   lcd.print("  3.               ");  //to wybierane   gr + 1
   lcd.setCursor(0,3); 
   lcd.print("  4.               ");    //to wybierane  gr + 2


  }
  
   if (digitalRead(PRZDOWN) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
      delay(PRZDOWN);
      while (digitalRead(PRZDOWN) == LOW) { //Jeśli przycisk jest wciśnięty 
    digitalWrite(PRZDOWN, LOW); // Przesuń w menu wyboru ilości  graczy w dół
    digitalWrite(PRZDOWN, HIGH); // Nie przesuwaj w menu
    lcd.setCursor(5, 1); 
    lcd.print( menuLines[ menuPos + 1] );
    lcd.print("<-"); 
    lcd.print( menuLines[ menuPos ] );
      } 
 if (digitalRead(PRZUP) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
    delay(PRZUP);
    while (digitalRead(PRZUP) == LOW) { //Jeśli przycisk jest wciśnięty 
    digitalWrite(PRZUP, LOW); // Przesuń w menu wyboru ilości  graczy w górę
    digitalWrite(PRZUP,HIGH); // Nie przesuwaj w menu

    lcd.setCursor(5, 3); 
    lcd.print( menuLines[ menuPos - 1] );
    lcd.print("<-"); 
    lcd.print( menuLines[ menuPos ] );
   }   
 if (digitalRead(PRZOK) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
    delay(PRZOK);
    while (digitalRead(PRZOK) == LOW) { //Jeśli przycisk jest wciśnięty 
    digitalWrite(PRZOK, LOW); // Zatwierdź wybór
    digitalWrite(PRZOK, HIGH); 
    
       lcd.setCursor(0, 0); 
    lcd.print( menuLines[ menuPos - 1] );
    lcd.print("Graczy 2."); 
      lcd.print("Graczy 3."); 
        lcd.print("Graczy 4."); 
    lcd.print( menuLines[ menuPos ] );
   }   
  }  if (digitalRead(PRZRZUT) == LOW) { //wyświetl liczbę tylko, jeśli naciśnięto przycisk
    delay(PRZRZUT);
    while (digitalRead(PRZRZUT) == LOW) { //Jeśli przycisk jest wciśnięty 
    digitalWrite(PRZRZUT, LOW); // Rzut kośćmi
    digitalWrite(PRZRZUT, HIGH); 
    
    if (gr = 2) {
lcd.setCursor(0,0);
   lcd.print("Graczy 2.");    //to wybierane gr = 0
    if (gr = 3) {
lcd.setCursor(0,0);
   lcd.print("Graczy  3.");    //to wybierane gr = 1
     if (gr = 4) {
lcd.setCursor(0,0);
   lcd.print("Graczy 4.");    //to wybierane gr = 2
 }
   
  }
   }
   }   }
 }
  }}}

 

Link to post
Share on other sites
11 minut temu, Kenshin napisał:

Nie wiem jak zrobić aby strzałką wybierać a OK zatwierdzić wybór

Absolutnie najprościej rzecz biorąc, mało rozwojowo, ale działająco, w pętli loop() sprawdzaj każdy przycisk i jeśli jest naciśnięty, wykonaj jakąś akcję.

void setup() {
  // wewnętrzne podciącnięcie pod Vcc, zakładam, że przycisk zwiera do masy (aktywne LOW)
  pinMode(PRZUP, INPUT_PULLUP);
  pinMode(PRZDOWN, INPUT_PULLUP);
  pinMode(PRZOK, INPUT_PULLUP);
}

void loop() {
  if (digitalRead(PRZUP) == LOW) {
    //naciśnięto UP - poniżej umieść kod do obsługi przycisku, cokolwiek ma robić
  }

  if (digitalRead(PRZDOWN) == LOW) {
    //naciśnięto DOWN - poniżej umieść kod do obsługi przycisku
  }

  if (digitalRead(PRZOK) == LOW) {
    //naciśnięto OK - poniżej umieść kod do obsługi przycisku
  }
}

PS, znów korzystasz z takiej konstrukcji:

delay(PRZMENU);

Napisz nam co wg Ciebie to robi i w jakim celu to umieszczasz?

Edytowano przez Marooned
Link to post
Share on other sites
(edytowany)

Chce aby czekał na naciśnięcie przycisku i potem wyświetlił Menu. Skasowałem Wyświetala: Liczba Graczy:

                                                                                                                                                   2.

                                                                                                                                                   3.

                                                                                                                                                    4. 

Nie wyświetla mi strzałki np. przy 2.

Edytowano przez Kenshin
Link to post
Share on other sites

@Kenshin Czy używasz Arduino IDE? Jeśli tak, to w menu narzędzia masz "automatyczne formatowanie". Użyj go proszę i zobacz jak wyglądają w programie zależności pomiędzy instrukcjami if.

Choć na forum było o tym wiele razy, przypomnę: włącz w opcjach kompilatora maksymalny poziom ostrzeżeń i pozbądź się tych ostrzeżeń poprawiając program. Oczywiście, świadome pomijanie ostrzeżeń może być uzasadnione, ale zdecydowanie odradzam - a jeśli się już musi, wtedy przyjęte jest dokładne uzasadnienie w komentarzach przyczyny takiej decyzji.

Ostatnia uwaga. Komenda preprocesora (to takie coś co przetwarza kod źródłowy przed właściwą kompilacją)

#define PRZMENU 7

oznacza jedynie, że dla Twojej wygody możesz używać w kodzie programu napisu "PRZMENU"  zamiast napisu "7" i absolutnie nic więcej. Dla kompilatora oznacza to zawsze 7.

 

Link to post
Share on other sites

// if PRZDOWN 
  // jeżeli przycisk down naciśnięty to przesuń strzałkę o jedną linię w dół
  // jeżeli przycisk up naciśnięty to przesuń strzałkę o jedną linię w górę
  // jeżeli przycisk ok  naciśnięty to zatwierć wybór
  // jeżeli przycisk rzut  naciśnięty to rzut kośćmi
Jak to napisać? Menu mi się już wyświetla po naciśnięcu przycisku. Strzałka jest ale jak ją poruszać? Mam 5 przycisków,  menu, w dół, w górę,,OK i rzut kośćmi.

Link to post
Share on other sites

Chyba doszliśmy do tego etapu, gdzie należy odpowiedzieć sobie na kluczowe pytanie. Czy oczekujesz od nas pomocy przy problemach czy gotowca?

Jeśli to pierwsze, to mam wrażenie, że nie stosujesz się do naszych podpowiedzi oraz próśb (a może ich nie rozumiesz i tu jest problem? Np. 2x pytałem o delay(przycisk), nie otrzymałem odpowiedzi).
Jeśli to drugie, to o ile wiem, na forum jest tendencja by nie robić gotowców, wszak chodzi o rozwój i wymianę informacji, a nie czyjąś pracę i kopiuj/wklej.

Pisanie takich relatywnie prostych programów to trochę jak budowanie z klocków. Jeśli zrobisz sobie kilka sprawdzonych bloków typu a) obsługa przycisku (w moim poście piętro wyżej najprostsze z możliwych podejść); b) wyświetlanie linijki tekstu na LCD; c) ustawienie kursora w zadanym miejscu; i zamkniesz te bloki w funkcjach, będziesz miał pewność, że taki blok działa zawsze. Wtedy pozostaje złączenie sprawdzonych bloków w jedną działającą całość.

Jeśli więc chciałbyś lepiej zrozumieć co tworzysz i masz na to czas, to spróbuj napisać sobie takie bloki, jeden na raz, bez dodatków. Dopiero potem zacznij je łączyć w całość.

Jeśli jednak chcesz tylko ukończyć ten projekt i nie planujesz tworzyć kolejnych projektów i jednak oczekiwałbyś gotowca, to może daj jasno znać. Będzie czytelniej 🙂

  • Lubię! 2
Link to post
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

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.