#include <DHT.h>
#include <HX711.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Servo.h>
#include <SD.h>
#include <Keypad.h>
// RGB LED'nin bağlandığı pinler
const int redPin = 3;
const int greenPin = 2;
const int bluePin = 1;
// RGB LED için renk kodları
const int RED_COLOR = 0xFF0000; // Kırmızı
const int GREEN_COLOR = 0x00FF00; // Yeşil
const int BLUE_COLOR = 0x0000FF; // Mavi
// LED'nin bağlandığı pin
const int ledPin = 13;
// DHT22 sensörünün bağlandığı pin
const int DHTPin = 12;
// Buzzer'ın bağlandığı pin
const int buzzerPin = 7;
// Mamanın ve suyun minimum ağırlığı (örneğin 30 gram)
const float minFoodWeight = 30.0;
const float minWaterWeight = 30.0;
// Load cell pin bağlantıları
const int LOADCELL_DOUT_PIN_FOOD = 6;
const int LOADCELL_SCK_PIN_FOOD = 5;
const int LOADCELL_DOUT_PIN_WATER = 8;
const int LOADCELL_SCK_PIN_WATER = 9;
// OLED ekranın boyutu
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// OLED ekranın I2C adresi
#define OLED_ADDR 0x3C
// DHT tipini belirtin
#define DHTType DHT22
// Servo'nun bağlandığı pin
const int servoPin = 11;
// SD kart pin bağlantıları
const int chipSelect = 4;
// Keypad bağlantıları ve tuşlar
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {29, 31, 33, 35};
byte colPins[COLS] = {37, 39, 41, 43};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// DHT sensörünü başlatın
DHT dht(DHTPin, DHTType);
// Load cell nesneleri oluştur
HX711 scaleFood;
HX711 scaleWater;
// OLED ekran nesnesi oluştur
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_ADDR);
// Servo nesnesi oluştur
Servo servo;
File dataFile; // SD kart dosya nesnesi
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
servo.attach(servoPin);
dht.begin();
scaleFood.begin(LOADCELL_DOUT_PIN_FOOD, LOADCELL_SCK_PIN_FOOD);
scaleWater.begin(LOADCELL_DOUT_PIN_WATER, LOADCELL_SCK_PIN_WATER);
scaleFood.set_scale(5000);
scaleWater.set_scale(5000);
scaleFood.tare();
scaleWater.tare();
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println(F("SSD1306 ekran başlatma hatası!"));
for (;;);
}
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Hoş geldiniz!");
display.display();
if (!SD.begin(chipSelect)) {
Serial.println("SD kart başlatma hatası!");
return;
}
Serial.println("SD kart başarıyla başlatıldı.");
}
void loop() {
digitalWrite(ledPin, HIGH);
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
Serial.print("Nem: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("Sıcaklık: ");
Serial.print(temperature);
Serial.println(" °C");
//float foodWeight = scaleFood.get_units();
float foodWeight = 0;
float waterWeight = scaleWater.get_units();
Serial.print("Mama Ağırlığı: ");
Serial.print(foodWeight);
Serial.println(" gram");
Serial.print("Su Ağırlığı: ");
Serial.print(waterWeight);
Serial.println(" gram");
// RGB LED'yi kontrol et
if (foodWeight <= 0 || waterWeight <= 0) {
blinkRed();
alert();
} else if (foodWeight <= minFoodWeight || waterWeight <= minWaterWeight) {
setColor(RED_COLOR);
} else {
setColor(GREEN_COLOR);
}
controlFeedingMechanism();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Nem: ");
display.print(humidity);
display.print(" %");
display.setCursor(0, 10);
display.print("Sıcaklık: ");
display.print(temperature);
display.print(" C");
display.setCursor(0, 20);
display.print("Mama Ağırlığı: ");
display.print(foodWeight);
display.println(" gram");
display.setCursor(0, 30);
display.print("Su Ağırlığı: ");
display.print(waterWeight);
display.println(" gram");
display.display();
writeDataToSD(humidity, temperature, foodWeight, waterWeight);
digitalWrite(ledPin, LOW);
delay(2000);
}
void setColor(int color) {
analogWrite(redPin, (color >> 16) & 0xFF);
analogWrite(greenPin, (color >> 8) & 0xFF);
analogWrite(bluePin, color & 0xFF);
}
void alert() {
tone(buzzerPin, 1000, 1000);
delay(1000);
noTone(buzzerPin);
}
void controlFeedingMechanism() {
servo.write(0);
delay(1000);
servo.write(90);
delay(1000);
}
void blinkRed() {
for (int i = 0; i < 5; i++) { // LED 5 kez yanıp söner
digitalWrite(redPin, HIGH);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
delay(500);
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
delay(500);
}
}
void writeDataToSD(float humidity, float temperature, float foodWeight, float waterWeight) {
dataFile = SD.open("data.txt", FILE_WRITE);
if (dataFile) {
dataFile.print("Nem: ");
dataFile.print(humidity);
dataFile.print(" %\t");
dataFile.print("Sıcaklık: ");
dataFile.print(temperature);
dataFile.println(" °C");
dataFile.print("Mama Ağırlığı: ");
dataFile.print(foodWeight);
dataFile.println(" gram");
dataFile.print("Su Ağırlığı: ");
dataFile.print(waterWeight);
dataFile.println(" gram");
dataFile.close();
} else {
Serial.println("Veri dosyası açılamadı!");
}
}