Arduino Silindir Hacim Ölçer Projesi

Silindir Hacim Ölçer Projesi, 8. sınıf öğrencilerinin silindirin hacminin nasıl hesaplanmasını gerektiğini öğretmek ve öğrenirken derslerini daha ilgiyle dinlemelerini sağlamak amacıyla yapılmış bir projedir. Proje %100 sonuçlar vermemektedir ama %85 civarı doğru sonuçlar üretmektedir. Bunun sebebi projede kullanılan elemanların herkesin rahatlıkla bulabileceği, kullanımı kolay ve profesyonel olarak bu tip uygulamalarda kullanılması doğru olmayan elemanların seçilmesinden kaynaklıdır.

Arduino Silindir Hacim Ölçer
Arduino Silindir Hacim Ölçer

İlk olarak silindirin hacmi nasıl hesaplanır bunu hatırlayalım.

Silindirin Hacmi= Taban Alanı x Yükseklik

Silindirin Hacmi= (πxr²) x h

Hacimin nasıl hesaplandığını hatırladıysak artık projede gerekli olan malzemeleri öğrenelim.

Ardıino Silindir Hacim Ölçer Özellikleri

  • 3 farklı taban alanlı ve yükseklikli silindir için tasarlanmıştır. Silindirlerimizin yarıçapları ve yüksek özellikleri aşağıda verilmiştir.
  • Hacim hesaplamasında π=3 olarak işlem yapılmıştır.
  • 1 Silindir: r=2 cm, h=8 cm, hacim=96
  • 2. Silindir: r=3 cm, h=12 cm, hacim=324
  • 3. Silindir: r=4 cm, h=15 cm, hacim=720
  • 4. Silindir: r=3 cm, h=6 cm, hacim=162
  • 5. Silindir: r=2 cm, h=12 cm, hacim=144

Silindir Hacim Ölçer Malzeme Listesi

Arduino Silindir Hacim Ölçer Devre Şeması

Arduino Silindir Hacim Ölçer Devre Şeması
Arduino Silindir Hacim Ölçer Devre Şeması
Komponent PiniArduinoAçıklama
2.1 Power Jak –GNDToprak bağlantısı
2.1 Power Jak +VinArduino besleme pini
LDR 1(Yükseklik)A0Yükseklik ölçümü yapacak olan Ldr.
LDR 2(Küçük taban alanlı silindir)A1Küçük taban alanlı alana silindirin yerleştirilip yerleştirilmediğini kontrol edecek olan ldr.
LDR 3(Orta taban alanlı silindir)A2Orta taban alanlı alana silindirin yerleştirilip yerleştirilmediğini kontrol edecek olan ldr.
LDR 4(Büyük taban alanlı silindir)A3Büyük taban alanlı alana silindirin yerleştirilip yerleştirilmediğini kontrol edecek olan ldr.
Oled Ekran VCC5VOled ekran güç pini
Oled Ekran GNDGNDOled ekran toprak pini
Oled Ekran SDAA4I2C Haberleşme protokolü bağlantı pini
Oled Ekran SCLA5I2C Haberleşme protokolü bağlantı pini
Hacim Hesaplama Butonu3Bu butonumuz bizim hacim hesaplama işlevimizi tetikletecek olan buton.
Konum Sıfırlama ve Referans Alma Butonu4Bu buton bizim ilk başta yüksekliğimizin sıfırlanmasını ve referans değerlerimizi almaya yarayan buton.
Sıfırlama Switch2Bu yüksekliğimin sıfırlandığını tetikletecek olan switch.
Step Motor(IN1,IN2,IN3,IN4)(8,9,10,11)Step motorlarımızı kontrol edeceğimiz pinler.
Arduino Silindir Hacim Ölçer Bağlantı Pinleri

Kullanılan Kütüphaneler

Projede 2 adet kütüphane kullanılmıştır. Bunlar;

Arduino Silindir Hacim Ölçer 3d Dosyaları

Projenin stl dosyalarını aşağıdan indirip 3 boyutlu yazıcınız ile bastırabilirsiniz.

Arduino Silindir Hacim Ölçer Solidworks Çizimi
Arduino Silindir Hacim Ölçer Solidworks Çizimi

Projede Dikkat Edilmesi Gereken Adımlar

  • Switch’i yapıştırırken switchin yönü çok önemli arkadaşlar. Aşağıdaki resimde switchin nereye bakması gerektiği gösterilmiştir.Switchin yüzeyi ile küçük taban alanlı yüzeyi parelel(düz) olmalı.
Switch Yönü
  • Vin pini ile 5v pinini karıştırarak birbirine bağlamayın.
  • Dirençlerin bağlantılarına ve dirençlerden arduinoya giden kabloların bağlantı yerlerine dikkat edin.

Arduino Silindir Hacim Ölçer Kodu

#include <Stepper.h>
#include "U8glib.h"
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);
#define sifirla_switch 2
#define hacim_buton 3
#define konum_buton 4
int sifirlama_durum=0; // buton deği.Buton durumunu tutuyor.

const int stepsPerRevolution = 2048;
Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);
// -------Analog Pinler---------
#define yukseklik_ldr A0
#define silindir1 A1
#define silindir2 A2
#define silindir3 A3
//----------Karanlik Ortalamalar----------
int karanlikyukseklik=0;
int karanliksilindir1=0;
int karanliksilindir2=0;
int karanliksilindir3=0;
//-----------Aydinlik Ortalamalar----------------
int aydinlikyukseklik=0;
int aydinliksilindir1=0;
int aydinliksilindir2=0;
int aydinliksilindir3=0;



void setup() {
  myStepper.setSpeed(10);
  Serial.begin(9600);
}

void loop() {

  int konum_sifirla=digitalRead(konum_buton);

  if(konum_sifirla==HIGH){
    baslangicagit();
    yaz("Cisim Cikar","5sn snr. hsplnck");
    Serial.println("Cisim cikar 5sn sonra hesaplanacak.");
    delay(5000);
    aydinlikdegerbul();
    Serial.println("Aydinlik degerler: "+String(aydinlikyukseklik)+ ":" +String(aydinliksilindir1)+ ":" +String(aydinliksilindir2)+ ":" +String(aydinliksilindir3));
    yaz("Cisim Tak","5sn snr hsplnck");
    Serial.println("Cisim tak 5sn sonra hesaplanacak.");
    delay(5000);
    karanlikdegerbul();
    Serial.println("Karanlik degerler: "+String(karanlikyukseklik)+ ":" +String(karanliksilindir1)+ ":" +String(karanliksilindir2)+ ":" +String(karanliksilindir3));
    yaz("Islem Tamam","Degerler alindi");
  }

  int hacimbutonkontrol=digitalRead(hacim_buton);
  if(hacimbutonkontrol==HIGH){
      hacimbul();
  }
  Serial.print("Yuseklik:");
  Serial.print(analogRead(yukseklik_ldr));
  Serial.print("---Silindir1:");
  Serial.print(analogRead(silindir1));
  Serial.print("---Silindir2:");
  Serial.print(analogRead(silindir2));
  Serial.print("---Silindir3:");
  Serial.println(analogRead(silindir3));
  delay(200);
  
}
void baslangicagit(){
    for(int i=0;i<10000;i++){
        sifirlama_durum=digitalRead(sifirla_switch);
        if(sifirlama_durum==HIGH){
          break;
        }else{
        Serial.println("Asagi iniyor...");
        yaz("Yukseklik","sifirlaniyor...");
        //myStepper.step(500);
        //delay(500);
        myStepper.step(-20);
        
        }
    }
    yaz("Yukseklik","sifirlandi.");
    Serial.println("Baslangica Gelindi.");

}
void draw(String mesaj,String mesaj2) { // Ekran görsel yerleşimini ve yazdırılacak metnin düzenlendiği bölüm.
  String Str;
  u8g.setFont(u8g_font_profont12); // Yazının Fontu belirlendi.
  u8g.setPrintPos(0, 28); // Yazının ekrandaki yeri belirlendi.
  u8g.print(mesaj);
  u8g.setFont(u8g_font_profont12);
  u8g.setPrintPos(0, 56);
  u8g.print(mesaj2);
}
void yaz(String mesaj1, String mesaj2){
  u8g.firstPage();
  do {
  draw(mesaj1,mesaj2);
  } while (u8g.nextPage());
  delay(25);
}
double tabanalanibul(){
  int tabanalani1=analogRead(silindir1);
  int tabanalani2=analogRead(silindir2);
  int tabanalani3=analogRead(silindir3);
  int yaricap=0;
  if(tabanalani1<250 && tabanalani2>300 && tabanalani3>300){
    yaricap=2;
  }else if(tabanalani1<250 && tabanalani2<300 && tabanalani3>300){
    yaricap=3;
  }else if(tabanalani1<250 && tabanalani2<300 && tabanalani3<300){
    yaricap=4;
  }else{
    yaz("HATA","Taban sorunu");
    Serial.println("Taban alani sorunu");
  }
  Serial.print("Silindir1:");
  Serial.print(analogRead(silindir1));
  Serial.print("---Silindir2:");
  Serial.print(analogRead(silindir2));
  Serial.print("---Silindir3:");
  Serial.println(analogRead(silindir3));
  int tabanalani=yaricap*yaricap*3;
  yaz("Taban Alani:",String(tabanalani));
  Serial.println("Taban alani:"+String(tabanalani)+" bulundu");
  return tabanalani;
}
double yukseklikbul(){
  int yukseklik=analogRead(yukseklik_ldr);
  int adim=0;
  while(abs(yukseklik-aydinlikyukseklik)>3){
      myStepper.step(20);
      yukseklik=analogRead(yukseklik_ldr);
      adim+=1;
  }
  double dislicevre=2*3*1.125;
  int yukseklikcm=(((20.0*adim)/2048)*dislicevre)+0.5;
  Serial.print("Yukseklik=");
  Serial.print(yukseklikcm);
  Serial.println(" bulundu.");
  yaz("Yukseklik:",String(yukseklikcm)+" cm");
  return yukseklikcm;
}
void hacimbul(){
  baslangicagit();
  double yuk=yukseklikbul();
  double alan=tabanalanibul();
  if(alan==48){
    yuk=yuk-2;
  }else if(alan==27){
    yuk=yuk-1.5;
  }else if(alan==12){
    yuk=yuk-1;
  }
  int hacim=yuk*alan;
  String Hacimm="Hacim "+String(hacim);
  Serial.println("Hacim "+String(hacim)+" bulundu.");
  yaz("H:"+String(yuk)+" Alan:"+String(alan),Hacimm);
  return hacim;
}
void karanlikdegerbul(){
  int karanlikdegerleryukseklik[10];
  int karanlikdegerlersilindir1[10];
  int karanlikdegerlersilindir2[10];
  int karanlikdegerlersilindir3[10];
  int deger1=0;
  int deger2=0;
  int deger3=0;
  int deger4=0;
  for(int i=0;i<10;i++){
    int yukdeger=analogRead(yukseklik_ldr);
    int silindir1deger=analogRead(silindir1);
    int silindir2deger=analogRead(silindir2);
    int silindir3deger=analogRead(silindir3);
    karanlikdegerleryukseklik[i]=yukdeger;
    karanlikdegerlersilindir1[i]=silindir1deger;
    karanlikdegerlersilindir2[i]=silindir2deger;
    karanlikdegerlersilindir3[i]=silindir3deger;
    delay(200);
  }
  deger1=0;
  deger2=0;
  deger3=0;
  deger4=0;
  for(int a=0;a<10;a++){
    deger1=deger1+karanlikdegerleryukseklik[a];
    deger2=deger2+karanlikdegerlersilindir1[a];
    deger3=deger3+karanlikdegerlersilindir2[a];
    deger4=deger4+karanlikdegerlersilindir3[a];
  }
    deger1=deger1/10;
    deger2=deger2/10;
    deger3=deger3/10;
    deger4=deger4/10;
    karanlikyukseklik=deger1;
    karanliksilindir1=deger2;
    karanliksilindir2=deger3;
    karanliksilindir3=deger4;
}
void aydinlikdegerbul(){
  int aydinlikdegerleryukseklik[10];
  int aydinlikdegerlersilindir1[10];
  int aydinlikdegerlersilindir2[10];
  int aydinlikdegerlersilindir3[10];
  int deger1=0;
  int deger2=0;
  int deger3=0;
  int deger4=0;
  for(int i=0;i<10;i++){
    int yukdeger=analogRead(yukseklik_ldr);
    int silindir1deger=analogRead(silindir1);
    int silindir2deger=analogRead(silindir2);
    int silindir3deger=analogRead(silindir3);
    aydinlikdegerleryukseklik[i]=yukdeger;
    aydinlikdegerlersilindir1[i]=silindir1deger;
    aydinlikdegerlersilindir2[i]=silindir2deger;
    aydinlikdegerlersilindir3[i]=silindir3deger;
    delay(200);
  }
  deger1=0;
  deger2=0;
  deger3=0;
  deger4=0;
  for(int a=0;a<10;a++){
    deger1=deger1+aydinlikdegerleryukseklik[a];
    deger2=deger2+aydinlikdegerlersilindir1[a];
    deger3=deger3+aydinlikdegerlersilindir2[a];
    deger4=deger4+aydinlikdegerlersilindir3[a];
  }
    deger1=deger1/10;
    deger2=deger2/10;
    deger3=deger3/10;
    deger4=deger4/10;
    aydinlikyukseklik=deger1;
    aydinliksilindir1=deger2;
    aydinliksilindir2=deger3;
    aydinliksilindir3=deger4;
}
Arduino Silindir Hacim Ölçer

Kodlarımızı açıklayalım.

#include <Stepper.h>
#include "U8glib.h"
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);
#define sifirla_switch 2
#define hacim_buton 3
#define konum_buton 4
int sifirlama_durum=0; // buton deği.Buton durumunu tutuyor.

const int stepsPerRevolution = 2048;
Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);

Bu kısımda ilk olarak projeye kütüphaneler eklenmiştir. İkinci olarak oled ekran(U8glib) kütüphanemizden hangi model ekranı kullanacağımız belirlenmiştir. Üçüncü olarak switch ve butonlarımız tanımlanmıştır. Dördüncü olarak yüksekliğimiz sıfırlandığını tutacak olan değişken tanımlanmıştır. Beşinci olarak motorumuzun bir tur dönmesi için gerekli olan adım sayısı tanımlanmıştır ve son olarak step motorun kontrolü için myStepper adında bir obje tanımlanmış ve ek olarak motorun bağlanacağı pinler tanımlanmıştır.

// -------Analog Pinler---------
#define yukseklik_ldr A0
#define silindir1 A1
#define silindir2 A2
#define silindir3 A3

Ldr sensörlerimizin bağlanacağı pinler tanımlanmıştır.

//----------Karanlik Ortalamalar----------
int karanlikyukseklik=0;
int karanliksilindir1=0;
int karanliksilindir2=0;
int karanliksilindir3=0;
//-----------Aydinlik Ortalamalar----------------
int aydinlikyukseklik=0;
int aydinliksilindir1=0;
int aydinliksilindir2=0;
int aydinliksilindir3=0;

Konum sıfırlama butonuna basınca ortamın aydınlık ve karanlık referans değerlerinin alınıp tutulacağı değişkenler.

  myStepper.setSpeed(10);
  Serial.begin(9600);

Bu kısımda motorumuzun hareket hızı ve seri haberleşme hızı belirlenmiştir.

void loop() {

  int konum_sifirla=digitalRead(konum_buton);

  if(konum_sifirla==HIGH){
    baslangicagit();
    yaz("Cisim Cikar","5sn snr. hsplnck");
    Serial.println("Cisim cikar 5sn sonra hesaplanacak.");
    delay(5000);
    aydinlikdegerbul();
    Serial.println("Aydinlik degerler: "+String(aydinlikyukseklik)+ ":" +String(aydinliksilindir1)+ ":" +String(aydinliksilindir2)+ ":" +String(aydinliksilindir3));
    yaz("Cisim Tak","5sn snr hsplnck");
    Serial.println("Cisim tak 5sn sonra hesaplanacak.");
    delay(5000);
    karanlikdegerbul();
    Serial.println("Karanlik degerler: "+String(karanlikyukseklik)+ ":" +String(karanliksilindir1)+ ":" +String(karanliksilindir2)+ ":" +String(karanliksilindir3));
    yaz("Islem Tamam","Degerler alindi");
  }

  int hacimbutonkontrol=digitalRead(hacim_buton);
  if(hacimbutonkontrol==HIGH){
      hacimbul();
  }
  Serial.print("Yuseklik:");
  Serial.print(analogRead(yukseklik_ldr));
  Serial.print("---Silindir1:");
  Serial.print(analogRead(silindir1));
  Serial.print("---Silindir2:");
  Serial.print(analogRead(silindir2));
  Serial.print("---Silindir3:");
  Serial.println(analogRead(silindir3));
  delay(200);
  
}

Loopta ilk olarak yükseklik sıfırlama butonuna basılıp basılmadığı kontrol edilmiştir. Eğer butona basılmış ise yüksekliği sıfırla ve ardından oled ekranımıza ve seri portumuza cisim çıkar 5 saniye sonra aydınlık referans değeri alınacağını söylemektedir. 5 saniye bekledikten sonra aydınlık referans değerleri alınmıştır ve bunları seri porta yazdırmaktadır. Daha sonra bizden silindir takmamızı istemektedir. Silindir olarak taban alanı en büyük olanı takmamız gerekmektedir. 5 saniye bekledikten sonra karanlık referans değerlerini almaktadır. Karanlık referans değerlerini seri porta yazdırdıktan sonra oled ekrana işlemin tamamlandığını söylemektedir.

Hacim butonuna basıldığını kontrol et. Eğer basılmış ise hacim hesapla. Loopun alt kısmında ise bizim ldr sensörlerimizden alınan değeri sürekli olarak seri porta yazdırılmıştır ve 200 ms beklenmiştir.

void baslangicagit(){
    for(int i=0;i<10000;i++){
        sifirlama_durum=digitalRead(sifirla_switch);
        if(sifirlama_durum==HIGH){
          break;
        }else{
        Serial.println("Asagi iniyor...");
        yaz("Yukseklik","sifirlaniyor...");
        //myStepper.step(500);
        //delay(500);
        myStepper.step(-20);
        
        }
    }
    yaz("Yukseklik","sifirlandi.");
    Serial.println("Baslangica Gelindi.");

}

Bu fonksiyon bizim yüksekliğimizin sıfırlanması için yazılmış bir koddur. For döngüsü ile sürekli olarak motor 20 adım aşağı atması ve her 20 adımda bir yükseklik sıfırlama amacıyla koyduğumuz switche basılıp basılmadığını kontrol et ve seri porta ve oled ekrana aşağı iniliyor yazdır. Eğer switche basılmış ise for döngüsünden çık ve oled ekran ile seri porta yüksekliğin sıfırlandığı yazdırılmıştır.

void draw(String mesaj,String mesaj2) { // Ekran görsel yerleşimini ve yazdırılacak metnin düzenlendiği bölüm.
  u8g.setFont(u8g_font_profont12); // Yazının Fontu belirlendi.
  u8g.setPrintPos(0, 28); // Yazının ekrandaki yeri belirlendi.
  u8g.print(mesaj);
  u8g.setFont(u8g_font_profont12);
  u8g.setPrintPos(0, 56);
  u8g.print(mesaj2);
}
void yaz(String mesaj1, String mesaj2){
  u8g.firstPage();
  do {
  draw(mesaj1,mesaj2);
  } while (u8g.nextPage());
  delay(25);
}

Bu kısımda oled ekrana yazı yazdırma fonksiyonu yer almaktadır. Oled ekranda 2 satır olarak yazı yazılacağı belirlenmiştir. Birinci satır 0-28 pikseller arasında olacağı ve yazı fontu belirlenmiştir. İkinci satır ise 0-56 arasında olacağı ve yazı fontu belirlenmiştir. Burada ilk satıra fonksiyona 1. girilen inputu yazdır, ikici satıra ise 2. input olarak girilen metni yazdır denmiştir. Yaz fonksiyonda ise inpular ile alınan mesajların draw fonksiyonu ile yazdırılması sağlanmiştir.

double tabanalanibul(){
  int tabanalani1=analogRead(silindir1);
  int tabanalani2=analogRead(silindir2);
  int tabanalani3=analogRead(silindir3);
  int yaricap=0;
  if(tabanalani1<250 && tabanalani2>300 && tabanalani3>300){
    yaricap=2;
  }else if(tabanalani1<250 && tabanalani2<300 && tabanalani3>300){
    yaricap=3;
  }else if(tabanalani1<250 && tabanalani2<300 && tabanalani3<300){
    yaricap=4;
  }else{
    yaz("HATA","Taban sorunu");
    Serial.println("Taban alani sorunu");
  }
  Serial.print("Silindir1:");
  Serial.print(analogRead(silindir1));
  Serial.print("---Silindir2:");
  Serial.print(analogRead(silindir2));
  Serial.print("---Silindir3:");
  Serial.println(analogRead(silindir3));
  int tabanalani=yaricap*yaricap*3;
  yaz("Taban Alani:",String(tabanalani));
  Serial.println("Taban alani:"+String(tabanalani)+" bulundu");
  return tabanalani;
}

Bu fonksiyonda ise silindirin hacim ölçerimize takıldığını tespit edip taban alanı hesaplanmış ve double olarak geri gönderilmiştir. İlk olarak silindirlerimizin altında olan ldr’lerden veri okuması gerçekleştirmiştir. Bu okumaya göre verilerimiz if içerisine girip referans değerlere göre hangi silindirin takılı olduğu tespit edilip ona göre yarı çap belirlenmiştir. Seri porta silindirlerden okunan değerler kontrol amaçlı olarak yazdırılmıştır. Yarıçapı belirlendikten sonra taban alanı hesaplanmıştır. Taban alanı hem oled ekranda hemde seri porta yazdırılmış ve taban alanı output olarak fonksiyonumuzdan geri gönderilmiştir.

double yukseklikbul(){
  int yukseklik=analogRead(yukseklik_ldr);
  int adim=0;
  while(abs(yukseklik-aydinlikyukseklik)>3){
      myStepper.step(20);
      yukseklik=analogRead(yukseklik_ldr);
      adim+=1;
  }
  double dislicevre=2*3*1.125;
  int yukseklikcm=(((20.0*adim)/2048)*dislicevre)+0.5;
  Serial.print("Yukseklik=");
  Serial.print(yukseklikcm);
  Serial.println(" bulundu.");
  yaz("Yukseklik:",String(yukseklikcm)+" cm");
  return yukseklikcm;
}

yukseklikbul() fonksiyonunda ilk olarak yüksekliği bulmak için kullanıdığımız ldr’den ilk değer okunmaktadır ve adım sayımızı tutacak olan bir değişken(adim) tanımlanmıştır. while döngüsü ile yükseklik ldr’sinden okunan değerden aydınlık referans değerimiz çıkarılmış ve mutlağı alınmıştır. Eğer fark 3 den büyük olduğu sürece yukarı step motor 20 adım atsın ve tekrardan yükseklik ldr’sinden veri okusun ve adım sayımızı 1 arttır diyoruz taki farkın mutlağı 3’ten küçük oluncaya kadar. Daha sonra bizim dişlimizin çevresi hesaplanmıştır. Bizim dişlimizin çevresi 1 tur döner ise bizim yüksekliğimizi o kadar yukarı çıkarmaktadır. Burada 1.125 cm bizim dişlimizin yarıçapıdır. Daha sonra yükseklik hesaplanmıştır. Yukarı çıkarken motor 20 adım atmaktaydı. Biz bunu adım sayısı ile çarpıyoruz. Çünkü motora while döngüsü içerisinde yukarı git dediğimizde 1 kere 20 adım atmaktadır. Daha sonra adım sayımızı 2048’e bölüyoruz. 2048 bizim step motorumuzun 1 tur dönmesi için gerekli adım sayısıdır. Buradan dişlimizin kaç tur döndüğünü öğreniyoruz ve dişlinin çevresi ile çarpıyoruz. Ek olarak 0.5 cm ekleme yapıyoruz. Bunu sebebi switche tıklama gerçekleşince tabandan 0.5 cm yükseklikte ldr’nin durmasıdır. Yükseklik değerimizi seri porta ve oled ekrana yazdırıp yüksekliğimizi output olarak geri döndürmektedir.

void hacimbul(){
  baslangicagit();
  double yuk=yukseklikbul();
  double alan=tabanalanibul();
  if(alan==48){
    yuk=yuk-2;
  }else if(alan==27){
    yuk=yuk-1.5;
  }else if(alan==12){
    yuk=yuk-1;
  }
  int hacim=yuk*alan;
  String Hacimm="Hacim "+String(hacim);
  Serial.println("Hacim "+String(hacim)+" bulundu.");
  yaz("H:"+String(yuk)+" Alan:"+String(alan),Hacimm);
  return hacim;
}

hacimbul() fonksiyonunda ilk olarak yüksekliğin sıfırlanması yapılmıştır. daha sonra yükseklik ve alan hesaplanmıştır. Taban alanlarına göre yüksekliklerden belirli değerler çıkarılmıştır. Bu değerler aradaki yükseklik farklarından dolayı belirlenen değerlerdir. Bu değerler test edilerek bulunmuştur. Siz hata paylarını en aza indirmek switchi biraz daha aşağıya yapıştırabilirsiniz. Daha sonra yükseklik ve taban alanı çarparak hacimi bulmuştur. Bulunan yükseklik, alan ve hacim oled ekranda yazdırılmıştır ve output olarak hacim geri döndürülmüştür.

void karanlikdegerbul(){
  int karanlikdegerleryukseklik[10];
  int karanlikdegerlersilindir1[10];
  int karanlikdegerlersilindir2[10];
  int karanlikdegerlersilindir3[10];
  int deger1=0;
  int deger2=0;
  int deger3=0;
  int deger4=0;
  for(int i=0;i<10;i++){
    int yukdeger=analogRead(yukseklik_ldr);
    int silindir1deger=analogRead(silindir1);
    int silindir2deger=analogRead(silindir2);
    int silindir3deger=analogRead(silindir3);
    karanlikdegerleryukseklik[i]=yukdeger;
    karanlikdegerlersilindir1[i]=silindir1deger;
    karanlikdegerlersilindir2[i]=silindir2deger;
    karanlikdegerlersilindir3[i]=silindir3deger;
    delay(200);
  }
  deger1=0;
  deger2=0;
  deger3=0;
  deger4=0;
  for(int a=0;a<10;a++){
    deger1=deger1+karanlikdegerleryukseklik[a];
    deger2=deger2+karanlikdegerlersilindir1[a];
    deger3=deger3+karanlikdegerlersilindir2[a];
    deger4=deger4+karanlikdegerlersilindir3[a];
  }
    deger1=deger1/10;
    deger2=deger2/10;
    deger3=deger3/10;
    deger4=deger4/10;
    karanlikyukseklik=deger1;
    karanliksilindir1=deger2;
    karanliksilindir2=deger3;
    karanliksilindir3=deger4;
}
void aydinlikdegerbul(){
  int aydinlikdegerleryukseklik[10];
  int aydinlikdegerlersilindir1[10];
  int aydinlikdegerlersilindir2[10];
  int aydinlikdegerlersilindir3[10];
  int deger1=0;
  int deger2=0;
  int deger3=0;
  int deger4=0;
  for(int i=0;i<10;i++){
    int yukdeger=analogRead(yukseklik_ldr);
    int silindir1deger=analogRead(silindir1);
    int silindir2deger=analogRead(silindir2);
    int silindir3deger=analogRead(silindir3);
    aydinlikdegerleryukseklik[i]=yukdeger;
    aydinlikdegerlersilindir1[i]=silindir1deger;
    aydinlikdegerlersilindir2[i]=silindir2deger;
    aydinlikdegerlersilindir3[i]=silindir3deger;
    delay(200);
  }
  deger1=0;
  deger2=0;
  deger3=0;
  deger4=0;
  for(int a=0;a<10;a++){
    deger1=deger1+aydinlikdegerleryukseklik[a];
    deger2=deger2+aydinlikdegerlersilindir1[a];
    deger3=deger3+aydinlikdegerlersilindir2[a];
    deger4=deger4+aydinlikdegerlersilindir3[a];
  }
    deger1=deger1/10;
    deger2=deger2/10;
    deger3=deger3/10;
    deger4=deger4/10;
    aydinlikyukseklik=deger1;
    aydinliksilindir1=deger2;
    aydinliksilindir2=deger3;
    aydinliksilindir3=deger4;
}

Burada aydınlık ve karanlık değerleri herbir ldr için 200 ms ile okunup 10 elemanlı dizi içerisine kaydedilmiştir. Bu değerler en sonda toplanıp 10’a bölünerek ortalama bir referans değeri alınarak bizim globalde tanımladığımız değişkenlere atanmıştır.

Bir yazımızda burada biter 🙂 Umarım yapmak isteyenlere güzel bir proje olur 🙂