sterownik oświetlenia - podpowiedź potrzebna
sterownik oświetlenia - podpowiedź potrzebna
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.
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.
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ąć.
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ąć.
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.
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.
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.
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}}Kod: Zaznacz cały
if (adc < progi[sekcja][0]) sekcja--
if (adc > progi[sekcja][1] sekcja++ 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.
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?
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?
Ś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.
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.
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.
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ą.
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