Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sterowanie oświetleniem z czujnikiem odległości

lol2000k 02 Paź 2017 17:03 696 6
  • #1 02 Paź 2017 17:03
    lol2000k
    Poziom 11  

    Dzień dobry,
    zbudowałem sobie prosty układ sterujący pracą pasków ledowych, mamy jako mikrokontroler ATTiny na digisparku, jeden MOSFET i czujnik ultradźwiękowy. Najpierw użyłem kodu który po prostu włącza ledy jeśli ktoś znajduje się w odległości mniejszej niż... jednak chciałem rozbudować działanie układu o stopniowe rozjaśnianie/ściemnianie w taki sposób, że gdy stoimy bliżej to szybciej się rozjaśnia i na odwrót, jak odejdziemy to po chwili zgaśnie. Jednak kod który napisałem działa tak, że np. rozjaśnia się stopniowo i gdy dojdzie do maksymalnego wypełnienia to wraca do jakichś 20% wypełnienia i znowu narasta. Co zrobiłem nie tak?

    Kod: text
    Zaloguj się, aby zobaczyć kod

    0 6
  • Pomocny post
    #2 02 Paź 2017 19:28
    zster

    Poziom 28  

    "przekręcasz" zmienną PWM. Może ona przyjąć maksymalną wartość 255. Jeśli przypiszesz jej wartość większą, np 300, to przeskoczy do wartości 44.

    Jako szybkie, choć mało eleganckie rozwiązanie możesz :
    zmienić tym zmiennej PWM na int
    oraz przed wywołaniem funkcji analogWrite() umieścić :

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Lub po prostu zadbać, by przekręcenie to nie było możliwe w warunku IF odpowiedzialnym za rozjaśnianie.

    0
  • #3 02 Paź 2017 19:31
    lol2000k
    Poziom 11  

    Też tak właśnie myślałem ale przecież użyłem constrain żeby temu zapobiec. Czy to znaczy że if najpierw daje wartość np. 300 a dopiero potem constrain ją obcina do założonych 200? Jeśli tak to jak poradzić sobie z tym przeskakiwaniem?
    EDIT:
    Zauważyłem dopiero twoją edytowaną odpowiedź, zaraz sprawdzę czy to zadziała.

    0
  • #4 02 Paź 2017 19:44
    zster

    Poziom 28  

    Tak, użyłeś constrain w tym wypadku to nic nie da. Zobacz co się stanie w warunku odpowiedzialnym za rozjaśnianie gdy :

    PWM dojdzie do 125 a dist1 == 200

    125 + 125 + 20 ... jaki wynik ? :)

    0
  • #5 09 Paź 2017 16:01
    lol2000k
    Poziom 11  

    Dodanie warunku o jakim pisałeś nie pomogło, zmienna byte gdy przekręci się w jedną lub drugą stronę wraca do jakiegoś jednego stanu. Zmieniłem to na int i dodałem takie warunki, teraz działa idealnie.

    0
  • #6 09 Paź 2017 16:44
    zster

    Poziom 28  

    Dlatego pisałem, by zmienić typ na int ;)
    Cieszę się, że działa :)

    0
  • #7 09 Paź 2017 17:20
    lol2000k
    Poziom 11  

    Wybacz, umknęło mi to jakoś. No nic, najważniejsze że działa :)

    0