#include <OneWire.h>
#include <DallasTemperature.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// Пин, к которому подключен датчик DS18B20
const int oneWireBus = 2; // Используйте тот пин, который вы выбрали
OneWire oneWire(oneWireBus);
DallasTemperature sensors(&oneWire);
// Пины для DHT22
const int dhtPin = 3; // Подключен к DHT22 DATA
DHT dht(dhtPin, DHT22); // Инициализация объекта DHT
// Пин для фоторезистора
const int photoresistorPin = A0; // Подключен к фоторезистору
// Пины для RGB светодиода
const int redPin = 11; // Пин для красного цвета
const int greenPin = 10; // Пин для зеленого цвета
const int bluePin = 9; // Пин для синего цвета
const int redLED = 5; // Пин для красного LED светодиода
const int blueLED = 6; // Пин для синего LED светодиода
// Глобальные переменные для случайных шумов
float randomNoiseDHT22 = 0.0;
float randomNoiseDS18B20 = 0.0;
float randomNoiseLight = 0.0; // Случайный шум для освещенности
Servo myServo; // Создаем экземпляр сервопривода
const int servoPin = 12; // Пин для подключения кормушки сервопривода
unsigned long lastFeedingTime = 0; // Время последнего кормления
const int buzzerPin = 7; // Подключение пьезопищалки (перед кормлением)
LiquidCrystal_I2C lcd(0x27, 20, 4); // Адрес 0x27, 20 символов в 4 строки
void setup() {
lcd.init();
lcd.backlight();
lcd.print("Loading the aquarium ... ");
delay(2000);
Serial.begin(9600);
sensors.begin();
dht.begin();
randomSeed(analogRead(0)); // Инициализируем генератор случайных чисел
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(blueLED, OUTPUT);
myServo.attach(servoPin); // wokwi-servo кормушка
pinMode(buzzerPin, OUTPUT); // Устанавливаем пин пьезопищалки как выход
}
void loop() {
unsigned long currentTime = millis();
// 43200000=12 часов в миллисекундах
if (currentTime - lastFeedingTime >= 10000) {
// Если прошло 30 секунд с последнего кормления, кормим рыбок
feedFish();
lastFeedingTime = currentTime;
}
sensors.requestTemperatures(); // Запрашиваем температуру DS18B20
float temperatureAquarium = sensors.getTempCByIndex(0); // Чтение температуры аквариума
// Добавляем случайный шум (-3°C до +3°C) к измеренной температуре DS18B20
randomNoiseDS18B20 = random(-30, 31) / 10.0;
temperatureAquarium += randomNoiseDS18B20;
// Измеряем температуру и влажность с DHT22
float temperatureSurroundings = dht.readTemperature();
float humidity = dht.readHumidity();
// Добавляем случайный шум (-7°C до +7°C) к измеренной температуре DHT22
randomNoiseDHT22 = random(-70, 71) / 10.0;
temperatureSurroundings += randomNoiseDHT22;
// Считываем освещенность с фоторезистора
int lightIntensity = analogRead(photoresistorPin);
// Добавляем случайный шум (-20 до +20) к измеренной освещенности
randomNoiseLight = random(-200, 201) / 10.0;
lightIntensity += randomNoiseLight;
// Управление RGB светодиодом в зависимости от освещенности
controlRGBLED(lightIntensity);
// Управление LED светодиодами в зависимости от температуры в аквариуме
controlTemperatureLEDs(temperatureAquarium);
// Вывод информации на LCD дисплей
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp Aquarium: ");
lcd.print(temperatureAquarium);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Temp Room: ");
lcd.print(temperatureSurroundings);
lcd.print(" C");
lcd.setCursor(0, 2);
lcd.print("Humidity: ");
lcd.print(humidity);
lcd.print(" %");
lcd.setCursor(0, 3);
lcd.print("Light: ");
lcd.print(lightIntensity);
// Вывод информации в Serial Monitor
Serial.print("Температура аквариума: ");
Serial.print(temperatureAquarium);
Serial.println(" °C");
Serial.print("Температура вокруг аквариума: ");
Serial.print(temperatureSurroundings);
Serial.println(" °C");
Serial.print("Влажность вокруг аквариума: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Освещенность: ");
Serial.println(lightIntensity);
delay(3000); // Задержка в 3 секунды между измерениями
}
void controlRGBLED(int lightIntensity) {
// Используйте аналоговую модуляцию ширины импульсов (PWM) для управления цветом
// Пример: если освещенность ниже порогового значения, включаем синий и красный цвета
if (lightIntensity < 300) {
analogWrite(redPin, 255); // Включаем красный цвет
analogWrite(greenPin, 0); // Выключаем зеленый цвет
analogWrite(bluePin, 255); // Включаем синий цвет
} else {
// В противном случае, включаем зеленый и красный цвета
analogWrite(redPin, 255); // Включаем красный цвет
analogWrite(greenPin, 255); // Включаем зеленый цвет
analogWrite(bluePin, 0); // Выключаем синий цвет
}
}
void controlTemperatureLEDs(float temperature) {
// Управление LED светодиодами в зависимости от температуры
if (temperature < 23.0) {
digitalWrite(redLED, LOW); // Выключаем красный светодиод (холодно)
digitalWrite(blueLED, HIGH); // Включаем синий светодиод
} else if (temperature >= 23.0 && temperature <= 28.0) {
digitalWrite(redLED, LOW); // Выключаем красный светодиод
digitalWrite(blueLED, LOW); // Выключаем синий светодиод
} else {
digitalWrite(redLED, HIGH); // Включаем красный светодиод
digitalWrite(blueLED, LOW); // Выключаем синий светодиод (жарко)
}
}
void feedFish() {
// Пищим пьезопищалкой при кормлении
tone(buzzerPin, 1000); // Воспроизводим звук на частоте 1000 Гц
delay(1000); // Звучим в течение 1 секунды
noTone(buzzerPin); // Отключаем пьезопищалку
myServo.write(90); // Поворачиваем сервопривод, чтобы открыть кормушку
delay(2000); // Ожидание 2 секунды
myServo.write(0); // Закрываем кормушку
}