Arduino Nano, DHT11 i I2C 2004A LCD
Jedna neuobičajena kombinacija modula ovaj put od mene. Možda bi naslov
pre mogao da bude nešto u stilu Stanlia i Olia. Kada pogledate dimenzije
upotrebljenih komponenti, sve će vam biti jasno.
Arduino Nano,
sa svojim minijaturnim dimenzijama 18x45mm i težinom od samo 7 grama
deluje kao patuljak. Na tako malu ploču stalo je sve ono što je
neophodno. Tu su u dva reda po petnaest pinova sa izlazima na 5V i 3,3V,
sa analognim i digitalnim pinovima, Vin, GND, TX, RX... Svi su tu i u
razmaku od 0,1", što će reći da su pogodni za prototipsku ploču. Oznake
pinova su veoma sitno napisane i oni sa slabijim vidom (kao ja) će
morati pred sobom da imaju pinout šemu. Moj primerak je Kineska kopija
tako da je sa donje strane pored naponskog kontrolera AMS117, CH340G čip
zadužen za komunikaciju sa računarom preko mini-B USB porta. Sa gornje
strane su šest ICSP pinova bez oznaka, zatim četiri LED (TX, RX, ON i
L). Dalje je kristal na standardnih 16MHz, ATMega328P i USB port.
Debeljko
u ovom slučaju je LCD 2004A sa već zalemljenim I2C interfejsom. Ekran
kao i u slučaju 1602 ispisuje karaktere ali po 20 njih u četiri reda.
Ekran sa I2C interfejsom se malo drugačije povezuje od prethodno
opisanog 1602 sa dodavanjem druge biblioteke ali uz samo četiri žice za
povezivanje. Reklo bi se odličan izbor za razne projekte. Ali... uvek
ima ali. Arduinu je potrebna adresa ekrana da bi preko I2C mogao da
uspostavi vezu sa njim. U mom slučaju mi je trgovac istu dostavio (0x27)
ali prilikom povezivanja sam imao velikih problema jer, pogađate,
adresa nema veze sa ekranom koji sam dobio. Trgovac je naprasno
zaboravio engleski jezik a ja kineski nikad nisam ni znao, tako da sam
bio osuđen na preoravanje interneta. Čip zadužen sa komunikaciju I2C
modula sa ekranom je u mom slučaju PCF8574AT i našao sam da je njegova
adresa 0x3F i njenim unosom svi problemi su nestali. Pored pomenutog
čipa i konektora, tu su još potenciometar za pozadinsko osvetljenje,
džamper za isključivanje istog i power LED. Isti I2C interfejs se može
naći i na drugim ekranima (1602, 1601...) ovog tipa, kao stand alone
varijanta za nadogradnju na one koji ga nemaju.
Treći
sastojak ovog recepta je DHT11 senzor. Dakle, senzor a ne modul, što će
reći da sam prilikom povezivanja dodao jedan otpornik od 10 kilooma.
Neko će reći zašto DHT11 a ne DHT22? Jeste da je DHT11 neprecizan i da
DHT22 nije nešto specijalno skuplji od njega ali se DHT11 često dobija u
starter kitovima, ima ga svuda u online šopovima i generalno je
prisutan tako da smatram da treba da se zna kako da se upotrebi. AOSONG
je potpisao i ovaj senzor a na poleđini vidimo da radi na naponima od
3,3V do 5V. Takođe vidimo da relativnu vlažnost vazduha meru u rasponu
od 20% do 95% a temperaturu od 0-50 stepeni celzijusa. Za relativnu
vlažnost vazduha preciznost je ±5% a za temperaturu ±2°C. Očitavanja su
na ceo broj a semplovanje je 1Hz. Sa donje strane ima četiri pina: VCC,
data, N/C i gnd, gde se prvi povezuje na plus, data na digitalni pin na
koji će slati podatke a poslednji na GND. Prilikom povezivanja sam
upotrebio otpornik na 10 kilooma i povezao data pin sa njime na 5V. U
specifikaciji stoji da treba 5K koji je dovoljan za razdaljinu do 20m
ali njega nisam imao.
Nano,
LCD i DHT11 povezujemo prema šemi. GND i VCC pinove sa LCD modula
povezujemo na GND i 5V Arduina. SDA pin u ovom slučaju crvenom žicom
spajamo sa A4 na Nanou, a SCL braon žicom na pin A5. Dakle na analogne
pinove. DHT11 se povezuje prema oznakama, VCC na 5V, data na pin D4 a
GND na GND. N/C (not conected) pin se ne koristi. Otpornikom od 10
kilooma povezujemo VCC i DATA pinove ispred samog senzora.
Na redu je skeč:
----------------------------
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHTPin 4
DHT dht;
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7, 3, POSITIVE);
void setup()
{
// activate LCD module
lcd.begin (20, 4); // for 20 x 4 LCD module
lcd.backlight();
dht.setup(DHTPin);
}
void loop()
{
float temp = dht.getTemperature();
float vlaga = dht.getHumidity();
lcd.setCursor(0, 0);
lcd.print ("U vasem gradu je");
lcd.setCursor(0, 1);
lcd.print ("trenutno izmereno");
lcd.setCursor(0, 2);
lcd.print (temp);
lcd.print(" C");
lcd.setCursor(0, 3);
lcd.print (vlaga);
lcd.print (" %");
}
-------------------------------
Skeč
je prilično poznat od ranije i u suštini je blago modifikovana verzija
onog koji je upotrebljen za DHT22. Razlike su u dodatim bibliotekama
vezanim za I2c interfejs. U mom slučaju, a i po onom što se može videti
na mreži, najbolje se pokazala NewLiquidCrystal biblioteka. Nakon toga
inicijalizujemo digitalni pin 4 na koji ćemo slati podatke sa DHT11 ali
može biti i neki drugi. Nakon toga povezujemo LCD sa Arduinom, tako što
mu dajemo I2C adresu uz još par parametara. Kao što sam već rekao u mom
slučaju je 0x3F zbog PCF8574AT čipa ali to se razlikuje od modela do
modela. Postoje I2C skeneri gde se skeč prebaci na Arduino i na serijal
monitoru izađe koja je adresa u pitanju. U mom slučaju nijedan skeč mi
nije prikazivao ništa i već sam počeo da mislim da sam dobio neispravan
ekran. U void setup funkciji pokrećemo ekran, pozadinsko osvetljenje i
DHT pin. U void loop funkciji pravimo dve promenljive i ispisujemo tekst
u sva četiri reda ekrana.
Verifikujemo
skeč i prebacujemo na Arduino Nano. Prethodno, pod tools biramo Nano
ploču i port. Ako smo sve uradili kako treba, na ekranu bi trebalo da se
prikažu očitavanja. Ukoliko ekran prikaže samo kockice u dva neparna
reda, u pitanju je pogrešna I2C adresa. Izguglajte malo oznaku čipa
ispod ili pustite neki od I2C skenera i rešite problem.
Sad tek vidim sam u Fritzing šemi pogrešno stavio VCC na GND a GND na 5V. GND ide na GND a VCC na 5V. Greška je u šemi, izvinite.