Не могу создать задержку отключения вентилятора

#include <U8glib.h> // подключение библиотеки для дисплея
U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI // инициализация дисплея
#include <OneWire.h> // подключение  датчика 
#include <DallasTemperature.h> // подключение библиотеки для преобразования температуры

#define relay_pin1  9   // реле обогревателя
#define relay_pin2  10   // реле вентилятора


#define ONE_WIRE_BUS 2 // пин 2 к которому подключен датчик

uint32_t pausa;
bool f_pausa = 0;
bool r_status = 0;

OneWire oneWire(ONE_WIRE_BUS);  // настройка объекта oneWire для связи с любым устройством OneWire
DallasTemperature sensors(&oneWire);// передать ссылку на oneWire библиотеке DallasTemperature

void draw(void) { // настрока дисплея
  u8g.setFont(u8g_font_gdr30);
  u8g.setPrintPos(20, 31);
  u8g.print(sensors.getTempCByIndex(0));
}
void setup(void) {
  sensors.begin();  // запустить библиотеку
  Serial.begin(9600);
  pinMode(relay_pin1, OUTPUT);      // устанавливает режим работы - выход
  pinMode(relay_pin2, OUTPUT);      // устанавливает режим работы - выход
  
  digitalWrite(relay_pin1, LOW);  // устанавливаем в выключенное положение
  digitalWrite(relay_pin2, LOW);  // устанавливаем в выключенное положение
  
}

void loop(void) {
  sensors.requestTemperatures();  // отправить команду для получения температуры
  Serial.println(sensors.getTempCByIndex(0)); // напечатать температуру в градусах Цельсия
  u8g.firstPage();
  do {
    draw();
  } while ( u8g.nextPage() );

  if (sensors.getTempCByIndex(0) >= 30 )
  {
     digitalWrite(relay_pin1, LOW); //выключить обогреватель
    if (f_pausa == 0) {
      f_pausa = 1;
      pausa = millis();
    }
   
    if (millis() - pausa >= 5000)
    {
      digitalWrite(relay_pin2, LOW); //выключить вентилятор
      f_pausa = 0;
      r_status = 0;
    }
  }

  if ((sensors.getTempCByIndex(0) <= 28 && r_status == 0)) {
   digitalWrite(relay_pin1, HIGH); //включить обогреватель
    digitalWrite(relay_pin2, HIGH); //включить вентилятор
    }
    r_status = 0;
    f_pausa = 0;

  }

подскажите, что не так я сделал. Логика проста- когда температура меньше 28 градусов включаются обогреватель и вентилятор. после 30 градусов обогреватель выключается сразу, а вентилятор с некоторой задержкой. у меня вентилятор вообще не отключается. все перерыл - никак.

Фигурную скобку из 57 строки перенеси в 50.
И в условие из 51 строки добавь проаерку флага f_pausa на равенство 1.

В 63 не r_status = 1; должно быть по задумке?

И в чём суть этого флага?

скобку перенес и сделал так - if (millis() - pausa >= 5000 && f_pausa == 1 ) - все равно не отключается

поменял r_status = 0 на r_status = 1 - без изменений.
это остатки -)) я уже второй день бьюсь

Тут надо правильно логику выставить в строках 43-57. Предлагаю использовать флаг r_status для определения момента работы обогревателя.

Еще строки 63 и 64 нужно перенести выше скобки в 62 строке

1 лайк

между строчками добавьте

delay(5000);//задерка 5 секунд))))))))))))))))))))))))))))))))))))))))))

это пауза при включении, а вот как при отключении, надо думать…

Жёстко. )) Но работать будет. Но зачем плохому учить. )

офигенное же использование, и нечего не плохому…

#include <OneWire.h>
#include <DallasTemperature.h>

// Пины для подключения датчика и реле
#define ONE_WIRE_BUS 2
#define HEATER_PIN 3
#define FAN_PIN 4

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(9600);
  sensors.begin();
  
  pinMode(HEATER_PIN, OUTPUT);
  pinMode(FAN_PIN, OUTPUT);
  
  // Изначально выключаем обогреватель и вентилятор
  digitalWrite(HEATER_PIN, LOW);
  digitalWrite(FAN_PIN, LOW);
}

void loop() {
  sensors.requestTemperatures(); // Запрос температуры
  float temperature = sensors.getTempCByIndex(0); // Получаем температуру в градусах Цельсия
  
  Serial.print("Температура: ");
  Serial.println(temperature);
  
  if (temperature < 28) {
    // Если температура меньше 28 градусов, включаем обогреватель и вентилятор
    digitalWrite(HEATER_PIN, HIGH);
    digitalWrite(FAN_PIN, HIGH);
  } 
  else if (temperature >= 30) {
    // Если температура 30 градусов и выше, выключаем обогреватель сразу
    digitalWrite(HEATER_PIN, LOW);
    
    // Выключаем вентилятор с задержкой 5 секунд
    delay(5000);
    digitalWrite(FAN_PIN, LOW);
  }
  
  delay(1000); // Задержка перед следующим считыванием температуры
}

{digitalWrite(relay_pin1, LOW); //выключить обогреватель
r_status = 1;}
if (millis() - pausa >= 5000 && r_status == 1 ) - без измененй

меня не устраивает delay, будет минуту висеть программа

Это правильный подход к делу.
Последний, полный код покажи, а то непонятно, что и как там исправлено.

1 лайк

по-моему перенос r_status = 0; f_pausa = 0; выше скобки решил проблему-))) сейчас тестирую

#include <U8glib.h> // подключение библиотеки для дисплея
U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI // инициализация дисплея
#include <OneWire.h> // подключение  датчика 
#include <DallasTemperature.h> // подключение библиотеки для преобразования температуры

#define relay_pin1  9   // реле обогревателя
#define relay_pin2  10   // реле вентилятора


#define ONE_WIRE_BUS 2 // пин 2 к которому подключен датчик

uint32_t pausa;
bool f_pausa = 0;
bool r_status = 0;

OneWire oneWire(ONE_WIRE_BUS);  // настройка объекта oneWire для связи с любым устройством OneWire
DallasTemperature sensors(&oneWire);// передать ссылку на oneWire библиотеке DallasTemperature

void draw(void) { // настрока дисплея
  u8g.setFont(u8g_font_gdr30);
  u8g.setPrintPos(20, 31);
  u8g.print(sensors.getTempCByIndex(0));
}
void setup(void) {
  sensors.begin();  // запустить библиотеку
  Serial.begin(9600);
  pinMode(relay_pin1, OUTPUT);      // устанавливает режим работы - выход
  pinMode(relay_pin2, OUTPUT);      // устанавливает режим работы - выход
  
  digitalWrite(relay_pin1, LOW);  // устанавливаем в выключенное положение
  digitalWrite(relay_pin2, LOW);  // устанавливаем в выключенное положение
  
}

void loop(void) {
  sensors.requestTemperatures();  // отправить команду для получения температуры
  Serial.println(sensors.getTempCByIndex(0)); // напечатать температуру в градусах Цельсия
  u8g.firstPage();
  do {
    draw();
  } while ( u8g.nextPage() );

  if (sensors.getTempCByIndex(0) >= 30 )
  {
     {digitalWrite(relay_pin1, LOW); //выключить обогреватель
     r_status = 1;}
    if (f_pausa == 0) {
      f_pausa = 1;
      pausa = millis();
    }
  }
    if (millis() - pausa >= 5000 && r_status == 1 )
    {
      digitalWrite(relay_pin2, LOW); //выключить вентилятор
      f_pausa = 0;
      r_status = 0;
    }
  

  if ((sensors.getTempCByIndex(0) <= 28 && r_status == 0)) {
   digitalWrite(relay_pin1, HIGH); //включить обогреватель
    digitalWrite(relay_pin2, HIGH); //включить вентилятор
    r_status = 0;
    f_pausa = 0;
    }
    //r_status = 0;
    // f_pausa = 0;

  }

спасибо, nibelung :+1:

В 52 строке замени r_status на f_pausa, по логике это более правильно

:laughing:

// Управление обогревателем
if (temperature < 28) {
digitalWrite(heaterPin, HIGH); // Включаем обогреватель
} else {
digitalWrite(heaterPin, LOW); // Выключаем обогреватель
}
// Управление вентилятором
if (temperature > 30) {
if (fanOn) {
// Если вентилятор включен, устанавливаем задержку
if (millis() - fanDelay >= 5000) {
digitalWrite(fanPin, LOW); // Выключаем вентилятор
fanOn = false; // Обновляем состояние вентилятора
}
} else if (temperature > 28) {
if (!fanOn) {
digitalWrite(fanPin, HIGH); // Включаем вентилятор
fanOn = true; // Обновляем состояние вентилятора
fanDelay = millis(); // Запоминаем время включения вентилятора
}
1 лайк

супер ! Спасибо большое, сейчас переделаю