Vous êtes sur la page 1sur 4

PROJEKT SOFT

Termometr
zinterfejsem
Bluetooth
Dostpno moduw Bluetooth pozwala na budowanie urzdze,
dla ktrych interfejsem uytkownika moe by smartfon lub tablet.
Publikujemy przykad takiego uytecznego projektu termometru
wywietlajcego wynik pomiaru na ekranie urzdzenia pracujcego
pod kontrol Androida. Mona je wykona dosownie w p godziny
korzystajc z gotowych, dostpnych w handlu podzespow.
W budowie urzdzenia zastosowano modu Bluetooth typu BT222. Moe on komunikowa si z systemem nadrzdnym
za porednictwem rnych interfejsw, ale

46

ELEKTRONIKA PRAKTYCZNA 11/2015

ze wzgldu na atwo obsugi oraz implementacji oprogramowania dotego celu jest


polecany UART. Dopoprawnej komunikacji
za porednictwem UART nie jest wymagana

dodatkowe materiay na ftp:


ftp://ep.com.pl
user: 87542, pass: o8v5gec9
Potrzebne komponenty:
Dowolna pytka z moduem BTM222
np. AVT1635.
Pytka Arduino Uno lub podobna.
Czujnik temperatury typu LM35.

obsuga sygnaw RTS i CTS, ale wtedy


naley wprowadzi niewielkie opnienia
czasowe pomidzy bajtami danych wysyanymi domoduu.
Naley bardzo ostronie zmienia parametry komunikacji interfejsu UART, poniewa niewaciwe ustawienie moe zablokowa dostp do moduu, a nie ma sposobu
na przywrcenie ustawie bez poprawnej
komunikacji z moduem. Uwaga! Modu
wymaga zasilania napiciem 3,3V inie toleruje napicia 5V nawejciach, wic przy
wsppracy z typowym Arduino musi by
wyposaony wtranslator poziomu napicia.

Termometr zinterfejsem Bluetooth


Arduino iBTM222
Pytka Arduino ma sprztowy interfejs
szeregowy UART, ale jest on poczony
z konwerterem USB i dlatego bardzo przydaje si wczasie uruchamiania programw.
Ztego powodu dokomunikacji zmoduem
Bluetooth zostanie wykorzystany UART wykonany programowo.
Podzespoy naley poczy, jak nafotografii 1 lub wedug schematu zrysunku 2.
Po doczeniu interfejsu USB dioda CONN
napytce AVT1635 powinna miga. Ju teraz modu Bluetooth bdzie widziany przez
inne urzdzenia jako Serial Adapter (rysunek 3) imona go sparowa np. zesmartfonem podajc wtrakcie tej operacji PIN 1234.

Program testowy

Fotografia 1. Poczenie moduu Bluetooth zpytk Arduino


Listing 1. Konfiguracja
#include <SoftwareSerial.h>
//dodaje niezbdn bibliotek
//dodatkowy softwareowy port szeregowy dla komunikacji zBluetooth
SoftwareSerial blueSerial(8, 9);
String baseBuffer = ;
//bufor danych zUSB
String blueBuffer = ;
//bufor danych zBluetooth
int baseComplete = 0;
//znacznik odebranych danych zUSB
int blueComplete = 0;
//znacznik odebranych danych zBluetooth
//-------------------------------------------------void setup() {
//uruchamia sprzetowy port szeregowy dostpny zUSB
Serial.begin(19200);
//uruchamia dodatkowy port szeregowy dla Bluetooth
blueSerial.begin(19200);
}
Listing 2. Ptla gwna oraz odczyt zinterfejsw szeregowych
void loop() {
//odczytujemy dane zportw szeregowych
baseReceive();
blueReceive();
if (baseComplete >= 1) {
//jeli odebrano zUSB
blueSend(baseBuffer);
//przeka doBluetooth
baseBuffer = ;
//wyczy bufor
baseComplete = 0;
//zeruj znacznik
}
//Modu BTM222 rozpoczyna kady komunikat znakiem koca linii
//wic czekamy az bda 2 znaki koca
if (blueComplete >= 2) {
//jeli odebrano zBluetooth
Serial.println(blueBuffer);
//podgld odebranych danych
blueBuffer = ;
//czyci bufor
blueComplete = 0;
//zeruje znacznik odebranych danych
}
delay(1);
}
//odbieranie danych zUSB
void baseReceive()
{
while (Serial.available()) {
//jeli co odebrane
char inData = (char)Serial.read(); //odbierz dane
baseBuffer += inData;
//iumie wbuforze
if (inData == \n) {
//jeli koniec linii
baseComplete++;
//ustaw znacznik
}
}
}
//odbieranie danych zBluetooth
void blueReceive()
{
while (blueSerial.available()) {
//jeli co odebrane
char inData = (char)blueSerial.read(); //odbierz dane
blueBuffer += inData;
//iumie wbuforze
if (inData == \n) {
//jeli koniec linii
blueComplete++;
//ustaw znacznik
}
}
}

Pierwszy program posuy do sprawdzenia poprawnoci pocze i komunikacji


z pytk AVT1635. Na pocztku doczana
jest biblioteka SoftwareSerial.h, deklarowane s zmienne, dwa bufory i dwa znaczniki odebranych komunikatw. Ostatecznie
w sekcji setup() program uruchamia dwa
interfejsy szeregowe, jeden programowy
dokomunikacji zmoduem Bluetooth, drugi
sprztowy doledzenia przebiegu programu
ikomunikatw zidomoduu (listing 1).
Wptli gwnej program sprawdza czy
zostay odebrane jakie dane iumieszcza je
w buforach listing 2, funkcje baseReceive() i blueReceive(). W przypadku komunikacji po USB pierwsze wystpienie znaku
nowej linii \n jest traktowane jako koniec
komunikatu, co naturalnie pokrywa si
z wciniciem klawisza ENTER na klawiaturze, natomiast modu BTM222 kady komunikat poprzedza ikoczy znakiem nowej
linii, dlatego odebranie komunikatu nastpuje podrugim znaku nowej linii (blueComplete >=2).
Wan funkcj jest blueSend(), ktra odpowiada za wysyanie komunikatw
do moduu (listing 3). Po wysaniu kadego znaku wstawiona jest przerwa delay(50).
Dodatkowo, znak nowej linii \n jest zamieniany naznak \r, poniewa modu BTM222
wymaga, aby kada komenda zakoczona
bya najpierw wanie tym znakiem.
Po zaprogramowaniu pytki Arduino
naley uruchomi dostpny w pasku narzdzi monitor szeregowy, ustawi prdko komunikacji na19200, aobok ustawi
nowa linia, jak narysunku 4. Teraz wpasku wylij naley wpisa AT i przycisn
Enter, amodu powinien odpowiedzie OK.
Tak mona wysa kad zkomend moduu
BTM222 np. ATB?, ktra powoduje odesanie sprztowego identyfikatora ukadu.

Wykrywanie poczenia
Na kady odebrany komunikat modu
BTM222 odpowiada OK lub ERROR.
Ponadto, moe wysa jeden zkomunikatw
ELEKTRONIKA PRAKTYCZNA 11/2015

47

PROJEKT SOFT
Listing 3. Funkcja wysyania do BTM222
//Wysya dane do Bluetooth
void blueSend (String data) {
int i;
int data_length = data.length();
//ilo danych
//Serial.println(data);
//podgld wysyanych
//komunikacja z BTM222 bez kontroli przepywu,
//tylko sygnay RXD i TXD, bez RTS i CTS,
//wymaga wstawienia przerwy ok 50ms po kadym znaku
for (i = 0; i < data_length; i++)
{
//komendy dla BTM222 musz by zakoczone znakiem CR
//dlatego zamieniam \n na \r
if (data.charAt(i) == \n) data.setCharAt(i, \r);

blueSerial.print(data.charAt(i)); //wysya jeden znak


delay(50);
//przerwa 50ms

Listing 4. Zmienna statusu poczenia oraz konfiguracja sterowania diod LED


int blueStatus = 0;
//status poczenia Bluetooth, aktywne to 1
int ledPin = 13;
//dioda LED na pycie Arduino

CONNECT lub DISCONNECT, ktre sygnalizuj nawizanie i zakoczenie poczenia. Teraz program zostanie rozbudowany
ofunkcje wykrywajce tezdarzenia. Napocztku jednak zostanie dodana nowa zmienna, ktra bdzie przechowywaa informacje
ostanie poczenia oraz bdzie decydowaa
o zawieceniu diody LED znajdujcej si
na pytce Arduino (listing 4). Ptl gwn
zmodyfikujemy, tak jak pokazano nalistingu 5.
Po skompilowaniu zaprogramowaniu
pytki naley uruchomi monitor szeregowy

void setup() {
Serial.begin(19200);
blueSerial.begin(19200);
//konguruje sterowanie diod LED
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
Listing 5. Wykrywanie komunikatw o poczeniu i sterowanie diod LED
if (blueComplete >= 2) {
//jeli odebrano z Bluetooth
Serial.println(blueBuffer);
//podgld odebranych danych
//odebranie treci CONNECT oznacza poczenie np ze smartfonem
if (blueBuffer.substring(2, 9) == CONNECT) {
Serial.println(Polaczony!!!);
//wysya info do USB
blueStatus = 1;
//ustawia aktywny status poczenia
}
//odebranie treci DISCONNECT oznacza zakoczenie poczenia
if (blueBuffer.substring(2, 12) == DISCONNECT) {
Serial.println(zakonczono...); //wysya info do USB
blueStatus = 0;
//zeruje status poczenia
}
blueBuffer = ;
//czyci bufor
blueComplete = 0;
//zeruje znacznik odebranych danych
}
if (blueStatus == 1)
digitalWrite(ledPin, HIGH);
else
digitalWrite(ledPin, LOW);
delay(1);

//aktywne poczenie LED wieci


//brak poczenia LED nie wieci

Rysunek 3. Monitor szeregowy ikomendy


testowe

Rysunek 4. Sparowany modu BTM222

Rysunek 2. Schemat ideowy pocze moduu Bluetooth zpytk Arduino

48

ELEKTRONIKA PRAKTYCZNA 11/2015

Rysunek 5. Monitor szeregowy ikomunikaty opoczeniu

Termometr zinterfejsem Bluetooth


Listing 6. Konfigurowanie czujnika temperatury
//czujnik temperatury to LM35 doczony do wyprowadze A1, A0, A2
int temperature_gnd = A0;
//masa zasilania dla LM35
int temperature_pin = A1;
//wyjcie z LM35
int temperature_vdd = A2;
//plus zasilania dla LM35
int temperature_val;
//odczytana warto temperatury
String temperature_str;
//temperatura w postaci ramki 12,3C
int temperature_period = 0;
//odliczanie czstoci pomiarw
void setup() {
//uruchamia sprztowy port szeregowy dostpny z USB
Serial.begin(19200);
//uruchamia dodatkowy port szeregowy dla Bluetooth
blueSerial.begin(19200);
//konguruje wyprowadzenia A0 i A1 tak by zasilay czujnik temperatury
pinMode(temperature_gnd, OUTPUT);
pinMode(temperature_vdd, OUTPUT);
digitalWrite(temperature_gnd, LOW);
digitalWrite(temperature_vdd, HIGH);
//odczyt temperatury bdzie wykonywany poprzez przetwornik ADC,
//dla wikszej dokadnoci wykorzystam napicie referencyjne 1,1V
analogReference(INTERNAL);
//konguruje sterowanie diod led
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}

Rysunek 6. Okno wyboru urzdzenia

Rysunek 7. Okno wywietlania temperatury

Listing 7. Pomiar temperatury


temperature_period++;
//odicza do nastepnego pomiaru
if (temperature_period >= 2000) {
//jeli upyno ok 2s
temperature_period = 0;
//zeruje licznik
//odczytuje temperatur z czujnika LM35 przy pomocy przetworika ADC
temperature_val = analogRead(temperature_pin);
//LM35 daje na wyjciu napicie proporcjonalne do temperatury 10mV/*C
//sklauje wynik i dopasowuje do napiecia referencyjnego,
//maksymalna temp. 110*C
temperature_val = map(temperature_val, 0, 1023, 0, 1100);
//oddziela jednoci od dziesitnych i tworzy ramk postaci 12,3C
temperature_str = String(temperature_val / 10) + ,;
temperature_str += String(temperature_val % 10) + C\r;
Serial.println(temperature_str);
//wysya wynik do USB
//jeli aktywne poaczenie to wysya do Bluetooth
if (blueStatus == 1) blueSend(temperature_str);
}

ipoczy si zmoduem Bluetooth za pomoc doczonej aplikacji. Temperatura


jeszcze nie jest wskazywana, ale dioda LED
reaguje prawidowo zawieca si przy nawizaniu poczenia iganie pozamkniciu
aplikacji a urzdzenie wysya komunikaty
podobne dotych zrysunku 5.

temperatury oraz jej zapis w postaci ramki


xx,xC. Informacja ta bdzie wysyana
doUSB oraz, jeli poczenie bdzie aktywne (blueStatus == 1), toramka bdzie wysyana take domoduu Bluetooth iwefekcie warto temperatury bdzie wywietlana
woknie aplikacji (listing 7).

Pomiar temperatury

Aplikacja

Do pomiaru temperatury zastosowano


czujnik LM35, ktry ma wyjcie analogowe. Napicie na wyjciu jest proporcjonalne do temperatury i wynosi 10 mV/C.
Takie rozwizanie jest atwe w realizacji
idaje zakres pomiarowy odok. 2 do110C.
Najpierw zostan dodane odpowiednie
zmienne iskonfigurowane wyprowadzenia,
poniewa czujnik bdzie zasilany zwyprowadze Arduino. Sposb skonfigurowania czujnika temperatury zaprezentowano
nalistingu 6.
Teraz w ptli gwnej zostanie dodany fragment, ktry odpowiada za pomiar

Aplikacj wykonano za pomoc Android


Studio na podstawie projektu ArduinoAndroid-Sensors opisanego na stronie
https://github.com/HarryGoodwin/ArduinoAndroid-Sensors. Po uruchomieniu aplikacji jest wywietlane okno z wyborem
urzdzenia Bluetooth. Naley wybra Serial
Adapter, aaplikacja poczy si zmoduem
izacznie wywietla temperatur (rysunek
6 i7).
Pene rda wszystkich programw
i oraz aplikacji dostpne s w materiaach
dodatkowych doartykuu.

KS

ELEKTRONIKA PRAKTYCZNA 11/2015

49

Vous aimerez peut-être aussi

  • AVT1919
    AVT1919
    Document2 pages
    AVT1919
    netzeh
    100% (2)
  • AVT5311
    AVT5311
    Document12 pages
    AVT5311
    netzeh
    100% (1)
  • Podwójny Woltomierz I Amperomierz
    Podwójny Woltomierz I Amperomierz
    Document4 pages
    Podwójny Woltomierz I Amperomierz
    netzeh
    100% (1)
  • AVT1474
    AVT1474
    Document4 pages
    AVT1474
    netzeh
    100% (1)
  • AVT2550
    AVT2550
    Document21 pages
    AVT2550
    netzeh
    100% (1)
  • AVT5468
    AVT5468
    Document9 pages
    AVT5468
    netzeh
    100% (1)
  • AVT3500
    AVT3500
    Document5 pages
    AVT3500
    netzeh
    100% (1)
  • AVT1770
    AVT1770
    Document2 pages
    AVT1770
    netzeh
    100% (1)
  • AVT1462
    AVT1462
    Document4 pages
    AVT1462
    netzeh
    100% (1)
  • AVT5162
    AVT5162
    Document3 pages
    AVT5162
    netzeh
    100% (1)
  • AVT1593
    AVT1593
    Document1 page
    AVT1593
    netzeh
    100% (1)
  • AVT1683
    AVT1683
    Document2 pages
    AVT1683
    netzeh
    100% (1)
  • AVT1709
    AVT1709
    Document1 page
    AVT1709
    netzeh
    100% (1)
  • AVT5402
    AVT5402
    Document4 pages
    AVT5402
    netzeh
    100% (1)
  • AVT5459
    AVT5459
    Document3 pages
    AVT5459
    netzeh
    100% (1)
  • AVT790
    AVT790
    Document2 pages
    AVT790
    netzeh
    100% (1)
  • AVT1661
    AVT1661
    Document4 pages
    AVT1661
    netzeh
    100% (1)
  • AVTMOD10
    AVTMOD10
    Document2 pages
    AVTMOD10
    netzeh
    100% (1)
  • AVT5468
    AVT5468
    Document9 pages
    AVT5468
    netzeh
    100% (1)
  • AVT1618
    AVT1618
    Document4 pages
    AVT1618
    netzeh
    100% (1)
  • AVT987
    AVT987
    Document4 pages
    AVT987
    netzeh
    100% (1)
  • AVT2861
    AVT2861
    Document6 pages
    AVT2861
    netzeh
    100% (1)
  • AVT3111
    AVT3111
    Document4 pages
    AVT3111
    netzeh
    100% (1)
  • AVT1695
    AVT1695
    Document1 page
    AVT1695
    netzeh
    100% (1)
  • AVT3103
    AVT3103
    Document5 pages
    AVT3103
    netzeh
    100% (1)
  • AVT1870
    AVT1870
    Document4 pages
    AVT1870
    netzeh
    100% (1)
  • AVT736
    AVT736
    Document3 pages
    AVT736
    netzeh
    100% (1)
  • AVT1868
    AVT1868
    Document4 pages
    AVT1868
    netzeh
    100% (1)
  • AVT1867
    AVT1867
    Document2 pages
    AVT1867
    netzeh
    100% (1)