Skocz do zawartości

Pomocna odpowiedź

Napisano

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. 

@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ć?

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

(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

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; 
  }
  }
}


 

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

(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

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

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.

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.

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. 

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