Управление реле с задержкой по времени
- Войдите на сайт для отправки комментариев
Втр, 22/09/2020 - 12:49
Ддоброго времени всем. Помогите разобраться как управлять 3-мя реле с задержкой по времени включения от установленной температуры. Чтобы цикл показаний на дисплей не переставал выводить текущее показание температуры. В программировании новичек и прошу не пинать а подсказать по существу как и что делаю не правильно.
#include <U8glib.h> // подключение библиотеки для дисплея
U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI // инициализация дисплея
#include <OneWire.h> // подключение датчика
#include <DallasTemperature.h> // подключение библиотеки для преобразования температуры
#define relay_pin1 = 6 ; // реле подключенный к пину 6
#define relay_pin2 = 7 ; // реле подключенный к пину 7
#define relay_pin3 = 8 ; // реле подключенный к пину 7
#define ONE_WIRE_BUS 5 // пин 5 к которому подключен датчик
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); // устанавливает режим работы - выход
pinMode(relay_pin3, OUTPUT); // устанавливает режим работы - выход
digitalWrite(relay_pin1, LOW); // устанавливаем в выключенное положение
digitalWrite(relay_pin2, LOW); // устанавливаем в выключенное положение
digitalWrite(relay_pin3, LOW); // устанавливаем в выключенное положение
}
void loop(void){
sensors.requestTemperatures(); // отправить команду для получения температуры
Serial.println(sensors.getTempCByIndex(0)); // напечатать температуру в градусах Цельсия
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
while((sensors.getTempCByIndex(0) <= 30)){ // условие, температура меньше 30 сделать...
delay(15000); // задержка времени по включению
digitalWrite(relay_pin1, HIGH); //включить реле
digitalWrite(relay_pin2, HIGH); //включить реле
digitalWrite(relay_pin3, HIGH); //включить реле
break; // вернуться в цикл
}
// while((sensors.getTempCByIndex(0) >= 30)){
// digitalWrite(ledPin, LOW);
// }
// if((sensors.getTempCByIndex(0) <= 30)) // условие, если температуру меньше указанного значения то...
// digitalWrite(ledPin, HIGH); // строка деййствия условия
if((sensors.getTempCByIndex(0) >= 31)) // условие, если температуру меньше указанного значения то...
digitalWrite(ledPin, LOW); // строка деййствия условия
delay(500);
}
Избавица надо от delay();
Избавица надо от delay();
Хорошо. Проблема еще в том что нужно первых два реле включить через 15 сек, а третье через 30 сек. не понимаю как это сделать. Подохреваю что через переменную?
Ого! спасибо. я то думал все проще через while это делается. Типо условие выполнения и задержка по времени
Попробуйте так
#include <U8glib.h> // подключение библиотеки для дисплея U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI // инициализация дисплея #include <OneWire.h> // подключение датчика #include <DallasTemperature.h> // подключение библиотеки для преобразования температуры #define relay_pin1 6 // реле подключенный к пину 6 #define relay_pin2 7 // реле подключенный к пину 7 #define relay_pin3 8 // реле подключенный к пину 7 #define ledPin 2 #define ONE_WIRE_BUS 5 // пин 5 к которому подключен датчик 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); // устанавливает режим работы - выход pinMode(relay_pin3, OUTPUT); // устанавливает режим работы - выход pinMode(ledPin, OUTPUT); digitalWrite(relay_pin1, LOW); // устанавливаем в выключенное положение digitalWrite(relay_pin2, LOW); // устанавливаем в выключенное положение digitalWrite(relay_pin3, LOW); // устанавливаем в выключенное положение } void loop(void) { sensors.requestTemperatures(); // отправить команду для получения температуры Serial.println(sensors.getTempCByIndex(0)); // напечатать температуру в градусах Цельсия u8g.firstPage(); do { draw(); } while ( u8g.nextPage() ); if (sensors.getTempCByIndex(0) <= 30 && r_status == 0) { if (f_pausa == 0) { f_pausa = 1; pausa = millis(); } if (millis() - pausa >= 15000) { digitalWrite(relay_pin1, HIGH); //включить реле } if (millis() - pausa >= 30000) { digitalWrite(relay_pin3, HIGH); //включить реле f_pausa = 0; r_status = 1; } } if ((sensors.getTempCByIndex(0) >= 31)) { digitalWrite(ledPin, HIGH); r_status = 0; f_pausa = 0; } }Попробуйте так
Да, спасибо огромное! все работает как надо! И как я сам не додумался насчет паузы? искал же задержки в кодах. Где можно об этом почитать?
Спасибо еще раз!!!!
И как я сам не додумался насчет паузы?
тебя это удивляет? :)
Товарищи, подскажите как добавить энкодер, для полчения возможности изменения числа включения кол-ва реле и времени включения, установки температуры?
Дописать в код ещё три раза по столько же строк, сколько в нем сейчас.
Товарищи, подскажите как добавить энкодер, для полчения возможности изменения числа включения кол-ва реле и времени включения, установки температуры?
Легко! Изучить энкодер или использовать готовые подпрограммы под него.
а более дельные советы? примеры?
Ты думаешь я так на абум пишу? я наверное пробую сам сначала, потом уже спрашиваю тех кто понимает в этом.
Ну, и что Вы там напробовали сначала?
Я пробовал как на видео АлексГайвер делает, но мне не совсем нравится использование его библиотеки. И как бы изменить шрифт когда входишь в меню редактирования.
Как обойтись без библиотеки мне пока не понятно
Вы когда научитесь сами библиотеки писать - тогда будете пробовать без них. А пока не умеете - делайте с библиотеками
Энкодер - это всего только 3 кнопки.
3 прерывания ... и всё.
Какие, в шопу, библиотеки? Нахера?
У некоторых атмег - энкодер является штатной функцией.
ну если можешь, понимаешь, подсказывай.