#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 строке
между строчками добавьте
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, будет минуту висеть программа
Это правильный подход к делу.
Последний, полный код покажи, а то непонятно, что и как там исправлено.
по-моему перенос 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
В 52 строке замени r_status на f_pausa, по логике это более правильно
// Управление обогревателем
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(); // Запоминаем время включения вентилятора
}
супер ! Спасибо большое, сейчас переделаю