26 sij Stanica za mjerenje uvjeta rasta biljke
Zadatak
Izradite program kojim ćete mjeriti vlažnost tla biljke te temperaturu i tlak zraka okoline u kojoj se biljka nalazi. Neka se te vrijednosti ispisuju na easyC OLED ekranu. U slučaju da vlažnost zemlje padne ispod određene vrijednosti, neka zvučnik signalizira kratkim tonom. Sve komponente spojite na Arduino MKR1000 shield.
Kako bi uspješno napravili program, potrebno je u Library Manager-u (Sketch -> Include Library -> Manage Libraries) instalirati dvije biblioteke:
- Adafruit_GFX.h
- Adafruit_SSD1306.h
Također, preuzmite biblioteku SFE_BMP180.h na svoje računalo i dodajte je u Arduino razvojno okruženje odabirom Sketch -> Include Library -> Add .ZIP Library…
Prikaz spajanja
Senzor vlage u zemlji spojite na izvod A0.
Zvučnik spojite na izvod 8.
EasyC OLED ekran spojite na I2C priključak.
EasyC BMP180 senzor spojite na I2C priključak.
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <SFE_BMP180.h> #define SCREEN_WIDTH 128 // sirina OLED ekrana u pikselima #define SCREEN_HEIGHT 64 // visina OLED ekrana u pikselima // Deklariranje SSD1306 ekrana spojenog na I2C sabirnicu (SDA i SCL izvodi) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); SFE_BMP180 tlak; double tlakZraka, tempZraka; int vlaznostZemlje; int zvucnik = 8; void setup() { Serial.begin(115200); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // adresa OLED ekrana (0x3C) Serial.println(F("SSD1306 allocation failed")); for(;;); } delay(2000); display.clearDisplay(); if(tlak.begin()) Serial.println("BMP180 uspjesno povezan."); else { Serial.print("BMP180 nije uspjesno povezan."); while(1); } } void loop() { display.clearDisplay(); tlakZraka = ocitajTlak(); tempZraka = ocitajTemperaturu(); vlaznostZemlje = analogRead(A0); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 10); display.print("Temp. = "); display.println(tempZraka); display.setCursor(0, 20); display.print("Tlak = "); display.println(tlakZraka); display.setCursor(0, 30); display.print("Vlaznost = "); display.println(vlaznostZemlje); if(vlaznostZemlje < 300){ // Ako je vlaznost zemlje ispod određene vrijendnosti, prikaži poruku na ekranu i zasviraj ton display.setCursor(0, 50); display.println("Potrebno zalijevanje!"); tone(zvucnik, 1000, 500); } display.display(); delay(200); } double ocitajTlak(){ char status; /* * definiramo varijable: * temp - temperatura zraka * Tlak - tlak zraka * tlak0 - tlak na povrsini mora * nadVisina - nadmorska visina */ double temp, Tlak, tlak0, nadVisina; status = tlak.startTemperature(); if(status != 0) { delay(status); status = tlak.getTemperature(temp); if(status != 0) { status = tlak.startPressure(3); if(status != 0) { delay(status); status = tlak.getPressure(Tlak,temp); if(status != 0) { return(Tlak); } } } } } double ocitajTemperaturu(){ char status; double temp; status = tlak.startTemperature(); if(status != 0) { delay(status); status = tlak.getTemperature(temp); if(status != 0) { return(temp); } } }