Untitled

 avatar
unknown
plain_text
6 months ago
4.7 kB
9
Indexable
#include <Wire.h>
// BME280
#include <Adafruit_BME280.h>
// OLED
#include <I2CLiquidCrystal.h>

// ------------------------------

// BME280
#define I2C_SCL 5
#define I2C_SDA 4
Adafruit_BME280 bme;

// OLED
#define I2C_ADDR 0x3c
#define BRIGHT 127
I2CLiquidCrystal oled(I2C_ADDR, (uint8_t)BRIGHT);

// Music
#define BEAT 300
#define PIN 10

#define DO 262
#define RE 294
#define MI 330
#define FA 349
#define SO 392
#define RA 440
#define SI 494
#define HDO 523

// ----------------------

// Timer
int counter = 0;

// Ultrasonic Sensor
int Trig = 8;
int Echo = 9;
int Duration;
float Distance;

// LED
int led = 7;

// مستشعر الرطوبة
int water_count = 0;

// Relay
int relay = 13;

void setup() {
  // BME280
  Serial.begin(9600);
  Wire.begin();
  
  if (!bme.begin(0x76)) {
      Serial.println("لم يتم العثور على مستشعر BME280 صالح، تحقق من الأسلاك!");
      while (1);
  }
  delay(100);

  // OLED
  oled.begin(16, 2);
  oled.display();
  oled.clear();
  oled.noBlink();
  oled.noCursor();
  oled.home();
  oled.print("انتظر بضع دقائق.");

  // Ultrasonic Sensor
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);

  // LED
  pinMode(led, OUTPUT);

  // Relay
  pinMode(relay, OUTPUT);
}

void loop() {
  
  // تحقق من درجة الحرارة والرطوبة ورطوبة التربة مرة كل دقيقة.
  if (counter == 1) {
    checkBME280();
    checkWater();
    checkMoisture();
  }

  delay(10000); // 10 ثواني
  counter++;
  
  if (counter >= 6) {
    counter = 0;
  }

  checkWater();
}

// BME280
void checkBME280() {
  // الحصول على البيانات من مستشعر BME280
  float t = bme.readTemperature(); // °C
  float h = bme.readHumidity(); // %
  float p = bme.readPressure() / 100.0F; // hPa
  
  Serial.print("درجة الحرارة: ");
  Serial.println(t);
  Serial.print("الرطوبة: ");
  Serial.println(h);
  Serial.print("الضغط: ");
  Serial.println(p);
  Serial.println();

  oled.setCursor(0, 0);
  oled.print(String(t) + "C  ");
  oled.print(String(h) + "%    ");
}

// Ultrasonic Sensor
void checkWater() {
  // تحقق من مستوى المياه في الدلو.
  digitalWrite(Trig, LOW);
  delayMicroseconds(1);
  digitalWrite(Trig, HIGH);
  delayMicroseconds(11);
  digitalWrite(Trig, LOW);
  
  Duration = pulseIn(Echo, HIGH);
  
  if (Duration > 0) {
    Distance = Duration / 2;
    Distance = Distance * 340 * 100 / 1000000; // سرعة الموجات فوق الصوتية 340 م/ث = 34000 سم/ث = 0.034 سم/ميكروثانية 
    Serial.print(Distance);
    Serial.println(" سم");
    
    if (Distance > 12) {
      digitalWrite(led, HIGH);
    } else {
      digitalWrite(led, LOW);
    }
  }
}

// مستشعر الرطوبة
void checkMoisture() {
  // قياس رطوبة التربة
  int moisture = analogRead(A0);
  Serial.print("قيمة مستشعر الرطوبة: ");
  Serial.println(moisture);
  
  oled.setCursor(0, 1);
  oled.print("الرطوبة: " + String(moisture) + "   ");
  
  if (moisture <= 300) {
    water_count++;
    if (water_count == 5) { // الانتظار حتى تمر المياه عبر الأصيص.
      watering();
      water_count = 0;
    }
  }
}

// الري
void watering() {
  digitalWrite(relay, HIGH);
  delay(2000);
  digitalWrite(relay, LOW);
  delay(8000);
  completeWatering();
  counter++; 
}

// الموسيقى
void completeWatering() {
  // دعهم يعرفون أن الري اكتمل.
  oled.setCursor(0, 0);
  oled.print("   شكرًا لك!   ");
  oled.setCursor(0, 1);
  oled.print("   (^ O ^)/     ");
  
  tone(PIN, DO, BEAT); // C
  delay(BEAT);
  tone(PIN, RE, BEAT); // D
  delay(BEAT);
  tone(PIN, MI, 1200); // E
  delay(BEAT);
  delay(BEAT);
  delay(BEAT);
  tone(PIN, RE, BEAT); // D
  delay(BEAT);
  tone(PIN, DO, BEAT); // C
  delay(BEAT);
  delay(BEAT);
  tone(PIN, DO, BEAT); // C
  delay(BEAT);
  tone(PIN, RE, BEAT); // D
  delay(BEAT);
  tone(PIN, MI, BEAT); // E
  delay(BEAT);
  tone(PIN, RE, BEAT); // D
  delay(BEAT);
  tone(PIN, DO, BEAT); // C
  delay(BEAT);
  tone(PIN, RE, 1200); // D
  delay(BEAT);
  delay(BEAT);
  delay(4400);
  
  counter++;
  oled.setCursor(0, 0);
  oled.print("                  ");
  oled.setCursor(0, 1);
  oled.print("                  ");
  checkBME280();
  
  int moisture = analogRead(A0);
  oled.setCursor(0, 1);
  oled.print("الرطوبة: " + String(moisture) + "   ");
}
Editor is loading...
Leave a Comment