Суть:
При достижении высокой температуры в одном из двух левых датчиков начинали крутиться сервоприводы. Но они прокрутятся только с одной стороны, если на правом датчике (помечен черным) будет тоже высокая темп. В тинкеркаде все работает, но есть вопросы к сборке в жизни.
1. как подключать регулятор напряжения (модель LM2596S) уже спаяли, но к каким пинам подключать не знаем. 2. Все остальное на фото делать как в тинкеркаде, или надо добавлять чтото при сборке в жизни? 3. самое сложное. как нам сделать нагревательный резистор на плате?
Вот код:
#include <Servo.h>
Servo servo1, servo2, servo3, servo4;
int servoPins[4] = {8, 9, 10, 11};
int heaterPin = 3;
int tempSystPin = A0; // датчик 1: темп системы
int tempWarnPin = A1; // датчик 2: от опасности (парник)
int tempSunPin = A2; // датчик 3: внешняя темп
float tempSyst, tempWarn, tempSun;
int currentAngle = 0;
int targetAngle = 0;
void setup() {
Serial.begin(9600);
servo1.attach(servoPins[0]);
servo2.attach(servoPins[1]);
servo3.attach(servoPins[2]);
servo4.attach(servoPins[3]);
pinMode(heaterPin, OUTPUT);
digitalWrite(heaterPin, LOW);
delay(1000);
}
//для всех серво
void openAllLouvers() {
servo2.write(45);
servo3.write(45);
servo1.write(45);
servo4.write(45);
}
void closeAllLouvers() {
servo2.write(0);
servo3.write(0);
servo1.write(0);
servo4.write(0);
}
//для половины серво
void open14Louvers() {
servo1.write(45);
servo4.write(45);
}
void close14Louvers() {
servo1.write(0);
servo4.write(0);
}
void loop() {
tempSyst = readTemperature(tempSystPin);
tempWarn = readTemperature(tempWarnPin);
tempSun = readTemperature(tempSunPin);
Serial.print("System: ");
Serial.print(tempSyst);
Serial.print("°C | Warn: ");
Serial.print(tempWarn);
Serial.print("°C | Sun: ");
Serial.print(tempSun);
Serial.println("°C");
// 1 функция: от перегрева системы
if (tempSyst > 30.0) {
if (tempWarn < tempSyst) {
// темп опасности нет - открыть
openAllLouvers();
digitalWrite(heaterPin, LOW);
Serial.println("COOLING: Opening louvers");
} else {
// снаружи жарко - открыть безопасную створку
closeAllLouvers();
open14Louvers();
digitalWrite(heaterPin, LOW);
Serial.println("OVERHEAT PROTECTION: Closing louvers");
}
}
// 1 функция: от внешнего перегрева
else if (tempSun > 30.0) {
if (tempWarn < tempSun) {
// темп опасности нет - открыть
openAllLouvers();
digitalWrite(heaterPin, LOW);
Serial.println("COOLING: Opening louvers");
} else {
// парниковая опасность - открыть безопасную
closeAllLouvers();
open14Louvers();
digitalWrite(heaterPin, LOW);
Serial.println("OVERHEAT PROTECTION: Closing louvers");
}
//холодно внутри
}
else if (tempSyst < 30.0 and tempSun < 30.0) {
closeAllLouvers();
digitalWrite(heaterPin, HIGH);
Serial.println("HEATING: Closing louvers + heater ON");
}
else {
// Нормальная температура
closeAllLouvers();
digitalWrite(heaterPin, LOW);
Serial.println("NORMAL: Maintaining temperature");
}
delay(2000);
}
// функция для TMP36
float readTemperature(int pin) {
int sensorValue = analogRead(pin);
float voltage = sensorValue * (5.0 / 1024.0);
return (voltage - 0.5) * 100.0;
// плавное движение?
void smoothMoveServos(int angle) {
targetAngle = angle;
while (currentAngle != targetAngle) {
if (currentAngle < targetAngle) {
currentAngle++;
} else {
currentAngle--;
}
servo1.write(currentAngle);
servo2.write(currentAngle);
servo3.write(currentAngle);
servo4.write(currentAngle);
delay(15); // Задержка для плавности?
}
}