DIY: Mini Meteorološka Stanica
Na ono čuveno pitanje, a šta taj Arduino može da uradi, odgovor bi mogao biti, svašta. Arduino, ili bolje reći mikorkontroleri mogu da urade baš svašta. Od paljenja jedne obične LE diode, do pokretanja robota veličine porodične kuće. Od merenja obične temperature, do upravljanja CNC mašinom. Dugo nisam postavljao DIY projekte ovde, jer mi je to nekako po prirodi stvari bilo rezervisano za Svet Kompjutera. Ovih dana sam pravio jednu manju meteorološku stanicu, pa je prava prilika da je na ovaj način predstavim.
Ideja je da se u malo prikladno kućište spakuje neophodna elektronika za merenje i očitavanje temperature. Izbor je pao na klon Pro Minija, ali usled brzopletosti pri naručivanju, naručio sam model koji je klon na kvadrat. Naleteo sam na Wavgatovu varijantu Pro Minija sa sopstvenim mikrokontrolerom AVGA328p. Prema rečima proizvođača u pitanju je potpuno kompatibilna ploča sa Pro Minijem. Ma kako da ne. Naručio sam nekoliko primeraka i kod svih sam imao iste probleme. Prvi problem se ogleda u tome da pozivanjem serijala u setup funkciji (Serial.begin()), dolazi do potpunog blokiranja ploče. Probao sam sa raznim vrednostima bauda ali ništa nije vredelo. Ovo je u startu dovelo do toga da se ceo projekat razvija na krštenoj ploči pa da se posle isti prebaci na ovaj Wavgat uz prekrštene fige da će isti proraditi. Drugi problem se ogleda u tome da ploča ima problematičnu naponsku sekciju. Ukoliko ploču napajamo preko RAW pina naponima od, recimo 9 volti, na VCC ćemo imati jedva 1,7V. Wavgat se mora napajti direktno preko VCC pina regulisanim naponom od 5 volti, jer govorimo o 5-voltnoj ploči. Inače, iako istih dimenzija sa istim pinoutom i ipak u velikoj meri kompatibilna sa Pro Minijem, za ovu ploču moramo dodati definicije i biblioteke u IDE. Iste možete preuzeti odavde.
Kompletan projekat će se lemiti na perforiranu PCB dimenzija 5x7cm. Za merenje temperature sam upotrebio BMP280 modul koji osim temperature može da meri i atmosferski pritisak, a preko njega, posredno i nadmorsku visinu. Za komunikaciju sa MCU koristi I2C interfejs a radi na 3,3V. Logička kola su tolerantna na 5V, tako da se ne moraju koristiti level šifteri. Za prikaz sam upoterbio Oled ekran 0,96" sa rezolucijom 128x64 piksela. I ova ploča koristi I2C interfejs ali radi na 5 volti. Za "peglanje" napona na 3,3V sam upotrebio AMS1117 3,3V naponski regulator, uz par kondenzatora od 100uF i 10uF. Crvena LED i otpornik od 150 oma su tu na 3,3V liniji da malo zašarenim kućište. Kad sam kod kućišta, uzeo sam jedno sa dimenzijama 85x58x33mm. Kućište ima providni poklopac i vodonepropusno je. Unutrašnjost je dovoljno prostrana da se sva elektronika lepo spakuje a tu su i padovi za pričvršćavanje PCB-a. Na kraju je ostalo dovoljno prostora za neko eventualno dodavanje senzora vlažnosti vazduha, a isto putuje iz Kine brzinom kornjače. Kad stigne, ovaj post će dobiti jedan update.
Na PCB sam prvo zalemio mikro USB modul pod uglom od 90 stepeni a preko ugaonih muških hedera. Na taj način je sam konektor zapravo došao ispod PCB. Za njega sam sa zadnje strane kućišta napravio otvor, dovoljan za priključivanje kabla. Od njega su 5V i GND išli na IN i GND nožice AMS1117 regulatora. Između 5V i GND sam postavio kondenzator od 100uF 16V. GND dalje ide na odgovarajuće pinove Wavgata, BMP280 i Oled ekrana. 5V ide dalje ka VCC mikrokontrolera i VDD pinu ekrana. Sa OUT nožice naponskog regulatora vodimo 3,3V ka VCC senzora. Na 3,3V i GND sam dodao 10uF 20V kondenzator. Takođe sam dodao crvenu LED i 150 oma otpronik. Ona će svetleti ako ima 3,3V napon na izlazi regulatora. Naravno, moglo se i bez nje. Analogni I2C interfejs Wavgata je povezan na I2C ekrana i senzora. SDA ekrana i senzora sam povezao na A4. SCK ekrana i SCL senzora sam povezao na A5. Ekran, senzor i MCU su na PCB postavljeni preko ženskih hedera koji su zalemljnei na ploči. Na ovaj način se nešto od komponenti može lako zameniti ako zatreba.
----------------------
#include <Wire.h>;
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
Adafruit_BMP280 bmp;
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
delay(500);
if (!bmp.begin()) {
while (1);
}
}
void loop() {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
delay(1000);
display.setCursor(10,10);
display.print(int(bmp.readTemperature()));
display.print(" ");
display.print((char)247);
display.print("C");
display.startscrollleft(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollright(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.display();
display.clearDisplay();
display.setCursor(10,10);
display.print(int(bmp.readPressure()/100));
display.print(" ");
display.print("mbar");
display.startscrollleft(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollright(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.display();
display.clearDisplay();
display.setCursor(10,10);
display.print(int(bmp.readPressure()/1000));
display.print(" ");
display.print("kPa");
display.startscrollleft(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollright(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.display();
display.clearDisplay();
display.setCursor(10,10);
display.print(int(bmp.readAltitude(917)));
display.print(" ");
display.print("m");
display.startscrollleft(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollright(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.display();
}
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
Adafruit_BMP280 bmp;
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
delay(500);
if (!bmp.begin()) {
while (1);
}
}
void loop() {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
delay(1000);
display.setCursor(10,10);
display.print(int(bmp.readTemperature()));
display.print(" ");
display.print((char)247);
display.print("C");
display.startscrollleft(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollright(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.display();
display.clearDisplay();
display.setCursor(10,10);
display.print(int(bmp.readPressure()/100));
display.print(" ");
display.print("mbar");
display.startscrollleft(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollright(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.display();
display.clearDisplay();
display.setCursor(10,10);
display.print(int(bmp.readPressure()/1000));
display.print(" ");
display.print("kPa");
display.startscrollleft(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollright(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.display();
display.clearDisplay();
display.setCursor(10,10);
display.print(int(bmp.readAltitude(917)));
display.print(" ");
display.print("m");
display.startscrollleft(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollright(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.display();
}
-------------------------
Za ovaj projekat je potrebno nekoliko biblioteka. Prva je Wire.h koja je već dostupna u okviru IDE. Za ekran sam upotrebio Adafruit_SSD1306 i Adafruit_GFX. Za BMP280 sam upotrebio Adafruit_Sensor i Adafruit_BMP280 biblioteke. Nakon pravljenja objekata ekrana i senzora u setup funkciji ih pokrećemo. Za ekran ovde upisujemo I2C adresu, a u mom kao i u većini slučajeva je 0x3C. BMP280 senzor nekad može da pravi problem prilikom inicijalizacije pa smo pribegli triku sa if petljom koja će se vrteti u okviru setup funkcije dok se senzor ne pokrene. I2C adresa senzora je najčešće 0x77 i ukoliko ne dobijete ikakva očitavanja, to jest, skeč ostane "zaglavljen" u setup funkciji treba ispratiti u okviru Adafruit_BMP280.h fajla liniju #define BMP280_ADDRESS i postaviti ispravnu I2C adresu. Nakon toga bi senzor morao da radi. U loop funkciji podešavamo ekran i formatiramo ga po potrebi. Ja sam dodao malo scroll efekta uz zastajanje skeča radi očitavanja određenih vrednosti. Ostaje još senzor vlage, ali o tom po tom.
Prilikom testiranja uređaj je trošio oko 22mA što se može prilično smanjiti slanjem mikrokontrolera na spavanje, i na taj način bi uređaj mogao da radi i na baterije. Litijum-jonska 18650 baterija na 3,7V u power banku se dobro držala satima i ovako. Nisam merio koliko dugo može da radi na bateriji ali govorimo o izuzetno štedljivim komponentama gde je samo Wavgat nepoznanica što se tiče potršnje, mada mislim da je u pitanju prilično mali potrošač. Ako će se ići na baterije, LED koju sam dodao bi trebalo izbaciti, scroll efekt, kao i učestalost merenja i očitavanja podataka. Uz uspavljivanje mikrokontrolera.
Šta vi mislite o ovom projektu? Imate li kakve sugestije?
0 Poruka/e