Skocz do zawartości
krissbankle

Arduinio fade+millies - animacja LED

Pomocna odpowiedź

Witam wszystkich z góry prosilbym o wyrozumiałość jestem osobą początkująca więc nie wszystko rozumiem tak jak Wy:)  Przygodę z ardurinio zacząłem jakiś czas temu, przeczytałem większość poradników krok po kroku jednak nadal nie mogę połączyć dwóch funkcji na których mi  bardzo zależy a chodzi mi dokładnie o taki projekt ( chciałbym aby rozjasnianie i przygasanie trzech ledow kontrolować w czasie millis oraz określając  czas każdego leda z osobna kierować jego stanem po rozjasnieniu aby świecił przykładowo przez 3 sek. Próbowałem połączyć te 2 funkcje fade oraz millis ale coś mi nie wychodzi. Chciałbym coś z tego zrozumieć robię to wyłącznie dla siebie z upodobań do elektryki lecz z programowania jestem zielony. Pozdrawiam i przepraszam że jestem taki głupcem. 

Udostępnij ten post


Link to post
Share on other sites

@krissbankle, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

9 godzin temu, krissbankle napisał:

Przygodę z ardurinio zacząłem jakiś czas temu, przeczytałem większość poradników krok po kroku jednak nadal nie mogę połączyć dwóch funkcji na których mi  bardzo zależy a chodzi mi dokładnie o taki projekt ( chciałbym aby rozjasnianie i przygasanie trzech ledow kontrolować w czasie millis oraz określając  czas każdego leda z osobna kierować jego stanem po rozjasnieniu aby świecił przykładowo przez 3 sek. Próbowałem połączyć te 2 funkcje fade oraz millis ale coś mi nie wychodzi.

Na czym dokładnie utknąłeś masz jakiś fragment kodu, który możesz się pochwalić?

Udostępnij ten post


Link to post
Share on other sites

Dzisiaj spróbowałem innym sposobem i znowu nic z tego, zmieniłem zakładany  projekt żeby działa się taka sytuacja ( po naciśnięciu przycisku najpierw rozjaśnia się pierwszy Led1 następnie w połowie jego czasu rozjasniania, rozjaśnia się drugi Led2 następnie w połowie czasu rozjasniania drugiego rozjaśnia się trzeci Led3, led1 i 2 świecą dopóki nie dopali się led3, po rozjasnieniu Led3 wszystkie 3 Led migaja 3 razy i wszystko gaśnie. Bardzo mi zależy na tym projekcie jestem zdeterminowany aby nauczyć się wszystkiego co będzie mi potrzebne. Dzięki że w ogóle zainteresowales się tematem 🙂 P. S jak na razie korzystam z przykładu (po naciśnięciu przycisku  rozjaśnia Led1 zostaje w stanie High dopoki nie nacisne przycisku ponownie wtedy gaśnie całkowicie.

code.rar

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

To może jednak pokażesz kod. To jest, jakbyś nie zauważył, forum o robotyce a nie o wróżbiarstwie i parapsychologii...

a, wrzuciłeś rara. nie zauważyłem... ale nawet gdybym zauważył to na komórce go nie otworzę... 

Edytowano przez ethanak

Udostępnij ten post


Link to post
Share on other sites

Wrzuciłem kod w pliku rar. 🙂

/*
 Project name: FadingLED

 Description: A demonstration of using Arduino input (external pushbutton on pin 2) 
   to control an output (LED on pin 9).

 Created by Pavel (DarkBlueBit.com) in 2016 <https://darkbluebit.com>
   
const int ledPin1 = 10;
const int ledPin2 = 9;  
const int ledPin3 = 5;    
const int buttonPin = 2;
const int fadingDelay1 = 10;  
const int fadingDelay2 = 10; 
const int fadingDelay3 = 10; 
int buttonState1 = 0; 
int buttonState2 = 0; 
int buttonState3 = 0; 
boolean fadingState1 = false;
boolean fadingState2 = false;
boolean fadingState3 = false;

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(buttonPin, INPUT);
}
void loop() {
buttonState1 = digitalRead(buttonPin);
  if (buttonState1 == HIGH) {
    if (fadingState1 == false) {
      for (int i =0; i <= 255; i += 5) {
        analogWrite(ledPin1, i);
        delay(fadingDelay1);
      }
} else {
      // turn off the LED
      for (int i = 255; i >= 0; i -= 5) {
        analogWrite(ledPin1, i);
        delay(fadingDelay1);
      }      
    }
    fadingState1 = !fadingState1; 
  }
buttonState2 = digitalRead(buttonPin);
  if (buttonState2 == HIGH) {
    if (fadingState2 == false) {
      for (int i = 0; i <= 255; i += 5) {
        analogWrite(ledPin2, i);
        delay(fadingDelay2);
      }
} else {
      // turn off the LED
      for (int i = 255; i >= 0; i -= 5) {
        analogWrite(ledPin2, i);
        delay(fadingDelay2);
      }      
    }
    fadingState2 = !fadingState2;   
buttonState3 = digitalRead(buttonPin);
  if (buttonState3 == HIGH) {
    if (fadingState3 == false) {
      for (int i = 0; i <= 255; i += 5) {
        analogWrite(ledPin3, i);
        delay(fadingDelay3);
      }
    } else {
      // turn off the LED
      for (int i = 255; i >= 0; i -= 5) {
        analogWrite(ledPin3, i);
        delay(fadingDelay3);
      }      
    }
    fadingState3 = !fadingState3; 
  }
  }
}


 

Udostępnij ten post


Link to post
Share on other sites

czegoś nie rozumiem - chcesz sterować trzema ledami oddzielnie jednym przyciskiem? jak to ma działać? tylko dokładnie poproszę, co ma się stać po wciśnięciu czy puszczeniu klawisza...

przy okazji to co cały czas powtarzam: na razie zapomnij o istnieniu for i while, musi Ci wystarczyć jedna główna pętla w której wykonuje się loop(). delay(10) jest tu jak najbardziej na miejscu i robi to, do czego go wymyślili, więc ma początek nie kombinuj z millis().

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Chciałbym żeby po jednokrotnym naciśnięciu przycisku ( najpierw rozjaśnia się pierwszy Led1 następnie w połowie jego czasu rozjasniania, rozjaśnia się drugi Led2 następnie w połowie czasu rozjasniania drugiego rozjaśnia się trzeci Led3, led1 i 2 świecą dopóki nie dopali się led3, po rozjasnieniu Led3 wszystkie 3 Led migaja 3 razy i wszystkie Led gasną powoli. Następnie znowu przyciskam przycisk i operacja się powtarza, wszystko za sprawą jednokrotnego kliknięcia w przycisk. Chcę sterować jednym przyciskiem do 3ledow.

Edytowano przez krissbankle

Udostępnij ten post


Link to post
Share on other sites

no to umieść to wszystko w jednej pętli. przykładowo bardzo prosty program dla dwóch led:

jeśli i < 128, pierwsza leda świeci z jasnością i, druga jest wyłączona

inaczej jeśli i < 256, pierwsza leda świeci z jasnością i, druga i-128

inaczej jeśli i < 372, pierwsza świeci z jasnością 255, druga i-128

inaczej wszystkie gasną i czekamy na klawisz.

Albo bardziej ogólnie: jasność każdej ledy jest funkcją numeru kroku. W powyższym przypadku będzie to i dla pierwszej ledy, i-128 dla drugiej, przy ograniczeniu poprzez constrain do zakresu 0..255.

może być?

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Funkcja może zostać tak stworzona, by pamiętała co robiła w poprzednim wywołaniu i  kontynuowała pracę tam gdzie skończyła (o ile jest taka potrzeba) lub od razu wróciła z powrotem do pętli loop. Służy do tego "static". Jeśli wystarcza interwał czasowy zapewniany przez millis (nie może być wtedy długich funkcji w loop, np. z delay) to może to być zwykła funkcja w loop, ewentualnie można ją wywoływać cyklicznie przerwaniem timera. Ostatni wydłubałem coś takiego:

const int buzzer=13;
const int button=2;
const int button2=3;
const int button3=4;
boolean stanbuzzera, resetuj;


void setup() {
  // put your setup code here, to run once:
pinMode(buzzer,OUTPUT);
pinMode(button,INPUT_PULLUP);
pinMode(button2,INPUT_PULLUP);
pinMode(button3,INPUT_PULLUP);
//delay(10);
}

void loop() {
static int ilosc_pikow=20;
  // put your main code here, to run repeatedly:
  if(!digitalRead(button)||stanbuzzera)  dzwiek(200,ilosc_pikow,buzzer);
  if(!digitalRead(button2)) stanbuzzera=0; //zrobi pauze funkcji
  if(!digitalRead(button3)) resetuj=1; //zresetuje miganie
}

void dzwiek(uint16_t dlugosc, uint16_t pikniec, uint16_t pin) //(dlugosc piku, ile pikniec, na ktory pin)
{
static uint16_t aktualnyPik=0;
static boolean stanpoprzedni=0;
static uint32_t lasttime=0;
uint32_t currenttime=millis();
if(resetuj)
{
   aktualnyPik=0;
   stanbuzzera=0;
   resetuj=0;  
   return;
}
if((uint32_t)(currenttime-lasttime)>=(uint32_t)dlugosc)
{
  lasttime=currenttime;
  if( aktualnyPik++ <(pikniec*2))//mnozymy *2 by pikniec bylo 10, nie zmian stanu
  {
    digitalWrite(pin,!digitalRead(pin));
    stanbuzzera=1;
  }
  else
  {
   aktualnyPik=0;
   stanbuzzera=0;
  }

}
  
}

można spauzować działanie funkcji albo zresetować, tak by po kolejnym wywołaniu od nowa namigała 20x. To w założeniu miało wywołać alarm buzerem, ale nie blokować loop na czas wywołania tego pikania.

Udostępnij ten post


Link to post
Share on other sites

po co funkcja ma cokolwiek pamiętać, jeśli wystarczy prosta zależność jasność/czas? Zależność wcale nie musi być liniowa, ale liniowość i prostota to dwa różne pojęcia.

Nie komplikuj prostego problemu.

Udostępnij ten post


Link to post
Share on other sites

Tak jak pisałem wcześniej wrócę napisać o postępach mojego projektu, odpowiedź ethank naprowadzila mnie do sposobu ustawienia animacji której oczekiwałem i nie tylko 🙂 temat do zamknięcia:) Nadal będę kontynuować swoją przygodę z ardurinio moim następnym pomysłem jest podłączenie do szyny can w BMW e46. 

Udostępnij ten post


Link to post
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!

Gość
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...