// Подключение необходимых библиотек #include // Библиотека для работы с интерфейсом 1-Wire #include // Библиотека для работы с I2C #include // Библиотека для работы с датчиками DS18B20 #include // Библиотека для работы с OLED дисплеем // Инициализация OLED дисплея с адресом 0x78 на шине I2C iarduino_OLED_txt myOLED(0x78); // Подключение русского шрифта для дисплея extern const uint8_t SmallFontRus[]; // Настройка шины 1-Wire для датчиков DS18B20 (пин 10 Arduino) #define ONE_WIRE_BUS 10 OneWire oneWire(ONE_WIRE_BUS); // Создание объекта 1-Wire DallasTemperature sensors(&oneWire); // Связь с библиотекой DallasTemperature // Константы и переменные для работы с датчиками const float TEMP_THRESHOLD = 27.0; // Порог температуры для нумерации датчиков DeviceAddress tempSensors[16]; // ***Массив для хранения адресов датчиков int totalSensors = 0; // Общее количество найденных датчиков int numberedSensors = 0; // Количество пронумерованных датчиков bool isNumbered[16] = {false}; // ***Флаги нумерации для каждого датчика // *** - при изменении количества датчиков меняем эти значения // Функция записи номера в память датчика void writeStoredNumber(DeviceAddress addr, int number) { sensors.setHighAlarmTemp(addr, number); // Запись номера в регистр верхнего тревожного порога sensors.saveScratchPad(addr); // Сохранение изменений в энергонезависимую память датчика } // Функция вывода адреса датчика в последовательный порт void printAddress(DeviceAddress addr) { for (uint8_t i = 0; i < 8; i++) { if (addr[i] < 16) Serial.print("0"); // Добавление ведущего нуля для байтов < 0x10 Serial.print(addr[i], HEX); // Вывод шестнадцатеричного значения байта } } // Функция обновления информации на OLED дисплее void updateDisplay() { myOLED.clrScr(); // Очистка экрана myOLED.print("Total: " + String(totalSensors), 0, 0); // Вывод общего количества датчиков myOLED.print("Active: " + String(numberedSensors), 0, 1); // Вывод количества активных датчиков } void setup() { Serial.begin(9600); // Инициализация последовательного порта // Настройка OLED дисплея myOLED.begin(); // Инициализация дисплея myOLED.setFont(SmallFontRus); // Установка русского шрифта Serial.println("System started"); // Стартовое сообщение в монитор порта // Инициализация датчиков температуры sensors.begin(); // Запуск работы с датчиками totalSensors = sensors.getDeviceCount(); // Получение количества подключенных датчиков Serial.print("Found sensors: "); Serial.println(totalSensors); // Вывод количества найденных датчиков // Поиск и вывод адресов всех датчиков for (int i = 0; i < totalSensors; i++) { if (sensors.getAddress(tempSensors[i], i)) { Serial.print("Sensor "); Serial.print(i + 1); Serial.print(": "); printAddress(tempSensors[i]); // Вывод адреса датчика Serial.println(); } } updateDisplay(); // Первоначальное обновление дисплея } void loop() { myOLED.invScr(); // Инверсия цветов дисплея (мигание) sensors.requestTemperatures(); // Запрос температуры со всех датчиков // Проверка температуры каждого датчика for (int i = 0; i < totalSensors; i++) { float temp = sensors.getTempC(tempSensors[i]); // Получение температуры // Если температура выше порога и датчик еще не нумерован if (temp != DEVICE_DISCONNECTED_C && temp > TEMP_THRESHOLD && !isNumbered[i]) { numberedSensors++; // Увеличение счетчика активных датчиков writeStoredNumber(tempSensors[i], numberedSensors); // Запись номера в датчик isNumbered[i] = true; // Помечаем датчик как нумерованный // Вывод информации в монитор порта Serial.print("Sensor "); printAddress(tempSensors[i]); Serial.print(" got #"); Serial.println(numberedSensors); updateDisplay(); // Обновление информации на дисплее } } delay(1000); // Пауза между измерениями (1 сек) }