4. Przykładowy program #2: Praktyczne wykorzystanie przetwornika ADC
Ten przykład będzie bardziej „życiowy”. Na wejście przetwornika, będziemy mieli podłączony dzielnik wykonany z fotorezystora i rezystora, a na pinie PWM diodę. Koncepcja jest taka, że im mniej światła będzie dochodzić do fotorezystora, tym mocniej będzie świecić dioda – coś na zasadzie układu sterującego lampką solarną.
Schemat:

Program:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
pwm.setup(4,1000,1023) -- konfigurujemy pin 4. jako PWM -- i nadajemy wstepna wartosc 1023 pwm.start(4) -- uruchamiamy PWM na pinie 4. function ADCdoPWM() --rozpoczynamy funkcję ADCdoPWM wartoscADC = adc.read(0) -- przypisujemy zmiennej val odczyt z ADC0 moc = wartoscADC -- przypisujemy zmiennej moc dane z funkcji val if moc >= 1023 then -- jezeli wartosc ADC jest wieksza/rowna niz 1023 moc = 1023 -- ustaw wartosc PWM na 1023 end -- koniec funkcji if moc <= 250 then -- jezeli wartosc ADC jest mniejsza/rowna niz 250 moc = 0 -- ustaw wartosc PWM na 0 end -- koniec funkcji print("Wartosc ADC: ", moc) -- wyswietl na monitorze szeregowym wartosc zmiennej moc pwm.setduty(4,moc) -- ustaw wypełnienie równe zmiennej moc end -- zamknij funckję ADCdoPWM tmr.alarm(0, 50, tmr.ALARM_AUTO, ADCdoPWM) --wykonuj funkcję ADCdoPWM co 50ms |
Na początku konfigurujemy wyjście 4. pinu PWM (na płytce NodeMCU niebieska dioda), żeby pracował z częstotliwością 1kHz oraz jego wartość początkowa wynosiła 1023 (dioda wyłączona). Następnie uruchamiamy ten pin. Teraz w pętli głównej programu przypisujemy zmiennej wartoscADC, odczyt z przetwornika ADC, oraz zmiennej moc, zmienną wartoscADC. Tutaj napotykamy mały problem, z którym musimy się uporać. Otóż zakres przetwornika ADC wynosi 0-1024, a zakres PWM jest 0-1023. W momencie, gdy na ADC otrzymamy wartość 1024 to PWM nie będzie w stanie jej obsłużyć przez co program nam się zawiesi. Dlatego musimy zablokować wartość ADC do 1023. W tym momencie musimy skorzystać z instrukcji warunkowej if, gdzie dla odczytów ADC większych lub równych 1023 będziemy zawsze otrzymywać 1023, ponieważ wartości powyżej 1023 będą zawieszać nasz program.
Kolejna instrukcja jest już opcjonalna, ale wytłumaczę o co chodzi. Jeżeli zasłonimy fotorezystor, to wartości ADC będą oscylować w granicach 200-300. Czyli jest bardzo ciemno. W tym przypadku dioda będzie się świecić na 75% mocy; to żeby się świeciła w 100% to możemy dać warunek. Jeżeli wartość ADC będzie mniejsza/równa 250 to zmienna moc- odpowiadająca za PWM -będzie wynosić 0 (100% jasności diody).
Na sam koniec wyświetlamy na monitorze portu szeregowego aktualną wartość ADC oraz ustawiamy wypełnienie PWM równe zmiennej moc. No i już na samym końcu konfigurujemy nasz timer, aby powtarzał program co 50 milisekund.
Efekt jaki powinniśmy uzyskać jest następujący:
Podsumowanie
Po dzisiejszej części kursu powinieneś/aś umieć:
- podstawowe funkcje obsługujące ADC w języku skryptowym Lua
- napisać prosty program obsługujący przetwornik analogowo-cyfrowy
- znać specyfikację przetwornika w ESP8266
Materiały do tej części kursu:
Jeżeli chcesz być informowany na bieżąco o nowych częściach kursu to kliknij „Lubię to!” bądź subskrybuj naszą stronę, aby otrzymywać na adres e-mail nowości ze strony. Jeżeli masz jakieś pytania to śmiało zadawaj je na forum ; )