C/C++

Подскажите как написать код для ардуино

Хочу сделать охлаждение в погреб, нужно включать вентилятор, когда на улице температура ниже 6 градусов, но чтобы в погребе не стала температура ниже 4 градусов. Я собрал схему из двух датчиков ds18b20, мосфета, ардуино нано и реле. Я пробовал сам делать но у меня не соблюдает одно из условий.
 #define delta 3 //разница между температурой включения и выключения
#defime pin_cooler 10 //пин на котором сидит реле.
bool start_flow = false; //управление вентилятором
void loop()
{
int tmp_out = get_tmp(); //опрос датчика внешней температуры
int tmp_in = get_tmp(); //опрос датчика температуры погреба
if (!start_flow) start_flow = tmp_in>4 + delta; //условие включения
else start_flow = tmp_in < 4; //условие выключения
digitalWrite(pin_cooler, start_flow&&tmp_out= 6) delay(600000); //если температура внешнего
датчика 6 или больше, пауза в 10 минут во избежании частых
включений/выклюний при температуре близкой к 6 градусам.
}
Простая программа такая.
get_tmp() - тут ваша функция получения температуры с датчика.
Разумеется предвидеть все хотелки (например вентилятор с управляемой частотой вращения, кнопки принудительного включения-выключния, учет огурцов в погребе), защиты и поведение при нештатных ситуациях - это сильно усложнит программу )
Роман Дорофеев
Роман Дорофеев
51 417
Лучший ответ
Сергей Першин Подскажите какие библиотеки использовать?
Роман Дорофеев статья о датчиках
https://kit.alexgyver.ru/tutorials/ds18b20/
кастомная библиотека от туда
https://github.com/GyverLibs/microDS18B20

 #include 
#define delta 3
#defime pin_cooler 10
bool start_flow = false;
MicroDS18B20 sensor1; //сенсор внешний на 2 пине
MicroDS18B20 sensor2; //сенсор внутренний на 3 пине
void setup()
{
pinMode(pin_cooler, OUTPUT);
}

void loop()
{
int tmp_out = get_tmp(1); //опрос датчика внешней температуры
int tmp_in = get_tmp(0); //опрос внутренней температуры
//далее код без изменений
}

int get_tmp(int pin)
{
int tmp;
if (pin) sensor1.requestTemp(); else sensor2.requestTemp();
delay(1000);
if (pin) tmp = sensor1.getTempInt(); else tmp = sensor2.getTempInt();
return tmp;
}
 #include  
#include

// Пины для подключения датчиков DS18B20
#define PIN_SENSOR_1 2
#define PIN_SENSOR_2 3

// Пин для управления реле (вентилятором)
#define PIN_RELAY 4

// Задаем минимальные и максимальные температуры
float minTemp = 4.0; // Минимальная температура в погребе
float maxTemp = 6.0; // Максимальная температура на улице

OneWire oneWire1(PIN_SENSOR_1);
OneWire oneWire2(PIN_SENSOR_2);
DallasTemperature sensors1(&oneWire1);
DallasTemperature sensors2(&oneWire2);

void setup() {
pinMode(PIN_RELAY, OUTPUT);
digitalWrite(PIN_RELAY, LOW); // Начинаем с выключенного состояния вентилятора
sensors1.begin();
sensors2.begin();
Serial.begin(9600);
}

void loop() {
sensors1.requestTemperatures();
sensors2.requestTemperatures();

float tempInside = sensors1.getTempCByIndex(0);
float tempOutside = sensors2.getTempCByIndex(0);

Serial.print("Temperature inside: ");
Serial.println(tempInside);
Serial.print("Temperature outside: ");
Serial.println(tempOutside);

// Проверяем условия и управляем вентилятором
if (tempOutside < maxTemp && tempInside > minTemp) {
digitalWrite(PIN_RELAY, HIGH); // Включаем вентилятор
} else {
digitalWrite(PIN_RELAY, LOW); // Выключаем вентилятор
}

delay(10000); // Пауза 10 секунд перед следующей итерацией
}
Шерзод Бердиев
Шерзод Бердиев
85 861
Сергей Першин Спасибо, всё работает
Сергей Першин после установки на место стало работать неправильно включается, когда на улице больше 6 градусов
Шерзод Бердиев ну поменяй условия внизу. Навскиду:


 void loop() {  
sensors1.requestTemperatures();
sensors2.requestTemperatures();

float tempInside = sensors1.getTempCByIndex(0);
float tempOutside = sensors2.getTempCByIndex(0);

Serial.print("Temperature inside: ");
Serial.println(tempInside);
Serial.print("Temperature outside: ");
Serial.println(tempOutside);

// Проверяем условия и управляем вентилятором
if (tempOutside < maxTemp && tempInside > minTemp) {
digitalWrite(PIN_RELAY, HIGH); // Включаем вентилятор
} else {
digitalWrite(PIN_RELAY, LOW); // Выключаем вентилятор
}

delay(10000); // Пауза 10 секунд перед следующей итерацией
}
Сергей Першин Я менял, но ему вообще без разницы. Он включается 10 секунд работает потом 10 секунд не работает, не важно какая температура на улице