Untitled
unknown
plain_text
a year ago
4.7 kB
11
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