Загрузка данных


#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);
}