#include <math.h> // Подключаем библиотеку для математических функций
#include <Servo.h>
const int tempPin = A0; // Пин термистора
const int ledPin = 13; // Пин светодиода
const float BETA = 3950; // Бета-коэффициент термистора
const float R0 = 10000; // Сопротивление термистора при 25°C (в Ом)
const int ldrPin = A1; // Пин фоторезистора
const int ledPin2 = 12; // Пин второго светодиода
int ldrValue = 0; // Переменная для хранения значения освещенности
const float GAMMA = 0.7;
const float RL10 = 50;
#define PIN_TRIG 3
#define PIN_ECHO 2
const int ledPin3 = 11; // Пин третьего светодиода
const int servoPin = 9; // Пин, к которому подключен сервомотор
Servo myServo;
void setup() {
pinMode(ledPin, OUTPUT); // Настройка пина светодиода как выхода
pinMode(ledPin2, OUTPUT); // Настройка пина второго светодиода как выхода
pinMode(ledPin3, OUTPUT);
Serial.begin(9600); // Инициализация серийного порта
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
myServo.attach(servoPin);
}
void loop() {
int analogValue = analogRead(tempPin); // Считываем данные с термистора
// Расчет сопротивления термистора
float resistance = R0 * (1023.0 / analogValue - 1);
// Расчет температуры в Кельвинах
float temperatureK = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15);
// Преобразование температуры из Кельвинов в Цельсии
float temperatureC = temperatureK - 273.15;
Serial.print("Temperature: ");
Serial.print(temperatureC);
Serial.println(" °C");
// Управление светодиодом в зависимости от температуры
if (temperatureC > 25) { // Если температура выше 25°C
digitalWrite(ledPin, HIGH); // Включаем светодиод
} else {
digitalWrite(ledPin, LOW); // Выключаем светодиод
}
delay(1000); // Задержка 1 секунда
ldrValue = analogRead(ldrPin); // Чтение значения с фоторезистора
float voltage = ldrValue / 1024. * 5;
float resistance1 = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance1, (1 / GAMMA));
Serial.print("LDR Value: ");
Serial.print(lux);
Serial.println(" lux");
if (lux < 500) { // Если освещенность ниже порогового значения
digitalWrite(ledPin2, HIGH); // Включаем второй светодиод
} else {
digitalWrite(ledPin2, LOW); // Выключаем второй светодиод
}
delay(1000); // Задержка 1 секунда
// Start a new measurement:
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
// Read the result:
int duration = pulseIn(PIN_ECHO, HIGH);
int totalres = duration / 58;
Serial.print("Distance: ");
Serial.print(totalres);
Serial.println(" m");
if (totalres > 200) { // Если растояни больше 350
digitalWrite(ledPin3, HIGH); // Включаем второй светодиод
} else {
digitalWrite(ledPin3, LOW); // Выключаем второй светодиод
}
delay(1000);
if (lux < 300) { // Темно
myServo.write(0); // Сервомотор в минимальное положение (0 градусов)
} else if (lux >= 300 && lux <= 600) { // Среднее освещение
myServo.write(45); // Сервомотор в положение (45 градусов)
} else { // Светло
myServo.write(180); // Сервомотор в максимальное положение (180 градусов)
}
delay(1000); // Задержка для того, чтобы сервомотор успел повернуться
}