Skocz do zawartości

Led Cube 3x3x3 sterowane z pilota, sterowanie zmiennymi


digitalread

Pomocna odpowiedź

Witam zbudowałem sześcian z diod LED i chciałbym sterować świeceniem diod pilotem.  Program napisałem wykorzystując bibliotekę Rc5 i jest kilka problemów.  Nie potrafię napisać kodu, który po wciśnięciu przycisku np.1  na pilocie zapamięta wciśniecie przycisku jako logiczne 1 i wywoła funkcję, która będzie świeciła diodami(tryb 1) Po wciśnięciu innego przycisku np. 2 chciałbym aby diody przestały świecić w "trybie  1 i" zaczęły inaczej świecić (trybie 2). Mówiąc krótko wciskam przycisk 1 diody świecą w trybie 1  wciskam kolejny przycisk i diody zaczynają inaczej świecić(tryb 2). Dotychczas udało mi się zrobić tak, że wcisnę np. przycisk 1 i program zapamiętuje wciśniecie przycisku i diody ciągle świecą (wcześniej musiałem ciągle trzymać przycisk, żeby diody ciągle świeciły). Ale jest problem taki, że program zapamiętuje wciśniecie tego przycisku i dalej nic nie da się zrobić ani zmienić tryb świecenia ani wyłączyć diody(muszę zrobić reset aby diody się wyłączyły). Mógłby mi ktoś to na chłopski rozum wytłumaczyć jak to zrobić? Moje tryby napisałem jako funkcje, gdzie pierwsza funkcja to zwykłe miganie diodami, a druga to rozjaśnianie i gaszenie diod z pinu PWM. Tak wygląda mój kod:

#define warstwa1 3
#define warstwa11 5 //podlaczenie diod do pinow PWM
#define warstwa2 6
#define warstwa22 9
#define warstwa3 10
#define warstwa33 11
#define TSOP_PIN 7 //odbiornik podczerwieni
#include <RC5.h> //biblioteka standard RC5
RC5 rc5(TSOP_PIN); //Informacja o podłączeniu odbiornika TSOP
 int wypelnienie=0; //zmienna dla PWM (dla funkcji dioda1)
//Zmienne dla RC5
byte address; 
byte command;
byte toggle;
int button;
void setup() {                
pinMode(TSOP_PIN ,INPUT); //odbiornik podczerwieni
pinMode(warstwa1, OUTPUT); //diody jako wyjscie i wylacz wszystkie na starcie
digitalWrite(warstwa1, 0);
pinMode(warstwa11, OUTPUT);
digitalWrite(warstwa11, 0);
pinMode(warstwa2, OUTPUT);
digitalWrite(warstwa2, 0);
pinMode(warstwa22, OUTPUT);
digitalWrite(warstwa22, 0);
pinMode(warstwa3, OUTPUT);
digitalWrite(warstwa3, 0);
pinMode(warstwa33, OUTPUT);
digitalWrite(warstwa33, 0);
Serial.begin(9600);
  }
 
void loop() {
  //Jeśli odebrano komendę
  if (rc5.read(&toggle, &address, &command))
  {
  if(command == 2) { button=2; } // jesli odebrano zmienną command o wartosci 2 to zmienna button ma wartosc 2
    else if (command == 1) { button=1;}
    }
switch(button){ //wybierz zmienna button
   case 2:
funkcja2(255,5,50); //
   Serial.println(button);
 break;
    case 1:
  funkcja1(250); //wlacz funkcje migania 
  Serial.println(button);
   break;
    }
}
   
void funkcja1(int czas) { //funkcja1
 digitalWrite(warstwa33, HIGH);
  delay(czas);
  digitalWrite(warstwa33, LOW);
  delay(czas); 

}

void funkcja2( int ilewypelnienie, int zmiana, int czas){ //funkcja2
if(wypelnienie<ilewypelnienie){ 
       analogWrite(warstwa1, wypelnienie);
        analogWrite(warstwa11, wypelnienie);
        analogWrite(warstwa2, wypelnienie);
        analogWrite(warstwa22, wypelnienie);
        analogWrite(warstwa3, wypelnienie);
        analogWrite(warstwa33, wypelnienie);
        wypelnienie+= zmiana;
       }
      if(wypelnienie==ilewypelnienie){
        while(wypelnienie!=0){
        analogWrite(warstwa1, wypelnienie);
        analogWrite(warstwa11, wypelnienie);
        analogWrite(warstwa2, wypelnienie);
        analogWrite(warstwa22, wypelnienie);
        analogWrite(warstwa3, wypelnienie);
        analogWrite(warstwa33, wypelnienie);
        wypelnienie=wypelnienie-zmiana;
         delay(czas);
       }
      }
      delay(czas);
       }

     
     

I teraz po wciśnięciu przycisku 2 (tryb 2)do zmiennej button będzie ciągle przypisywał wartość 2 i nie mogę wtedy  włączyć trybu 1. Tak to wygląda w monitorze portu szeregowego(screen w załączniku). I teraz jak zrobić, żeby dało się przełączać tryby lub wciśniecie tego samego przycisku powodowało by wyłączenie danego trybu? 

Napisałem prosty program, który po wciśnięciu switcha zapala diode i dioda gaśnie dopiero po ponownym wciśnięciu switcha. Tak wygląda ten kod: 

boolean buttonState1 = false; 
#define buttonPin1 7 //pin do odczytu stanu przycisku
#define led1 11  


void setup() {

pinMode(led1, OUTPUT); //Dioda jako wyjście
pinMode(buttonPin1, INPUT_PULLUP); //Przycisk jako wejście
digitalWrite(led1, LOW); //Wyłączenie diody
Serial.begin(9600);
}

void loop() {

  if (digitalRead(buttonPin1) == LOW) {
     delay(20); //20ms na obsługę drgań styków
     buttonState1 = !buttonState1; //zmiana na odwrotny stan
     if (buttonState1 == true){ 
     digitalWrite(led1, HIGH);
        Serial.println(buttonState1);
        }  else {
       digitalWrite(led1, LOW); 
       Serial.println(buttonState1);
        }
     while (digitalRead(buttonPin1) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk
     delay(20); //20ms na obsługę drgań styków
     }
} 

Przerobiłem kod tak aby po wciśnieciu przycisku wywołał funkcje 2 lecz program nie działa tak jak chciałem tzn. rozjaśnienie i przygaszenie diody.

boolean buttonState1 = false; // aktualny stan zaświecenia diody
#define buttonPin1 7 //pin do odczytu stanu przycisku
#define led1 11  //pin do obsługi diody
int wypelnienie = 0;

void setup() {

pinMode(led1, OUTPUT); //Dioda jako wyjście
pinMode(buttonPin1, INPUT_PULLUP); //Przycisk jako wejście
digitalWrite(led1, LOW); //Wyłączenie diody
Serial.begin(9600);
}

void loop() {

  if (digitalRead(buttonPin1) == LOW) {
     delay(20); //20ms na obsługę drgań styków
     buttonState1 = !buttonState1; //jest stan true i zamienia go na false
     if (buttonState1 == true){ 
     funkcja2(255,5,50);
        Serial.println(buttonState1);
        Serial.println(wypelnienie);
        }  else {
       digitalWrite(led1, LOW); // dioda sie
       Serial.println(buttonState1);
       Serial.println(wypelnienie);
        }
     while (digitalRead(buttonPin1) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk
     delay(20); //20ms na obsługę drgań styków
     }
} 


void funkcja2( int ilewypelnienie, int zmiana, int czas){ //ta sama funkcja co dioda tylko, ze na instrukcji warunkowej if
if(wypelnienie<ilewypelnienie){ 
       analogWrite(led1, wypelnienie);
        wypelnienie+= zmiana;
       }
      if(wypelnienie==ilewypelnienie){
        while(wypelnienie!=0){
        analogWrite(led1, wypelnienie);
        wypelnienie=wypelnienie-zmiana;
         delay(czas);
       }
      }
      delay(czas);
       }

Wciśniecie przycisku powoduje ustawienie stanu logicznego 1 i zmianę wypełnienia o wartość 5.

Wytłumaczy mi ktoś łopatologiczne jak napisać kod który:

  • Po wciśnięciu przycisku na pilocie lub zwykłego switcha zapamięta wciśniecie przycisku jako logiczne 1 i będzie wykonywał wywołaną funkcje
  • Ponowne wciśniecie tego samego przycisku spowoduje wyłączenie wywołanej funkcji lub wciśniecie innego przycisku zatrzyma aktualnie wywoływaną funkcję i wywoła inną

Proszę o pomoc.

222222222.png

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.