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


// Подключаем необходимые библиотеки
#include <OneWire.h>          // Для протокола 1-Wire
#include <DallasTemperature.h> // Для работы с DS18B20

// --- Настройки ---
// Пин, к которому подключен DQ датчика DS18B20
const int ONE_WIRE_BUS = 2;
// Пины для RGB светодиода (должны быть PWM ~)
const int R_PIN = 6; // Красный
const int G_PIN = 5; // Зеленый
const int B_PIN = 3; // Синий
// Пин для зуммера
const int BUZZER_PIN = 10;
// Пороги температуры для состояний
const float WARN_THRESHOLD = 30.0; // Градус Цельсия, выше -> WARN
const float ALARM_THRESHOLD = 50.0; // Градус Цельсия, выше -> ALARM
// Частота зуммера при тревоге
const int ALARM_FREQ = 2500; // Гц

// --- Объекты ---
// Создаем объект OneWire для общения по шине
OneWire oneWire(ONE_WIRE_BUS);
// Передаем ссылку на OneWire в библиотеку DallasTemperature
DallasTemperature sensors(&oneWire);

// --- Переменные ---
float currentTemperature = 0.0; // Текущая температура
// Определяем состояния системы для удобства
enum SystemState { OK, WARN, ALARM };
SystemState currentState = OK; // Начальное состояние

void setup() {
  Serial.begin(9600); // Инициализируем Serial для вывода информации
  Serial.println("DS18B20 RGB Alarm (No LCD) Initializing...");

  // Инициализация датчика DS18B20
  sensors.begin();
  Serial.println("DallasTemperature sensor initialized.");

  // Настройка пинов RGB и зуммера как выходы
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);

  // Устанавливаем начальное состояние индикатора
  setIndicator(OK);
  Serial.println("System Status: OK");
}
// --- Функция для установки цвета RGB и управления зуммером ---
void setIndicator(SystemState state) {
  switch (state) {
    case OK:
      // Зеленый цвет (Яркость 255)
      analogWrite(R_PIN, 0);
      analogWrite(G_PIN, 255);
      analogWrite(B_PIN, 0);
      noTone(BUZZER_PIN); // Зуммер выключен
      break;
    case WARN:
      // Желтый цвет (Смешиваем Красный и Зеленый)
      analogWrite(R_PIN, 255);
      analogWrite(G_PIN, 150); // Уменьшим зеленый для более желтого оттенка
      analogWrite(B_PIN, 0);
      noTone(BUZZER_PIN); // Зуммер выключен
      break;
    case ALARM:
      // Красный цвет
      analogWrite(R_PIN, 255);
      analogWrite(G_PIN, 0);
      analogWrite(B_PIN, 0);
      tone(BUZZER_PIN, ALARM_FREQ); // Включаем зуммер (постоянный тон)
      // Для прерывистого - нужна логика с millis()
      break;
  }
}

void loop() {
  // 1. Запрашиваем измерение температуры у датчика
  sensors.requestTemperatures();

  // 2. Получаем температуру в градусах Цельсия
  // Используем getTempCByIndex(0), так как у нас один датчик на шине (индекс 0)
  currentTemperature = sensors.getTempCByIndex(0);

  // 3. Проверяем на ошибку чтения
  if (currentTemperature == DEVICE_DISCONNECTED_C) {
    Serial.println("Error: Could not read temperature data!");
    setIndicator(ALARM); // Включаем тревогу при ошибке датчика
    Serial.println("System Status: SENSOR ERROR -> ALARM");
  } else {
    // 4. Ошибки нет, выводим температуру
    Serial.print("Temperature: ");
    Serial.print(currentTemperature);
    Serial.print(" *C"); // Выводим градусы Цельсия

    // 5. Определяем состояние системы и обновляем индикатор
    SystemState previousState = currentState; // Запоминаем предыдущее состояние

    if (currentTemperature >= ALARM_THRESHOLD) {
      currentState = ALARM;
      Serial.print(" -> Status: ALARM!");
    } else if (currentTemperature >= WARN_THRESHOLD) {
      currentState = WARN;
       Serial.print(" -> Status: WARN");
    } else {
      currentState = OK;
       Serial.print(" -> Status: OK");
    }
    Serial.println(); // Перевод строки в мониторе

    // Обновляем индикатор, только если состояние изменилось (чтобы не спамить Serial)
    if (currentState != previousState) {
       setIndicator(currentState);
    }
  }

  // Задержка перед следующим измерением
  delay(1000); // Читаем температуру раз в секунду
}