Загрузка данных
// Подключаем необходимые библиотеки
#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); // Читаем температуру раз в секунду
}