Skocz do zawartości

Czas świecenia diody


MateuszG

Pomocna odpowiedź

Witam,
jakiś czas temu wziąłem się za programowanie Arduino jednak napotkałem przeszkodę, z którą nie mogę sobie poradzić. Zagadnienie jest z pewnością trywialne dla większości użytkowników dlatego proszę o pomoc - kod który zmierzy czas świecenia diody np. gdy wciskamy przycisk lub w czasie migania. Kombinowałem z funkcją pulseIn() oraz millis() ale nie wychodzi... w Internecie również nie mogłem znaleźć nic analogicznego.

__________

Komentarz dodany przez: Treker

Link do komentarza
Share on other sites

Ale nie opisałeś w ogóle swojego problemu. Chcesz żeby dioda świeciła określony czas, czy ma się zachowywać w inny sposób np. gdy zostanie naciśnięty przycisk.

Link do komentarza
Share on other sites

Kolega chce chyba mierzyć czas świecenia "obcej" diody.

Czy wejściem do układu pomiarowego jest już sygnał cyfrowy? Zrobiłeś jakiś czujnik światła?

Może wrzuć kod który już zrobiłeś - popatrzymy. Na gotowiec zawsze przyjdzie czas a problem rzeczywiście wydaje się tak trywialny, że trudno tu coś skopać. Czy rozdzielczość pomiaru rzędu 1ms jest OK - bo tyle co najwyżej uzyskasz z millis(). Jakie długości impulsów wchodzą w grę? Czy dioda zapala się okresowo czy jeden impuls i koniec? Czy przerwy będą wystarczająco długie by je zauważyć?

Link do komentarza
Share on other sites

Chodzi mi o jakikolwiek przykład pomiaru czasu świecenia diody (obojętnie jak się zachowującej). Przykładowo chciałbym aby w każdym cyklu wyświetlało mi się ile czasu świeciła w nim dioda - próbowałem tak:

long czas = 0;
void setup() {
Serial.begin(9600);
pinMode(7,OUTPUT);
}

void loop() {
digitalWrite(7,HIGH);
delay(200);
digitalWrite(7,LOW);
delay(200);
czas = pulseIn(7,HIGH);
Serial.println(czas);
delay(200);
}

Wyczytałem, że funkcja pulseIn() mierzy czas dla wejścia (INPUT) dlatego program nie działa, jednak nie wiem jak zamienić OUTPUT dla diody na INPUT dla mojego czasomierza 🙂

Ogólnie problem napotkałem gdy chciałem sobie zrobić coś a la prędkościomierz za pomocą jednego fotorezystora. Odcinając dopływ światła przez przedmiot o znanej długości uruchamiałbym diodę a program miał liczyć czas świecenia diody do momentu jej zgaśnięcia (czyli powrotnego odsłonięcia fotorezystora).

Wczoraj po porażce z funkcją pulseIn() spróbowałem wykorzystać millis() jednak i tu się nie udało - program liczy czas nawet gdy dioda nie świeci i dodatkowo się sumuje...

int swiatlo_odniesienia = 0;
int odczyt = 0;
long czas = 0;

void setup() {

 pinMode(7,OUTPUT);
 Serial.begin(9600);
 delay(1000);
 swiatlo_odniesienia = analogRead(A5);
 Serial.println(swiatlo_odniesienia);
}

void loop() {
 odczyt = analogRead(A5);
 int z = swiatlo_odniesienia - 20;
 if(odczyt <= z && czas == 0)
   {
     czas = millis();
     digitalWrite(7,HIGH);
   }
 else if(odczyt > z)
   {
      digitalWrite(7,LOW);
        if(czas > 0)
          {
            Serial.println(czas);
            czas = 0;
          }
   }
      delay(10);
}

Zdaje sobie sprawę, że gdybym trochę posiedział nad powyższym kodem to być może doprowadziłbym do tego aby czasy przynajmniej się nie sumowały, mam jednak wrażenie że idę jak koń pod górę i da się to zrobić dużo prościej - proszę o wsparcie 🙂

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

Zaraz, to chyba jakieś kompletne pomieszanie. Przecież Twój pierwszy kod generuje impuls do diodki, to co tu mierzyć? Dioda jest zapalana, program czeka 200ms i doda gaśnie. Sam wpisałeś liczbę 200 jako argument opóźnienia, to chyba rozumiesz, że tyle będzie LED świecić, bo tyle czasu mija od jego zapalenia do zgaszenia.

Pomiar ma sens, gdy do Twojego procesora dochodzi impuls z czujnika jakiegoś zjawiska. Impuls o nieznanej długości podany na wejście, prawda? To może być fotoopornik, rzecz jasna odpowiednio podłączony tak, by jego zaciemnianie/odsłanianie powodowało podanie stanów logicznych na wejście procesora. Możesz też mierzyć napięcie analogowe, tak jak próbowałeś to robić.

Pomiar długości będzie składał się z kilku kroków:

1. Oczekiwanie na początek impulsu i zapamiętanie chwili w jakiej to się zdarzyło.

2. Oczekiwanie na koniec impulsu i znów zapamiętanie czasu.

3. Policzenie różnicy czasów - to jest właśnie długość impulsu.

int poziom_niski = 100;
int poziom_wysoki = 750;
int poziom_odciecia;
long pocz;
long koniec;
long dlug;

setup()
{
  poziom_odciecia = (poziom_niski+poziom_wysoki)/2;
  Serial.begin(9600);
}

loop()
{
  while (analogRead(wejscie) < poziom_odciecia);
  pocz = millis();
  while (analogRead(wejscie) > poziom_odciecia);
  koniec = millis();
  dlug = koniec-pocz;
  Serial.println(dlug);
}

Co o tym myślisz? Nie wstawiałem już deklaracji wejść i określania kierunków, ale to są szczegóły. Czy rozumiesz ideę oczekiwania na odpowiedni poziom sygnału w pustej pętli while? To nie Ty generujesz impuls, ale to impuls steruje pracą Twojego programu. Założyłem, że zmienne poziom_niski i poziom_wysoki zawierają skrajne odczyty z fotoopornika. Musisz rozpoznawać przejście z jednego poziomu na drogi i odwrotnie, a najwygodniej robić to w połowie między nimi.

Jeśli chcesz zapalać jakąś dodatkową diodkę by widzieć wykryty impuls, wstaw jeszcze dwie instrukcje:

loop()
{
  while (analogRead(wejscie) < poziom_odciecia);
  pocz = millis();
  digitalWrite(diodka, HIGH);
  while (analogRead(wejscie) > poziom_odciecia);
  koniec = millis();
  digitalWrite(diodka, LOW);
  dlug = koniec-pocz;
  Serial.println(dlug);
}
  • Lubię! 1
Link do komentarza
Share on other sites

Wielkie dzięki za szybką pomoc i wytłumaczenie! Dzięki Tobie wiele zrozumiałem. Rozwiązanie rzeczywiście okazało się proste i logiczne - czasem jednak ktoś musi nakierować na odpowiedni tor myślenia.

Pozdrawiam

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.