sterownik oświetlenia - podpowiedź potrzebna

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

sterownik oświetlenia - podpowiedź potrzebna

Post autor: slawek55 » 02 mar 2014, 10:43

Cześć.
Mam taką zagwozdkę i może ktoś mi z Was coś podpowie, nasunie jakąś propozycję lub skieruje na właściwy tok myślenia.

Muszę zrobić coś ala sterownik oświetlenia w zależności od oświetlenia zewnętrznego. Jeden czujnik natężenia na zewnątrz który steruje czterema poziomami oświetlenia wewnątrz. Nie ma sprzężenia zwrotnego to ważne bo to czym steruję nie wpływa na czujnik zewnętrzny.
Z zasady działać to musi (nie ma bo jest narzucone) tak, że powiedzmy że mamy zewnętrzne natężenie wynoszące 4 (w jednostkach na z przetwornika ADC, po prostu jakiś czujnik podpięty pod przetwornik).
Natężenie wzrasta i po przekroczeniu 10 załącza się sekcja pierwsza. A... sekcja pierwsza to małe natężenie światła wewnętrznego, sekcja druga to większe natężenia od pierwszej i tak aż do czwartej. Z tym że sekcja druga nie jest włączona bez pierwszej a trzecia jest załączona razem z pierwszą i drugą. Po prostu po kolei.
Przy dalszym wzroście natężenia i przekroczeniu progu 15 włącza się kolejna druga i teraz razem są pierwsza i druga. Dalszy wzrost powoduje dodanie kolejnej trzeciej. Itd..
A teraz schodzimy w dół i wraz ze spadkiem natężenia wyłączają się od ostatniej aż do pierwszej i poniżej 10 nic nie jest załączone.
Przy tym potrzebna jest jakaś histereza aby na progach nie było przeskakiwania.

Myślałem aby to zrobić na takiej zasadzie że wprowadzam zmienną LAST i przy jej pomocy mam coś takiego jak różnicę pomiędzy wartością bieżącą a poprzednia DIFF. Dzięki niej można stwierdzić czy rośnie czy maleje DIF=LAST-ODCZYTANE
np pierwszy warunek
if(DIFF<0 && ODCZYTANE>10) SEKCJA_1_ON;
drugi poziom
if(DIFF <0 && ODCZYTANE>15) {SEKCJA_1_ON; SEKCJA_2_ON:}

Ale problem zrobił mi sie czy schodzeniu w dół, zresztą teraz już nawet nie wiem czy ten pomysł też jest słuszny?

Proszę podrzucie mi jakieś pomysły co naprowadzi mnie na rozwiązanie.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 02 mar 2014, 11:14

Zrób to na select case, znaczy w C będzie to zdaje się switch.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 02 mar 2014, 11:20

Tak tylko jak wykryć że wzrasta a potem spada w dół

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 02 mar 2014, 12:06

No odczytujesz na bieżąco ADC. Niestety nie znam C więc w kwestii technicznej Ci nie pomogę.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 02 mar 2014, 13:48

Możesz podać samą idee niekoniecznie w C.

Myślałem nad tym co pisałeś i mógłbym np zrobić to zwykłą instrukcją switch (select) lub na if'ach. Ale... zobacz co będzie na progach np do 10
if(ADC<=10) sekcja1
if(ADC>10) sekcja2

teraz na granicy 10 co kolejny odczyt będzie skakać pomiędzy włączeniem sekcja1 a sekcja2. A tego muszę uniknąć.

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 02 mar 2014, 14:50

Zmienna sekcja odpowiada za sterowanie oświetleniem. Wartość 0 to wszystko zgaszone, 1 to świeci 1, 4 to świecą wszystkie 4.
Zmienna (stała) progi to tablica zawierająca 5 par wartość, odpowiednio minimalną i maksymalną wartość ADC jaka jest dopuszczalna dla danego poziomu oświetlenia wewnętrznego.

Kod: Zaznacz cały

int progi[5][2] = { {0,15}, {10,25}, {20,35}, {30,45},{40,255}}
Teraz załóżmy że oświetlenie mamy ustawione na zero, słoneczko zaświeci na wartość ponad 15, chcemy włączyć oświetlenie, natomiast zgasimy je gdy spadnie poniżej 10.

Kod: Zaznacz cały

if (adc < progi[sekcja][0]) sekcja--
if (adc > progi[sekcja][1] sekcja++ 
Na koniec warto dodać jeszcze warunek, gdy sekcja jakimś sposobem będzie większa od 4, ustawiamy ją na 4. Ujemne wartości tutaj raczej nie grożą.

Ten algorytm ma ciekawą właściwość, że na pozór trzeba go uruchomić kilkukrotnie by po zmianie oświetlenia z zera na max jednocześnie zapaliły się wszystkie sekcje oświetlenia.
W rzeczywistości, jeśli będziesz go uruchamiać co minutę, przejście od zera do max oświetlenia zajmie 3 minuty. Moim zdaniem jest to zaleta, bo nagła zmiana jasności spowodowana np. chwilowym zasłonięciem czujnika nie będzie zbyt mocno odczuwalna.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 02 mar 2014, 16:20

Nie wiem jak na to wpadłeś ale podziwiam. Serio.
Dopiszę resztę i sprawdzę jak to pracuje.

Tak sobie jeszcze pomyślałem o jednej rzeczy. Co w sytuacji nagłej zmiany wartości?
Tzn. zamiast zwiększania się od 0 do max płynnie przeskoczy. Powiedzmy było 15 i następny pomiar do 30 mimo że "spodziewany" powinien być 20?

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 02 mar 2014, 17:10

Świeci 0 sekcji.
Napięcie zmieniło się z '10' na '30' i utrzymuje na tym poziomie.

W pętli dokonujemy odczytu ADC i sprawdzenia progów powiedzmy co 10s:
Pierwszy przebieg: 30>15, więc załączamy 1 sekcję
Drugi przebieg: 30>25, więc załączamy 2 sekcje
Trzeci przebieg: 30 mieści się w zakresie (20,35) więc zostają zapalone 2 sekcje.

Wynik: zapali się jedna sekcja, a po 10s druga.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 02 mar 2014, 17:49

To jest jakieś zadanie do szkoły ? Bo w praktyce to bym się nawet nie bawił w mikroprocesor przy takimiś czymś. PWM na NE555 strowany fotoopornikiem i tyle.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 02 mar 2014, 18:55

Nie to nie zadanie do szkoły. uC musi być bo ważną częścią tego jest jeszcze wyjście, tu w skrócie opisane jako sekcje. To jest sterownik do oświetlenia terrarium. Dlaczego jego oświetlenia ma zależeć od oświetlenia zewnętrznego, nie wiem, nie znam się na tym. Kolega poprosił mnie o coś takiego i utknąłem na tym algorytmie.

Awatar użytkownika
tom5555
Użytkownik
Posty: 625
Rejestracja: 23 sty 2008, 1:20
Lokalizacja: Zabrze
Kontakt:

Post autor: tom5555 » 04 mar 2014, 16:30

Ja bym to zrobił na czterech komparatorach, sterujących przekaźnikami załączającymi kolejne sekcje. O wiele mniejszy koszt w porównaniu do uP i możliwość ustawienia poziomów progów za pomocą paru miniaturowych potencjometrów. Jeżeli układ nie ma spełniać żadnych dodatkowych funkcji jak np. wyłączanie i włączanie oświetlenia o ustalonych godzinach, to stosowanie uP jest przesadą.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 04 mar 2014, 20:37

Wiesz może i masz rację, ale jak pisałem tam ważną sprawą jest jeszcze podłączenie uC do układu wykonawczego, ponieważ poziomem steruje się na zasadzie sterowanie falownikiem, a do jego wysterowania nie można zwyczajnie podłączyć potencjometru, bo komunikacja z nim jest po szynie RS485 i po prostu prościej wysterować przy pomocy uC

ODPOWIEDZ