#include "Arduino.h"
#include <Wire.h>
#include <LiquidCrystal_I2C_AvrI2C.h> //Lcd ekran kütüphanemizi ekliyoruz.
int KIRMIZI = 8; //Kırımızı trafik lambası pinimizi digital 8'e bağladık.
int SARI = 9; //Sarı trafik lambası pinimizi digital 9'a bağladık.
int YESIL = 10; //Yeşilı trafik lambası pinimizi digital 10'a bağladık.
#define Buton 3 // Buton pinimizi digital 3'e bağladık.
int sayac = 0;
int interval = 1000;
unsigned long previousMillis = 0;
volatile int flow_frequency; // Sensör akış frekansı (sensör palsi)
float litre; // Toplam kullanılan litre.
unsigned char flowsensor = 2; // Debimetre sinyal pinimizi digital 2'ye bağladık.
unsigned long currentTime;
unsigned long cloopTime;
int toplamdakika;
void flow () // Interrupt
{
flow_frequency++;
}
LiquidCrystal_I2C_AvrI2C lcd(0x27,16,2); //Lcd ekran bağlantısı
void setup() {
lcd.begin(); //LCD ekranımızı başlatıyoruz.
lcd.clear(); //LCD ekranımızı temizliyoruz.
pinMode (YESIL, OUTPUT);
pinMode (SARI, OUTPUT);
pinMode (KIRMIZI, OUTPUT);
pinMode(Buton, INPUT);
// Sensör Giriş Ayarları
pinMode(flowsensor, INPUT);
digitalWrite(flowsensor, HIGH);
// İnterrupt/Kesme Ayarları
attachInterrupt(0, flow, RISING); //Hall effect sensörü her RISING oluşunda flow formülünü çalıştırır. Buradaki sıfıt interreupt kullanırken Arduino uno üzerindeki D2 pini temsil ediyor.
sei(); // interrupts açık
currentTime = millis();
cloopTime = currentTime;
lcd.setCursor(0, 0);
lcd.print(" Debimetre V1");
lcd.setCursor(0, 1);
lcd.print(" Mehmet Ali TOR");
delay(2000);
}
void loop() {
currentTime = millis();
// saniyede geçen pals sayısı sayılıp litre - saat hesabı alınması
if(currentTime >= (cloopTime + 1000))
{
cloopTime = currentTime; // saniyeyi güncelle
litre = (flow_frequency / 7.5 / 60); // saniyede geçen litre
//flow_frequency = 0; // sayıcıyı sıfırlar, eğer sayacı sıfırlarsak ekranda her defasında litre/saniye değerini görürüz. Ancak sıfırlamazsak saniyede geçen debi toplanarak gider ve toplam kullanılan suyu görürüz.
}
if ((millis() - previousMillis) >= interval){
previousMillis = millis();
toplamdakika = sayac/60; // milisaniye değerini 60'a bölerek toplam geçen dakikayı buluyoruz.
sayac++;
}
if (digitalRead(Buton) == LOW){ //Eğer butona basıldıysa
flow_frequency = 0; // Sensör palsini sıfırla
sayac = 0; // Zaman sayacını sıfırla
lcd.setCursor(0, 0);
lcd.print(" Su ve Zaman ");
lcd.setCursor(0, 1);
lcd.print(" Resetlendi ");
}
else {
lcd.setCursor(0, 0);
lcd.print("Su : ");
lcd.print(litre, 1); // toplam kullanılan suyu gösterir, virgülden sonraki 2 basamağı gösterir.
lcd.print(" lt");
lcd.setCursor(0, 1);
lcd.print("Zaman: ");
lcd.print(toplamdakika); //toplam kullanımda geçen süreyi verir.
lcd.println(" dk ");
delay(100);
}
if (litre <= 1){
digitalWrite (KIRMIZI, LOW);
digitalWrite (SARI, LOW);
digitalWrite (YESIL, HIGH);
}
else if (1 < litre && litre <= 2){
digitalWrite (KIRMIZI, LOW);
digitalWrite (SARI, HIGH);
digitalWrite (YESIL, LOW);
}
else {
digitalWrite (KIRMIZI, HIGH);
digitalWrite (SARI, LOW);
digitalWrite (YESIL, LOW);
}
}