Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

kłopot z kodem na Arduino.

MalyElektronik82 10 Lis 2018 17:59 150 9
  • #1 10 Lis 2018 17:59
    MalyElektronik82
    Poziom 3  

    Dzień dobry,

    Mam problem z napisaniem gry na arduino, której założeniem jest, że są podłączone cztery diody i cztery przyciski. Każdy przycisk odpowiada jednej diodzie. Arduino losuje w jakiej kombinacji mają się świecić diody np. Włączona Wyłączona Włączona Włączona.
    Zadaniem gracza jest wprowadzenie kombinacji pożądanej przez Arduino. Wprowadzenie poprawnej kombinacji będzie skutkowało pokazaniem napisu "Brawo!" w porcie szeregowym.

    Napisałem coś takiego:
    void setup()
    {

    Serial.begin(9600);

    pinMode(13, OUTPUT);
    pinMode(12, OUTPUT);
    pinMode(11, OUTPUT);
    pinMode(10, OUTPUT);

    pinMode(7, INPUT_PULLUP);
    pinMode(6, INPUT_PULLUP);
    pinMode(5, INPUT_PULLUP);
    pinMode(4, INPUT_PULLUP);

    randomSeed(analogRead(0));

    }

    int guzik1=0;
    int guzik2=0;
    int guzik3=0;
    int guzik4=0;

    int fabula;

    void loop()
    {

    for(fabula = 0; fabula < 1; fabula++);
    {

    int kod1 = random(0, 1);
    int kod2 = random(0, 1);
    int kod3 = random(0, 1);
    int kod4 = random(0, 1);

    }


    if(digitalRead(7)==0)
    {
    delay(20);
    guzik1=!guzik1;
    digitalWrite(13, guzik1);
    while(digitalRead(7)==0);
    delay(20);
    }

    if(digitalRead(6)==0)
    {
    delay(20);
    guzik2=!guzik2;
    digitalWrite(12, guzik2);
    while(digitalRead(6)==0);
    delay(20);
    }

    if(digitalRead(5)==0)
    {
    delay(20);
    guzik3=!guzik3;
    digitalWrite(11, guzik3);
    while(digitalRead(5)==0);
    delay(20);
    }

    if(digitalRead(4)==0)
    {
    delay(20);
    guzik4=!guzik4;
    digitalWrite(10, guzik4);
    while(digitalRead(4)==0);
    delay(20);
    }

    if(guzik1=kod1)
    {
    if(guzik2=kod2)
    {
    if(guzik3=kod3)
    {
    if(guzik4=kod4)
    {
    Serial.println("Brawo!");

    }
    }
    }
    }

    }

    Ale kiedy nacisnę raz przycisk odpowiadający za pierwszą diodę, a potem nacisnę go drugi raz dioda nie chce zgasnąć.
    A po drugie liczby losują się przez cały czas(sprawdziłem używając Serial.println(kod1); po losowaniu.) Nie wiem jak to naprawić.

    0 9
  • #2 10 Lis 2018 18:05
    korystor
    Poziom 8  

    Wystarczy spojrzeć na warunki if i widać podstawowe błędy. Pomyśl troszkę. Myślisz że np. if(a = b) naprawdę porównuje te dwie zmienne czy przypisuje jedną zmienną do drugiej?

    0
  • #3 10 Lis 2018 18:59
    MalyElektronik82
    Poziom 3  

    Dioda działa, ale mam jeszcze problem z tym, że na końcu chcę sprawdzić czy wpisany kod jest poprawnie wpisany, ale Zmienne kod1-4 są zmiennymi lokalnymi dla pętli for.
    I oczywiście ta pętla for z losowaniem liczb działa w nieskończoność.

    0
  • #4 10 Lis 2018 19:07
    korystor
    Poziom 8  

    Przepraszam, nie wgrywam narazie tego kodu i nie sprawdzam, po prostu rzuciła mi się w oczy instrukcja warunkowa if(guzik1=kod1) czy możesz napisać co ta instrukcja robi?

    0
  • #5 10 Lis 2018 19:31
    MalyElektronik82
    Poziom 3  

    Ta instrukcja w teorii robi tak, że porównuje stan guzika (wciśnięty lub nie) z wylosowaną wartością. W praktyce kiedy wgrywam program na Arduino, to program nie chce się skompilować, ponieważ zmienna kod1 i wszystkie zmienne z początkiem kod są zmiennymi lokalnymi.

    0
  • #6 10 Lis 2018 19:44
    korystor
    Poziom 8  

    Czy guzik1 = kod1 to jest porównywanie zmiennej czy przypisanie jednej zmiennej do drugiej? i do czemu w pierwszej linice pętli for jest średnik?

    0
  • #7 10 Lis 2018 20:45
    MalyElektronik82
    Poziom 3  

    guzik1=kod1 chodziło mi o porównywanie, a co do średnika, to nie wiem gdzie on jest.

    0
  • #8 10 Lis 2018 20:50
    korystor
    Poziom 8  

    Pętle for umieściłeś w loop() więc będzie leciała wkoło. Dla mnie porównywanie wygląda np. a == b więc dlatego pytałem ale może tutaj miałeś inny pomysł który zadziałał.

    0
  • #9 10 Lis 2018 20:56
    MalyElektronik82
    Poziom 3  

    Nie pomyślałem, żeby losowanie umieścić w setup, ale pewnie tego nie zrobiłem, bo potem nie ma jak użyć zmiennej, żeby nie była zmienną lokalną.

    0
  • #10 10 Lis 2018 21:03
    korystor
    Poziom 8  

    Możesz dla próby przenieść całą pętle do np. funkcji void losowanie() i wywołać je w setup losowanie(); Potem dołożyć dodatkowy przycisk do wywołania tej funkcji. Zmienne globalne moim zdaniem do takich prób nie przeszkadzają.

    Dodano po 1 [minuty]:

    int guzik1=0;
    int guzik2=0;
    int guzik3=0;
    int guzik4=0;
    int fabula = 0;
    int kod1, kod2, kod3, kod4;
    void setup()
    {

    Serial.begin(9600);

    pinMode(13, OUTPUT);
    pinMode(12, OUTPUT);
    pinMode(11, OUTPUT);
    pinMode(10, OUTPUT);

    pinMode(7, INPUT_PULLUP);
    pinMode(6, INPUT_PULLUP);
    pinMode(5, INPUT_PULLUP);
    pinMode(4, INPUT_PULLUP);
    losowanie();
    randomSeed(analogRead(0));

    }



    void loop()
    {




    if(digitalRead(7)==0)
    {
    delay(20);
    guzik1=!guzik1;
    digitalWrite(13, guzik1);
    while(digitalRead(7)==0);
    delay(20);
    }

    if(digitalRead(6)==0)
    {
    delay(20);
    guzik2=!guzik2;
    digitalWrite(12, guzik2);
    while(digitalRead(6)==0);
    delay(20);
    }

    if(digitalRead(5)==0)
    {
    delay(20);
    guzik3=!guzik3;
    digitalWrite(11, guzik3);
    while(digitalRead(5)==0);
    delay(20);
    }

    if(digitalRead(4)==0)
    {
    delay(20);
    guzik4=!guzik4;
    digitalWrite(10, guzik4);
    while(digitalRead(4)==0);
    delay(20);
    }
    /*
    if(guzik1=kod1){
    if(guzik2=kod2){
    if(guzik3=kod3){
    if(guzik4=kod4){
    Serial.println("Brawo!");

    }
    }
    }
    }
    */
    }//loop

    void losowanie(){


    kod1 = random(0, 10);
    kod2 = random(0, 10);
    kod3 = random(0, 10);
    kod4 = random(0, 10);
    Serial.println("kod1- "+String(kod1));
    Serial.println("kod2- "+String(kod2));
    Serial.println("kod3- "+String(kod3));
    Serial.println("kod4- "+String(kod4));


    }

    Teraz wylosuje tylko raz liczby.
    Warunki if z przyciskami powinieneś porównywać z LOW a nie z 0. Musisz również
    wyeliminować drgania styków przycisków, można programowo, poczytaj. A losowanie w random wybierz random(0, 2) a nie random(0, 1) bo zawsze będzie zero.


    Masz tutaj działający kod. Przyciski działają i chyba wszystko tak jak chciałeś. kod4 to oczywiście będzie pinMode 7 a kod1 to pinMode 4. żebyś nie pomylił kolejności przycisków bo nie zadziała Brawo! Ide spać , powodzenia. Aha no i masz tam zainicjowany dodatkowy przycisk do losowania to sobie dołóż.
    int guzik1=0;
    int guzik2=0;
    int guzik3=0;
    int guzik4=0;
    int fabula = 0;
    int kod1, kod2, kod3, kod4;
    boolean a = true;
    void setup()
    {

    Serial.begin(9600);

    pinMode(13, OUTPUT);
    pinMode(12, OUTPUT);
    pinMode(11, OUTPUT);
    pinMode(10, OUTPUT);

    pinMode(8, INPUT_PULLUP);
    pinMode(7, INPUT_PULLUP);
    pinMode(6, INPUT_PULLUP);
    pinMode(5, INPUT_PULLUP);
    pinMode(4, INPUT_PULLUP);
    //randomSeed(analogRead(0));

    }



    void loop()
    {


    if(a == true){
    kod1 = random(0,2);
    Serial.println("kod1- "+String(kod1));
    kod2 = random(0,2);
    Serial.println("kod2- "+String(kod2));
    kod3 = random(0,2);
    Serial.println("kod3- "+String(kod3));
    kod4 = random(0,2);
    Serial.println("kod4- "+String(kod4));
    a = false;
    }

    if(digitalRead(8)== LOW){
    delay(20);
    a = true;
    }





    //delay(1000);

    if(digitalRead(7)==0)
    {
    delay(20);
    guzik1=!guzik1;
    digitalWrite(13, guzik1);
    while(digitalRead(7)==0);
    delay(20);
    }

    if(digitalRead(6)==0)
    {
    delay(20);
    guzik2=!guzik2;
    digitalWrite(12, guzik2);
    while(digitalRead(6)==0);
    delay(20);
    }

    if(digitalRead(5)==0)
    {
    delay(20);
    guzik3=!guzik3;
    digitalWrite(11, guzik3);
    while(digitalRead(5)==0);
    delay(20);
    }

    if(digitalRead(4)==0)
    {
    delay(20);
    guzik4=!guzik4;
    digitalWrite(10, guzik4);
    while(digitalRead(4)==0);
    delay(20);
    }

    if(guzik1==kod1){
    if(guzik2==kod2){
    if(guzik3==kod3){
    if(guzik4==kod4){
    Serial.println("Brawo!");

    }
    }
    }
    }

    }//loop

    0
  Szukaj w 5mln produktów