Управление реле с задержкой по времени

Ghost33
Offline
Зарегистрирован: 07.01.2018

Ддоброго времени всем. Помогите разобраться как управлять 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);
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Избавица надо от delay();

Ghost33
Offline
Зарегистрирован: 07.01.2018

DetSimen пишет:

Избавица надо от delay();

Хорошо. Проблема еще в том что нужно первых два реле включить через 15 сек, а третье через 30 сек. не понимаю как это сделать. Подохреваю что через переменную?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ghost33 пишет:
не понимаю как это сделать.
Автоматом. См. отсюда, там далее по теме есть полный пример построения.

Ghost33
Offline
Зарегистрирован: 07.01.2018

ЕвгенийП пишет:

Ghost33 пишет:
не понимаю как это сделать.
Автоматом. См. отсюда, там далее по теме есть полный пример построения.

Ого! спасибо. я то думал все проще через while это делается. Типо условие выполнения и задержка по времени 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуйте так

#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;

  }
}

 

Ghost33
Offline
Зарегистрирован: 07.01.2018

vosara пишет:

Попробуйте так

Да, спасибо огромное! все работает как надо! И как я сам не додумался насчет паузы? искал же задержки в кодах. Где можно об этом почитать?

Спасибо еще раз!!!!

b707
Offline
Зарегистрирован: 26.05.2017

Ghost33 пишет:

 И как я сам не додумался насчет паузы?

тебя это удивляет? :)

Ghost33
Offline
Зарегистрирован: 07.01.2018

Товарищи, подскажите как добавить энкодер, для полчения возможности изменения  числа включения кол-ва реле и времени включения, установки температуры?

sadman41
Offline
Зарегистрирован: 19.10.2016

Дописать в код ещё три раза по столько же строк, сколько в нем сейчас.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Ghost33 пишет:

Товарищи, подскажите как добавить энкодер, для полчения возможности изменения  числа включения кол-ва реле и времени включения, установки температуры?

Легко! Изучить энкодер или использовать готовые подпрограммы под него.

Ghost33
Offline
Зарегистрирован: 07.01.2018

а более дельные советы? примеры?

Ghost33
Offline
Зарегистрирован: 07.01.2018

Ты думаешь я так на абум пишу? я наверное пробую сам сначала, потом уже спрашиваю тех кто понимает в этом.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, и что Вы там напробовали сначала?

Ghost33
Offline
Зарегистрирован: 07.01.2018

Я пробовал как на видео АлексГайвер делает, но мне не совсем нравится использование его библиотеки. И как бы изменить шрифт когда входишь в меню редактирования.

Как обойтись без библиотеки мне пока не понятно

b707
Offline
Зарегистрирован: 26.05.2017

Вы когда научитесь сами библиотеки писать - тогда будете пробовать без них. А пока не умеете - делайте с библиотеками

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Энкодер - это всего только 3 кнопки.

3 прерывания ... и всё.

Какие, в шопу, библиотеки? Нахера?

У некоторых атмег - энкодер является штатной функцией.

Ghost33
Offline
Зарегистрирован: 07.01.2018

ну если можешь, понимаешь, подсказывай.