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.

Arduino kod
#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);
    }
  }
}