Witajcie Majsterkowicze ! Jest to mój pierwszy post na Majsterkowie, do tej pory byłem tylko czytelnikiem lecz postanowiłem pomóc początkującym w sferze Arduino i napisać post skierowany dla początkujących. W poście wykorzystuje rzeczy kupione w sklepie Botland.com.pl głównie jest to Starter kit rozszerzony z Arduino Uno i parę inny elementów. W tym poście chciałbym pokazać wszystkim początkującym że Arduino jest bardzo proste i nie trzeba znać zawiłych języków programowania tylko uproszczony język C. Aby czytelnik mógł zapoznać się z językiem Arduino wiele części programu będę tłumaczył pod kodem lub w komentarzach programu. Na początek zbudujemy sobie prosty układ którego celem jest zapalanie i zgaszanie diody (lub innego elementu zasilanego przez 5V o poborze prądu nie większym niż 50mAm) przez wciśnięcie przycisku (tak zwany tact-switch) a później zmienianie stanu diody poprzez jednorazowe wciśnięcie przycisku i zatrzymanie tego stanu ( po wciśnięciu przycisku dioda się zapala, gdy naciśniemy drugi raz zgaśnie). Zaczniemy może od rysunku płytki i połączeń pomiędzy Arduino a innymi elementami
Rezystor obok diody led ma wartość 220 Ohm a obok przycisku 10 K Ohm. Gdy zbudowaliście układ możemy przejść do programu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Określamy zmienne, nazywamy je oraz przypisujemy piny int przycisk = 2; int led = 13; void setup() { // Określamy funkcje pinu INPUT - pin wejścia OUTPUT - pin wyjścia pinMode(przycisk,INPUT); pinMode(led,OUTPUT); } void loop() { /* If - jeśli na pinie oznaczonym jako przycisk (2) pojawi się stan wyskoki wtedy na pinie oznaczonym jako led(13) także pojawia się stan wysoki else - jeśli nie spełnia się żądanie ( stan wysoki na pinie 2) wtedy na pinie led(3) ma być stan niski */ if(digitalRead(przycisk) == HIGH) digitalWrite(led,HIGH); else digitalWrite(13,LOW); } |
Szkic możemy przerzucić do Arduino IDE, wgrać na płytkę i cieszyć się działającym układem, bazując na tym samym schemacie możemy sprawić by przy jednym wciśnięciu przycisku dioda się zapaliła a przy drugim zgasła, wystarczy tylko trochę zmienić kod by wyglądał tak :
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 |
// określamy zmiennie, nazywamy je i przyznajemy poszczególne piny int przycisk = 2; int led = 13; void setup() { /* określamy funkcje pinów czy są to piny wejścia czy wyjścia INPUT - wejścia OUTPUT - wyjścia */ pinMode(przycisk,INPUT); pinMode(led,OUTPUT); } // dodajemy zmienną logiczną na przycisk boolean stan = 2; void loop() { { /* If - jeśli na pinie oznaczonym jako przycisk(2) pojawi się stan wysoki wtedy stan na pinie oznaczonym jako led zmienia się na przeciwny */ if(digitalRead(przycisk) == HIGH) // przerwa 20 milisekund delay(20); // każda zmana stanu zmienia go na przeciwny stan=!stan; digitalWrite(led,stan); /* Pętla while trwa (stan pinu led nie zmienia się) dopóki żądanie nie zostanie spełnione w tym wypadku pin oznaczony jako przycisk musi przejść na stan wyskoki */ while(digitalRead(przycisk) == HIGH); delay(20); } } |
Gdy mamy już opanowane świecenie, zapalanie i zgaszanie jednokolorowej diody led możemy zabrać się za sterowanie diodą RGB. Tym razem nie użyjemy diody dołączonej do Starter Kitu lecz diody RGB ze wspólną katodą. Jak zwykle zaczniemy od schematu :
Diodę musimy włożyć w ten sposób by najkrótsza nóżka była w miejscu bez rezystora, rezystory przy diodzie mają wartość 220 Ohm a przy przyciskach 10 K Ohm. Tym razem postanowiłem nie dodawać komentarzy do programu gdyż ten program jest bardzo podobny do pierwszego tylko że dodaliśmy dwa przyciski i dwa wyjścia, jeśli mamy złożony układ możemy brać się za 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 |
void setup() { pinMode(2,INPUT); pinMode(3,INPUT); pinMode(4,INPUT); pinMode(8,OUTPUT); pinMode(9,OUTPUT); pinMode(10,OUTPUT); } void loop() { { if(digitalRead(2) == HIGH) digitalWrite(8,HIGH); else digitalWrite(8,LOW); } { if(digitalRead(3) == HIGH) digitalWrite(9,HIGH); else digitalWrite(9,LOW) } { if(digitalRead(4) == HIGH) digitalWrite(10,HIGH); else digitalWrite(10,LOW) } } |
Program działa w ten sposób ,że po wciśnięciu jednego z przycisków zapali się jeden segment diody RGB. A gdy puścimy przycisk dioda nie będzie się paliła. W zestawie startowym mamy także silnik DC oraz sterownik silników zwany mostkiem H sterownik ten może sterować 2 silnikami DC, steruje prędkością oraz kierunkiem kręcenia się silników, w zestawie mamy także tranzystory NPN i zdecydowałem że lepiej będzie nauczyć się z nich korzystać gdyż na pewno będą bardziej przydatne w życiu elektronika niż mostek h ( przynajmniej jeżeli chodzi o naukę i proste projekty). A więc do dzieła zacznijmy klasycznie od schematu :
Tranzystory używamy często gdy pobór prądu jest większy niż może uciągnąć arduino. Uwaga przez ten tranzystor sterujemy GND a nie 5 V rysunek pod spodem wyjaśni do czego służą poszczególne nóżki tranzystora. Rezystory na schemacie to : 220 Ohm przy tranzystorze i 10 K Ohm przy przycisku.
1 to emiter do niego podłączamy GND 2 to Baza do pinu Arduino podłączamy przez rezystor 220 Ohm 3 to kolektor który jest wyjściem Gnd.
Teraz przejdźmy do programu który jest bardzo podobny do poprzednich
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//Tutaj dodajemy zmienne int tranz = 2; int przycisk = 3; // W void setup określamy zadanie poszczególnych pinów void setup() { pinMode(tranz,OUTPUT); pinMode(przycisk,INPUT); } void loop() { /* Jeśli na pinie oznaczonym jako przycisk (3) pojawi się stan wysoki to na pinie tranz(2) pojawi się stan wyskoki */ if(digitalRead(przycisk) == HIGH) digitalWrite(tranz,HIGH); else digitalWrite(tranz,LOW); } |
Aby urozmaicić trochę program wykorzystamy PWM wtedy szkic wyglądał by tak :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void setup() { pinMode(2,INPUT); } void loop() { if(digitalRead(2) == HIGH) // Analog Write czyli PWM - sygnał analogowy analogWrite(3,x); /* x może być dowolną wartością od 0 do 255, w zależności od wartości nasz silniczek będzie się kręcił z różna prędkościa */ x=200; else(analogWrite(3,0); } |
Oprócz dodanej funkcji PWM w programie zostały zmienione piny by można było sterować PWM gdyż nie wszystkie piny obsługują tą funkcje. Gdy zadowoleni z kręcącego się silniczka oraz umiejętnością sterowania jego prędkością stwierdzimy iż chcemy zmierzyć temperaturę w naszym pokoju a następnie wyświetlić te dane na wyświetlaczu. Więc zajmiemy się najpierw obsługą wyświetlacza, samego czujnika temperatury a później złożymy to w jedną całość. Tradycyjnie zaczniemy od schematu.
Schemat jest bardzo czytelny więc raczej nie ma potrzeby tłumaczenia, ten czarny guziczek to potencjometr czarne kabelki to GND a czerwone to Vcc. Teraz przejdziemy do programu który umożliwi nam sterowanie wyświetlaczem, tak na wszelki wypadek potencjometr służy do ustawienia kontrastu wyświetlanego tekstu. Program który wgramy na wyświetlacz ma za zadanie wyświetlić napis Hello, world oraz liczyć czas od ostatniego resetu Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//Inicjalizacja połączeń LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // Wybór rodzaju wyświetlacza - 16x2 lcd.begin(16, 2); //Wyświetlanie hello, world lcd.print("hello, world!"); } void loop(){ //Przejście kursora do pierwszej kolumny drugiego wiersza lcd.setCursor(0, 1);? //Odczyt oraz wyświetlenie czasu jaki upłynął od ostatniego resetu w sekundach lcd.print(millis()/1000); } |
W komentarzach opisane jest wszystko co potrzebujemy wiedzieć do najprostszego używania wyświetlacza w razie czego możemy zajrzeć tu lub tu. Gdy potrafimy podłączyć wyświetlacz możemy zabrać się za obsługę czujnika temperatury który pozwoli zmierzyć nam temperaturę, z Arduino komunikuje się przez pin analogowy 1. Czujnik jest bardzo prosty w obsłudze i nie zabiera nam cennych pinów cyfrowych. Zabierzmy do składania układu :
Połączenie jest wręcz banalne, pierwszą nóżkę od lewej podłączmy do Vcc, drugą do A1 a trzecią do Gnd.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
float temp; // Definiujemy zmienną temperatura na pinie A1 int temperatura = 1; // W void setup tylko włączamy Serial Monitor void setup() { Serial.begin(9600); } void loop() { // temp = odczyt z pinu oznaczonego jako temperatura (A1) temp = analogRead(temperatura); // Aby prawidłowo odczytać temperaturę musimy pomnożyć przez liczbę poniżej temp = temp * 0.48828125; // Wyświetlanie napisu w serial monitorze Serial.print("Temperatura = "); // wyświelanie temperatury w serial monitorze Serial.print(temp); Serial.print("*C"); Serial.println(); // przerwa jednosekundowa 1000 milisekund = 1 sekunda delay(1000); } |
Po wykonaniu tego przykładu nie dość że będziemy umieli korzystać z czujnika LM35 to jeszcze będziemy umieli korzystać z wejść analogowych i posługiwać się serial monitorem. Gdy umiemy podłączać już wyświetlacz i czujnik osobno to możemy połączyć czujnik i wyświetlacz w jedno i sprawić by temperatura pokazywała się na wyświetlaczu. Tradycyjnie zaczniemy od schematu który pokarze jak połączyć całość na płytce stykowej :
Schemat jest po prostu połączeniem dwóch poprzednich więc wystarczy spojrzeć na podpowiedzi do poprzednich i złożenie całości będzie proste. Zmieni się trochę program :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); float temp; int tempPin = 0; void setup() { lcd.begin(16, 2); lcd.print("Temperatura"); lcd.setCursor(0,1); lcd.print(temp); } void loop() { temp = analogRead(tempPin); temp = temp * 0.48828125; } |
Program ten jest połączeniem kilku poprzednich więc poszczególnych części kodu nie trzeba tłumaczyć gdyż po przeczytaniu i nabyciu wiedzy z poprzednich programów jesteśmy w stanie bez problemu odczytać jak działa program. Gdy złożymy całość i zaprogramujemy Arduino naszym oczom ukaże się elegancki termometr z którego możemy być dumni i gdy przyjdą znajomi pochwalić się, że zrobiliśmy to sami. Mam nadzieje że post pomoże wielu początkującym którzy szukają fajnych projektów na początek i nie chcą zaczynać od blinka.
Mam taką uwagę do autorów – czy można prosić o dodatkowe schematy połączeń w wersji “klasycznej”. Jak po raz n-ty widzę schematy w fritzingu gdzie widzę 15 kolorowych przewodów krzyżujących się pod różnymi kątami plus dziwaczne przejściówki to zaprawdę powiadam – nie ogarniam tego.
Starałem się jak najlepiej pokazać schematy… Mogą być w Eaglu ?
Oczywiście. Mi osobiście bardziej są czytelne schematy “elektroniczne” albo wręcz blokowe niż te kolorowe :-)
Do jakiego przykładu konkretnie zrobić schemat ?
Wątkowanie nie pozwala odpowiedzieć Tobie, więc odpowiem sobie :-)
Barzdiej skomplikowane schematy można zdobić w Eagle, lepiej się je czyta.
Opcja druga: można próbować zwiększyć czytelność fritzinga, podłączenie LCD wymaga o wiele czytelniej np na takim schemacie: http://arduino.cc/en/uploads/Tutorial/LCD_bb.png
Świetny post pokazuje to co ma pokazywać na początek zabawy z arduino, bez zawracania głowy blinkami i innymi podstawami które nic nie wnoszą… Po prostu świetne 5 gwiazdek leci :-)
Dzięki za gwiazdki i ciepłe słowa, ciesze się że się podoba ! :-)
Fajny przydatny post 5 gwiazdek leci
Dzięki :-)
Pierwszy schemat nie zadziała, bo nie ma masy podłączonej :)
Zaraz poprawię dzięki za info :-)
Teraz zadziała
Nie znam zbytnio składni tego uproszczonego C występującego w Arduino, ale jako programista mam jedną dużą uwagę do twojego kodu. Stosuj wcięcia, one na prawdę ułatwiają czytanie kodu. Plus uwaga do warunków: jeśli po if dajesz kod w następnej linijce to po else także tak rób.
Dzięki za uwagę, następnym razem będę się stosował :-)
Co zrobić, gdy termometr pokazuję o złą temperaturę?
O ile stopni jest za dużo czy za mało ?
ok. 10 za dużo i cały czas skacze w dół i w górę
Spróbuj usunąć linijkę
temp = temp * 0,48…..
Może być też tak, że masz jakiś wadliwy egzemplarz, Ja natrafiłem też na jeden taki, nie szło go ustawić, kupiłem następny.
drugi program nie działa
Bardzo fajny poradnik pokazujący, jak obsłużyć podstawowe kilka podstawowych komponentów przez Arduino. Jeśli mógłbym coś zasugerować, to warto dodać diodę zaporowo podłączoną równolegle do silnika. Ochroni ona tranzystor przed prądami błądzącymi. Życzę dalszych udanych poradników :)
Serdecznie witam
Właśnie zacząłem moją przygodę z Arduino i wpadłem na tą stronkę. Czy jest możliwym uzyskanie przykładu Współpracy Arduino UNO + wyświetlacz + DHT11 zamiast LM35? Będę bardzo wdzięczny. Z góry dziękuję.
Pingback: Początki z Arduino ciąg dalszy - idziemy do przodu ! » Majsterkowo.pl
Witam, chciałbym poprosić o poprawne komendy do projektu numer 2 ponieważ wpisuję w arduino, wgrywam i wyskakuje błąd kopiowania :
sketch_apr07a.ino: In function ‘void loop()’:
sketch_apr07a.ino:13:1: error: ‘else’ without a previous ‘if’
sketch_apr07a.ino:18:1: error: ‘else’ without a previous ‘if’
sketch_apr07a.ino:23:1: error: ‘else’ without a previous ‘if’
Błąd kompilacji.
Proszę o szybką odpowiedź :(
W przykładzie brakuje apostrofów (zamknięcia linii) w linijkach nr 19 i 24.
Spróbuj dopisać i napisz czy zadziałało?
Po dodaniu średników kompiluje się, ale układ i tak nie działa
nie trzeba tu zasilania podłączyc ? ;)
Tak. Też zwrociłem na to uwagę, ale dołożenie zasilania do listwy powoduje zapalenie diody na zielpno po wciśnięciu środkowego przycisku. Czyli nadal jest tutaj coś nie tak.
Nie miałem czasu dłużej posiedzieć, więc może wreszcie autor się zainteresuje tematem?
W drugim projekcie trzeba też zmienić biegunowość napięcia (5 V z masą). Czyli w całości trzeba poprawić:
– dwa razy średnik (w lini 19 i 24)
– dołożyć połączenie 5V tam gdzie jest anoda diody
– podłączyć GND na inną linię niż masa
W opisie autor pomylił się ponieważ anoda to “najdłuższa” nóżka w diodzie.
Teraz wszystko buja się, aż miło patrzeć!
Witam,
termometr wskazuje poprawną temperaturę w konsoli ale nie wyświetla jej na LCD (wyświetla jedynie 0.00). Co jest nie tak? Kod poniżej:
#include
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
float temp;
int temperatura = 1;
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
lcd.print(“Temperatura “);
lcd.setCursor(0,1);
lcd.print(temp);
}
void loop()
{
temp = analogRead(temperatura);
temp = temp * 0.48828125;
Serial.print(“Temperatura = “);
Serial.print(temp);
Serial.print(“*C”);
Serial.println();
delay(1000);
}
Jaki ja głupiutki….
Oto poprawiony kod, gdyż ten w tekście jest błędny – temperatura wyświetlana na LCD musi być przecież w loopie a nie setupie.
Proszę:
#include
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
float temp;
int temperatura = 1;
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
lcd.print(“Temperatura “);
}
void loop()
{
temp = analogRead(temperatura);
temp = temp * 0.48828125;
Serial.print(“Temperatura = “);
Serial.print(temp);
Serial.print(“*C”);
Serial.println();
lcd.setCursor(0,1);
lcd.print(temp);
lcd.print(“*C”);
delay(1000);
}
Doszedłem szybciutko.
Naturalnie temperatura powinna być w loop a nie setup – jak inaczej ma się odświeżać?
Oto poprawiony kod:
#include
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
float temp;
int temperatura = 1;
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
lcd.print(“Temperatura “);
}
void loop()
{
temp = analogRead(temperatura);
temp = temp * 0.48828125;
Serial.print(“Temperatura = “);
Serial.print(temp);
Serial.print(“*C”);
Serial.println();
lcd.setCursor(0,1);
lcd.print(temp);
lcd.print(“*C”);
delay(1000);
}
Witam. Od jakiegoś czasu próbuje podłączyć dwa czujniki dht11 do arduino i wyświetlić wyniki na lcd. Z jednym nie mam problemu, ale z dwoma nie mogę sobie poradzić. Macie jakiś pomysł?