#include <Wire.h>
#include <DHT.h>
#include <Stepper.h>
#define SLAVE_ADDR 8
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const int LED_GREEN = 4;
const int LED_YELLOW = 5;
const int LED_RED = 6;
const int RELAY_PIN = 12;
const int WATER_PIN = A1; // HW-038 су датчигі (AO)
const int WATER_THRESHOLD = 500; // калибрлеу керек: Serial Monitor-дан мәнді көріп реттеңіз
const int STEPS_PER_REV = 2048;
Stepper myStepper(STEPS_PER_REV, 8, 10, 9, 11);
volatile bool systemActive = false;
int lastTemp = 0;
int lastHum = 0;
unsigned long lastRead = 0;
const unsigned long readInterval = 2000;
void setup() {
Serial.begin(9600);
Wire.begin(SLAVE_ADDR);
Wire.onReceive(receiveFromMaster);
Wire.onRequest(sendToMaster);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(WATER_PIN, INPUT);
dht.begin();
myStepper.setSpeed(10);
idleState();
Serial.println(F("Slave dayyn. Master komanda bergende iske kosyladi."));
}
void loop() {
if (systemActive) {
checkWaterSensor(); // реле тек осыған бағынады — ылғи тексеріледі
if (millis() - lastRead > readInterval) {
lastRead = millis();
updateClimate(); // тек LED пен step motor-ды баскарады
}
} else {
idleState();
}
delay(20);
}
void idleState() {
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_RED, LOW);
digitalWrite(RELAY_PIN, LOW);
}
// ---------------- СУ ДАТЧИГІ -> РЕЛЕ ----------------
void checkWaterSensor() {
int waterValue = analogRead(WATER_PIN);
if (waterValue > WATER_THRESHOLD) {
// Су тиіп тур
digitalWrite(RELAY_PIN, LOW); // реле ошеди
} else {
// Кургак
digitalWrite(RELAY_PIN, HIGH); // реле косулы турады
}
}
// ---------------- КЛИМАТ (тек LED + step motor) ----------------
void updateClimate() {
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
Serial.println(F("DHT11 kate! Kabeldi tekseriniz."));
return;
}
lastTemp = (int)t;
lastHum = (int)h;
if (t < 22) {
setLeds(true, false, false);
} else if (t < 27) {
setLeds(false, true, false);
} else {
setLeds(false, false, true);
myStepper.step(STEPS_PER_REV / 8); // желдету козгалысын эмуляциялайды
}
Serial.print(F("Temp: ")); Serial.print(t);
Serial.print(F(" C, Hum: ")); Serial.print(h);
Serial.println(F(" %"));
}
void setLeds(bool g, bool y, bool r) {
digitalWrite(LED_GREEN, g);
digitalWrite(LED_YELLOW, y);
digitalWrite(LED_RED, r);
}
void receiveFromMaster(int numBytes) {
if (Wire.available()) {
int cmd = Wire.read();
systemActive = (cmd == 1);
}
}
void sendToMaster() {
Wire.write((byte)lastTemp);
Wire.write((byte)lastHum);
}