Odkryj nasze najnowsze porady związane z Arduino! 🌟 Wewnątrz wskazówki, które mogą być pomocne dla Twoich projektów!

#001

Witajcie w naszym najnowszym newsletterze edukacyjnym poświęconym tematyce Arduino! Przede wszystkim dziękujemy za zaufanie i dołączenie do naszej listy mailingowej. Cieszymy się, że możemy razem odkrywać niesamowity świat mikrokontrolerów i projektowania elektroniki. 

W naszych newsletterach skupimy się głównie na zgłębianiu tajemnic programowania, elektroniki, ciekawych projektach znalezionych w sieci, nowościach ze społeczności arduinowo.pl oraz podsumowań naszych dyskusji na kanałach Discord. Niezależnie od tego, czy dopiero zaczynasz swoją przygodę, czy już tworzysz złożone projekty, mam nadzieję, że znajdziesz tutaj coś ciekawego i inspirującego. Zapraszamy do lektury i eksperymentowania!

Czym są funkcje w Arduino? Funkcje to małe bloki kodu, które wykonują określone zadanie. Możesz je wywoływać wielokrotnie w swoim programie, co ułatwia zarządzanie kodem i rozwiązywanie skomplikowanych problemów.

Dlaczego funkcję są dla nas ważne? Używanie funkcji jest bardzo korzystne podczas pracy z AI, ponieważ na chwilę obecną modele takie jak chatGPT nie potrafią wygenerować kodów dla bardziej złożonych projektów. Pytając chatGPT o napisanie tylko pojedynczych funkcji łatwiej jest nam dokładnie opisać czego oczekujemy, przetestować i zaimplementować w projekcie. 

Podczas pracy z Arduino często wykorzystujemy wbudowane funkcje systemowe, na przykład:

1. Funkcję delay(1000), która wprowadza opóźnienie w wykonywaniu programu na jedną sekundę. 

2. Funkcję digitalRead(3), która służy do odczytywania stanu cyfrowego z określonego pinu, w tym przypadku z pinu numer 3. Funkcja ta zwraca wartość binarną, która może być HIGH (wysoki) lub LOW (niski), w zależności od stanu napięcia na danym pinie. Jest ona przydatna do odczytywania sygnałów z różnych czujników lub przycisków.

W Arduino IDE możemy stworzyć również własne funkcje, przykładowo funkcję która doda nam dwie liczby całkowite - Rys.1.



Rys.1. Przykład definicji funkcji użytkownika zwracającej sumę dwóch liczby.

Elementy składowe definicji funkcji:

1. Nazwa funkcji: Na początku nadajemy unikatową nazwę funkcji. Najlepiej, aby jej nazwa kojarzyła się z zadaniem realizowanym przez funkcję. W naszym przypadku funkcja ma dodawać dwie liczby dlatego nazwaliśmy ją dodaj.

2. Parametry wejściowe: W tym miejscu wprowadzamy zmienne, które chcemy wykorzystać w naszej funkcji. W naszej przykładowej funkcji dodaj parametrami wejściowymi będą dwie liczby, które chcemy dodać i nazwaliśmy je literami a oraz b. Dodatkowo musimy podać typy tych zmiennych. Typy zmiennych w Arduino to podstawowe elementy, które pozwalają określić rodzaj i rozmiar danych, z którymi program będzie pracować. O typach napiszemy jeszcze szczegółowo w innym wydaniu newslettera. W tym przykładzie dla naszych parametrów wejściowych wybraliśmy typ int (INTEGER), który reprezentuje zmienną całkowitą o wartości w zakresie od -32768 do 32767. Możliwe jest stworzenie funkcji bez parametrów wejściowych - wtedy w nawiasach okrągłych, gdzie wpisalibyśmy parametry nic nie wpisujemy.

3. Ciało funkcji, klamry: Ciało funkcji to miejsce, gdzie umieszczamy wszystkie polecenia (kod programu funkcji), które wykonać ma funkcja i muszą zawierać się między klamrą otwarcia { oraz zamknięcia }. Ponieważ nasza funkcja ma dodać dwie liczny, wprowadziliśmy dodatkowo zmienną c jest równa sumie zmiennej a oraz zmiennej b. Zmienną c zdefiniowaliśmy jako typu int - INTEGER, trzeba jednak zwrócić uwagę, że suma dwóch liczb typu int w wyniku może dać liczbę poza zakresem typu int od -32768 do 32767 (wtedy funkcja nie będzie działała prawidłowo). Należy o tym pamiętać i w razie potrzeby zmienić typ na long lub wprowadzić dodatkowe zabezpieczenie (np. funkcję sprawdzającą).

4. Wartość zwracana i jej typ: W Arduino IDE, funkcja zwraca wartość po poleceniu return. Funkcja może zwrócić tylko pojedynczą wartość i po zrealizowaniu polecenia return ignoruje dalszy kod programu funkcji. W naszym przykładzie zwróciliśmy wartość zmiennej c czyli napisaliśmy: return c;. O typach było już krótko w podpunkcie nr 2. Tak samo jak parametry funkcji muszą mieć swój typ, również musimy zdefiniować typ dla wartości zwracanej. Ponieważ nasza zmienna c jest typu int dlatego można przypisać taki sam typ zwracany, czyli int. Jeśli nie chcemy, aby funkcja zwracała wartość zamiast typu wpisujemy void.

Wywołanie funkcji: Mamy już gotową funkcję dodaj i teraz możemy użyć ją w naszym kodzie głównego programu setup lub loop. W naszym przypadku, jeśli chcemy obliczyć sumę liczb 2 i 5, wywołanie funkcji będzie wyglądało bardzo prosto: doda(2,5); Wynik możemy również przypisać do nowej zmiennej np.: int wynik = doda(2,5);. Po takim poleceniu zmienna wynik przyjmie wartość równą 7.

W praktyce użycie naszej funkcji dodaj będzie wyglądało następująco:

Kod definicji funkcji w przeciwieństwie do wywołania funkcji dodajemy w dowolnym miejscu poza sekcją setup i loop (my umieściliśmy na końcu programu za sekcją loop - patrz na kod powyżej).

Ciekawostki dla bardziej zaawansowanych

Jak w Arduino zwrócić z funkcji więcej niż jedną wartość? W Arduino IDE nie da się bezpośrednio zwrócić więcej niż jednej wartości, można jednak zastosować pewne triki. Poniżej pokażemy jak "zwrócić" dwie zmienne - jednocześnie wynik dla dodawania oraz odejmowania.

1. Użycie zmiennych globalnych na przykład:

2. Użycie wskaźników na przykład:

3. Użycie struktury na przykład:

4. Użycie tablicy na przykład:

Powyższymi sposobami można "zwrócić" z funkcji kilka parametrów. Znajcie jeszcze jakieś inne sposoby? Jeśli tak koniecznie napiszcie w społeczności na naszym serwerze Discord.

W pierwszym wydaniu newsletera, napiszemy krótko o najbardziej podstawowym elemencie wykorzystywanym w elektronice -  jest nim rezystor. W jednym zdaniu można napisać, że rezystor jest elementem ograniczającym prąd płynący w obwodzie elektrycznym. Na schematach rezystory mogą mieć różne symbole graficzne np. - Rys.2.

Rys.2. Przykłady symboli graficznych rezystorów na schematach.

Rezystory przydają się także w wielu bardziej złożonych aplikacjach, takich jak dzielniki napięcia, filtry, czy układy wzmacniaczy. Znajomość ich właściwości pozwala na precyzyjne kontrolowanie sygnałów w obwodzie, co jest niezbędne w wielu zaawansowanych projektach Arduino.

Co ważne, rezystory występują w różnych wartościach rezystancji, które są zazwyczaj oznaczane za pomocą kodu kolorowego – umiejętność odczytywania tych kodów jest bardzo pomocne (szukaj w sieci "kod paskowy rezystora"). Również rezystory SMD są oznaczone cyframi.

Wartość rezystancji można również zmierzyć multimetrem, jednak w ten sposób możemy mierzyć tylko rezystory niepodłączone do obwodu (pomiar podłączonego do obwodu rezystora może dać nieprawidłowy wynik).

Dla użytkowników Arduino, zrozumienie roli rezystorów jest kluczowe. Są one nie tylko fundamentem wielu projektów, ale także służą do ochrony innych komponentów przed uszkodzeniem przez nadmierny prąd. Przykładem może być użycie rezystora do ograniczenia prądu płynącego przez diodę LED, aby zapobiec jej przepaleniu - Rys.3.

Rys.3. Przykład zastosowania rezystora w obwodzie diody LED.

Jak obliczyć wartość rezystora, który musimy zastosować dla typowej diody LED? 

Nasza płytka Arduino zasilana jest napięciem 5V to napięcie zasilania (NZ) diody również wynosi NZ = 5V. Aby obliczyć wartość rezystora R, przyjmijmy standardowe wartości dla typowej diody LED:

1. Prąd przewodzenia (PP) diody LED: PP = 20 mA (0.02 A) - to typowa wartość dla wielu diod LED.
2. Napięcie przewodzenia (NP) diody LED: NP = 2V - to przybliżona wartość dla wielu diod LED, ale może się różnić w zależności od koloru i typu diody.

Zastosujemy wzór na obliczenie wartości rezystancji (prawo Ohma):

R = (NZ-NP)/PP = (5V - 2V) / 0.02A = 150Ohm

Wartość rezystora, który powinieneś użyć do ograniczenia prądu diody LED podłączonej do źródła 5V, wynosi minimalnie 150Ohm. Jeśli masz kartę katalogową używanej diody LED, możesz znaleźć w niej dokładne wartości prądu oraz napięcia przewodzenia i podstawić do powyższego wzoru.

Jaki rezystor zastosować, aby chronić pin wyjściowy Arduino UNO (ustawiony jako OUTPUT) przed uszkodzeniem?

Arduino UNO działa z napięciem logicznym U = 5V i zaleca się, aby prąd płynący przez każdy pin GPIO nie przekraczał I = 20mA (absolutnie maksymalny prąd dla pinu GPIO to I = 40 mA).

Wartość rezystora zalecana: R = U / I = 5V / 0.02A = 250Ohm.

Wartość rezystora minimalna: R = U / I = 5V / 0.04A = 125Ohm.

Aby ograniczyć prąd do 40 mA na pinie wyjściowym Arduino UNO, należy użyć rezystora o wartości nie mniejszej niż 125 omów. Użycie takiego rezystora zapewni, że prąd płynący przez pin nie przekroczy maksymalnej bezpiecznej wartości dla Arduino UNO, nawet jeśli pin zostanie przypadkowo zwarty do masy (jednak rekomenduje się używanie rezystorów o nieco wyższej wartości np. 220Ohm). 

Rezystory nielinowe

Chociaż większość standardowych rezystorów ma liniową charakterystykę rezystancji w stosunku do napięcia, rezystory nieliniowe wykazują zmienność swojej rezystancji w zależności od innych czynników, takich jak temperatura, oświetlenie czy napięcie.

Termistory w skrócie PTC (Positive Temperature Coefficient) i NTC (Negative Temperature Coefficient). Termistory PTC zwiększają swoją rezystancję wraz ze wzrostem temperatury, podczas gdy termistory NTC zachowują się odwrotnie – ich rezystancja maleje przy wzroście temperatury. Ta właściwość sprawia, że są one niezwykle przydatne w aplikacjach do pomiaru temperatury, ochrony przed przegrzaniem, czy w układach kompensacji temperaturowej.

Fotorezystory zmieniają swoją rezystancję w odpowiedzi na zmiany natężenia światła. Ich rezystancja maleje przy wzroście natężenia światła, co czyni je przydatnymi w czujnikach światła, alarmach i urządzeniach do automatycznego sterowania oświetleniem.

Warystory, znane również jako VDR (Voltage Dependent Resistors), mają charakterystykę rezystancji zależną od przyłożonego napięcia. Przy normalnych warunkach pracy mają wysoką rezystancję, ale w przypadku wystąpienia wysokiego napięcia (jak w przypadku przepięć) ich rezystancja gwałtownie spada, co pozwala na przepuszczenie prądu i ochronę innych elementów układu.

Ciekawostką może być fakt, że w bardzo zaawansowanych zastosowaniach, takich jak precyzyjne układy pomiarowe czy sprzęt audiofilski, wybór odpowiedniego typu rezystora (np. metalizowany, drutowy, węglowy) może mieć znaczący wpływ na działanie całego układu ze względu na różnice w szumie termicznym, stabilności i innych parametrach rezystorów.

W tej części newsletera przedstawiamy ciekawy projekt znaleziony w sieci. Tym razem jest nim angielskojęzyczny projekt dla Arduino UNO, wykorzystujący wyświetlacz OLED jako wskaźnik trójwymiarowego kompasu pionowego. Autor w celu pokazania jak działa wyświetlanie kierunku dla uproszczenia zastosował potencjometr zamiast magnetometru. Poza samym opracowaniem, autor pokazuje również na filmie, w jaki sposób zasymulować pracę potencjometru oraz wyświetlacza OLED online na stronie wokwi.com

Choć kanały na naszym serwerze Discord zostały niedawno utworzone i nie ma jeszcze wielu członków, nie brakuje na nim ciekawych dyskusji. 

Zamieszczamy tu podsumowanie naszych ostatnich dyskusji na serwerze Discord:

@jimboston - przedstawił swój projekt automatycznej praski do prochu, wykonanej w technologii 3D oraz schemat blokowy jej działania. Pytał również rekomendację w sprawie doboru najlepszych podzespołów. 

@PM - przedstawił propozycję kodu programu dla Arduino dla praski użytkownika @jimboston

@Piotr Spychalski Gaśnica - pytał o programy do projektowania PCB oraz firmy produkujące płytki PCB.

Dla osób które chcą jeszcze zapisać się na serwer dyskusyjny o Arduino na Discord udostępnione zostało aktualne zaproszenie:

Dziękujemy za przeczytanie tego newslettera. Twoja opinia jest bardzo ważna i wpływa na treści, które w przyszłości zostaną opublikowane.

Czy podobała Ci się treść tego wydania newslettera?

Jaki jest dla Ciebie poziom zaawansowania materiałów tego wydania newslettera?

Swoją szczegółową opinią możesz podzielić się na kanale Discord o nazwie "newsletter-dyskusja"



Wypisz się z newslettera
Sent by MailerLite