• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
sterowanie diodami za pomocą swith'a
#1
Witam. 
Chodzi mi dokładnie o napisanie programu , aby dzielił się on na 3 tryby . 
1 tryb to bedzie sterowanie diodami przy pomocy potencjometru ( w zaleznosci od jego stanu , bardzie zapalana dana dioda [ 3 stany ] ) , 2 tryb to bedzie '' przechodzenie diody '' jedna sie zapala, druga gaśne , i to zapętlone do czasu kolejnego kliknięcia''. A 3 tryb to miganie 3 diod na raz.  A przejscie medzy tymi trybami  działo sie za pomocą jednego kliknięcia przycisku ( 1 klikniecie , pierwszy tryb ) . Dziekuje za ewenualne odpowiedzi
 
Odpowiedź
#2
A w czym masz kolego problem, mógł byś opisać czego nie rozumiesz?
Pokaż co już napisałeś.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
(20-06-2017, 20:40)Robson Kerman napisał(a): A w czym masz kolego problem, mógł byś opisać czego nie rozumiesz?
Pokaż co już napisałeś.

Teraz program usunąłem,  nie zapisywałem jeżeli mi nie działał. Ale problem jest w tym , że gdy pisałem program to jedynie udawało mi się dojść do sytuacji , że "
> jest opcja sterowania potencjometrem
> klikam przycisk 
> pojawia się raz sekwecja " przeskakujacej diody 
> wraca spowrotem do opcji sterowania potencjometeem
A chchciałbym aby po kliknięciu,  ta przeskakujaca dioda się zapetliła do cczasu drugiego kliknięcia .
Próbowałem z WHILE ( i faktycznie sie zapętlało) ale kolejne klikniecie nie powracalo do sterowania potencjometrem
 
Odpowiedź
#4
(21-06-2017, 00:09)Andrzej9119 napisał(a):
(20-06-2017, 20:40)Robson Kerman napisał(a): A w czym masz kolego problem, mógł byś opisać czego nie rozumiesz?
Pokaż co już napisałeś.

Teraz program usunąłem,  nie zapisywałem jeżeli mi nie działał. Ale problem jest w tym , że gdy pisałem program to jedynie udawało mi się dojść do sytuacji , że "
> jest opcja sterowania potencjometrem
> klikam przycisk 
> pojawia się raz sekwecja " przeskakujacej diody 
> wraca spowrotem do opcji sterowania potencjometeem
A chchciałbym aby po kliknięciu,  ta przeskakujaca dioda się zapetliła do cczasu drugiego kliknięcia .
Próbowałem z WHILE ( i faktycznie sie zapętlało) ale kolejne klikniecie nie powracalo do sterowania potencjometem
okej , naisałem program który " działa , kiedy ma wykonywać tylko swojąfukje. Jezeli do tego programu dopisze chociażby zwykłe " Serial.println , abym widział  na porcie szeregowym stan potencjometru , to dioda nawet sie nie zapala. Dlaczego przez to nie czyta pętli '' while "? dziekuje , za kazde odpowiedzi 

pin4 - przycisk
pin3 - dioda
pin A4 - potencjometr 

int pot = 0 ; 
void setup() {
  
pinMode ( A4, INPUT ) ; 
pinMode ( 3, OUTPUT );
pinMode ( 4, INPUT_PULLUP);
digitalWrite ( 3, LOW ) ;

 potencjometr = analogRead ( A4) ;
}

void loop() {
 
  
  while (digitalRead (4) == HIGH ) {  
    delay ( 30) ;
   
    digitalWrite ( 3 , HIGH );
    delay ( 300) ;
    digitalWrite ( 3, LOW ) ;  
    delay (300);
    digitalWrite (3,HIGH) ;
  }
  

  while (digitalRead ( 4)  == HIGH ) { 
delay ( 30);
   
   analogWrite ( 3, potencjometr / 4 ) ;
  }


//  Serial.println ( potencjometr ) ;
}
 
Odpowiedź
#5
Przeanalizuj kod.
Dopóki pin4 jest niewciśnięty, wykonuj cośtam.
Jak wciśniesz przycisk, to wychodzisz z pętli i w tym momencie wchodzisz do następnej pętli while.
I jest sprawdzane, czy pin4 jest HIGH, a on jest LOW, bo nie zdążysz go wycisnąć zanim kod przeskoczy do tej linii.
16 MHz oznacza, że ( tak mniej więcej, bardziej mniej niż więcej) każda kolejna instrukcja jest wykonywana w 1/16 µs, a Twoje wciśnięcie przycisku, trwa mniej więcej 150~300 ms.
Jest kilka sposobów na ten problem. Kijowe i eleganckie.
Kijowy, to taki, że czekasz sobie te 300 ms i dopiero wchodzisz do następnej while i wielu młodocianych programistów wybiera rozwiązanie na delayach.
To jest złe, nie idź tą drogą!!!
Eleganckim sposobem, jest ustawienie wartości flagi typu bool na przeciwną.
Po prostu sobie negujesz jakąś zmienną i sprawdzasz jej stan w pętli.
Możesz też w pętli for zwiększać wartość jakiejś zmiennej, w Twoim przypadku do trzech, za każdym wciśnięciem przycisku i sprawdzać warunkowo w switch jaki case jest ustawiony (to rozwiązanie mi się najlepiej podoba).
No i wstawiaj sobie obsługę drgań, bo będzie Ci się ta pętla dodawać po kilka wartości jednocześnie.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości