Skocz do zawartości

Czym różnią się te dwa programy?


Kristopherson

Pomocna odpowiedź

cześć, 

chyba się zaciąłem na najprostszym z prostych... ale cóż, już nie te lata... 🙂

czym się różnią kody jn i jak poprawić kod 1 aby działał zgodnie z założeniem?  Chcę to wejście (pin 3) sterować stanem wysokim. Tylko kod 2 działa tak jak chciałem (niestety sterowanie stanem niskim) tj. na wciśnięcie przycisku (podanie na pin 3 stanu niskiego lub wysokiego - odpowiednio dla konkretnego kodu), ma się włączać buzzer jedną pętlą doboru częstotliwości

kod 1

void setup() {
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście buzzer
  pinMode(3,INPUT_PULLUP);
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);
  digitalWrite(3,LOW);
}
 
void loop() 
{
  
  {if (digitalRead(3)==HIGH)
    {
      int czestotliwosc = 0;
      for (czestotliwosc = 31; czestotliwosc < 10000; czestotliwosc++) { 
      tone(A5, czestotliwosc); //Wygeneruj sygnał o częstotliwości z pętli na pinie A5  
      }
      noTone(A5); // wyłącz dźwięk

     digitalWrite(3,LOW);
      while(digitalRead(3)==HIGH); // poczekaj na wciśnięcie przycisku
    
    }
  }
}

kod 2

void setup() {
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście buzzer
  pinMode(3,INPUT_PULLUP);
  pinMode(4,OUTPUT);
  digitalWrite(4,LOW);
  digitalWrite(3,HIGH);
}
 
void loop() 
{
  
  {if (digitalRead(3)==LOW)
    {
      int czestotliwosc = 0;
      for (czestotliwosc = 31; czestotliwosc < 10000; czestotliwosc++) { 
      tone(A5, czestotliwosc); //Wygeneruj sygnał o częstotliwości z pętli na pinie A5  
      }
      noTone(A5); // wyłącz dźwięk

      digitalWrite(3,HIGH);
      while(digitalRead(3)==LOW); // poczekaj na wciśnięcie przycisku
    
    }
  }
}

 

Link do komentarza
Share on other sites

@Kristopherson witam na forum 🙂 Wydzieliłem Twój post z kursu Arduino, bo nie jest bezpośrednio związany z omawianymi tam ćwiczeniami.

Czy nie popełniłeś jakiegoś błędu podczas wklejania tych programów? Pytam bo są tam nawiasy w dość dziwnych miejscach, tak jak tutaj:

  {if (digitalRead(3)==LOW)

Nawias klamrowy powinien być po, a nie przed warunkiem.

Link do komentarza
Share on other sites

@Treker 

1 godzinę temu, Treker napisał:

 


  {if (digitalRead(3)==LOW)

Nawias klamrowy powinien być po, a nie przed warunkiem.

Tak oczywiście racja - o jeden nawias klamrowy za dużo (to chyba z powodu mnóstwa prób - żadna nie działa tak jakbym chciał). Ten kod do kompilacja kilku ćwiczeń (a przynajmniej ich fragmentów) z kursu 🙂 . Pewnie nie najlepiej umieściłem swojego posta. Usunąłem ten nawias klamrowy ale kod dalej nie działa tzn jego 1 wersja - na której mi zależy. Pewnie to jakiś szkolny błąd ale nie potrafię go się doszukać. Ja dopiero raczkuję 🙂. Ja z tego "niedziałania" wyciągam taki wniosek, że niezależnie od tego jaki stan jest na pinie 3 ustawiony (a w części setup ustawiłem LOW - tak mi się przynajmniej wydaje) to i tak jest tam HIGH więc instrukcja warunkowa od razu załapuje się na HIGH, niezależnie od tego czy przycisk (podłączony do pinu ustawionego na HIGH) jest zwarty. i tego właśnie nie rozumiem. 

Link do komentarza
Share on other sites

@Kristopherson aktywacja stanem wysokim nie zadziała, ponieważ ustawiłeś wejście na INPUT_PULLUP i na pinie 3 cały czas będzie stan wysoki. Pullup to wewnętrzny rezystor podciągający do +. Po prostu ustaw tryb na INPUT (bez PULLUP) i dodaj rezystor podciągający do - na pinie 3 arduino i wtedy powinno działać. I dlaczego napisałeś DigitalWrite(3, HIGH), jeśli pin 3 jest ustawiony jako wejście a nie wyjście.

Do czego ma służyć ta pętla?

Dnia 19.11.2020 o 11:41, Kristopherson napisał:

while(digitalRead(3)==LOW); // poczekaj na wciśnięcie przycisku

Nie trzeba czekać, bo jak wiemy if jest aktywny tylko gdy 

Dnia 19.11.2020 o 11:41, Kristopherson napisał:

digitalRead(3)==HIGH

Według mnie ten kod powinien wyglądać tak (kod 1):

void setup() {
  pinMode(A5, OUTPUT); //Konfiguracja A5 jako wyjście buzzer
  pinMode(3,INPUT);
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);
}
 
void loop() 
{
  
  {if (digitalRead(3)==HIGH)
    {
      int czestotliwosc = 0;
      for (czestotliwosc = 31; czestotliwosc < 10000; czestotliwosc++) { 
      tone(A5, czestotliwosc); //Wygeneruj sygnał o częstotliwości z pętli na pinie A5  
      }
      noTone(A5); // wyłącz dźwięk


    
    }
  }
}

Tylko pamiętaj o rezystorze podciągającym do masy.

PS mam 14 lat, a arduino i elektroniką bawię się 3 lata i mogę się mylić

Edytowano przez aerograf7
  • Pomogłeś! 1
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

@aerograf7  Bardzo Ci dziękuję. Teraz jest ok. Moje "doświadczenie" to raczej w tygodniach się liczy więc i umiejętności stosunkowo nikłe.  Ten "while" pozostał niewycięty z pozostałej części kodu - ten kod pierwotnie nie operował na buzzerze i sprawdzaniu tylko stanu na określonym pinie. W przypadku tego fragmentu, rzeczywiście to jest zbędne. Ale teraz już działa tak jak powinno. Jeszcze raz dzięki za wsparcie. Temat zamknięty.

Link do komentarza
Share on other sites

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

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.