Проблемы с работой 1канального 5в реле.

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

Приветствую вас форумчане.

Имею программу для работы реле от ардуины с термодатчиком. Реле управляется от кнопки(или емкостного датчика). Должно сработать и отключиться по таймеру через 3секунды.

[code]
/**
  * Термогигрометр на базе датчика SHT10 
   */
//Объявляем библиотеки
#include <SHT1x.h> 
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
//декларируем переменные для релюшки  с прерыванием
#define button 2    // кнопка или емкостной датчик приближения
#define relay  6    // реле 
volatile byte flag=0;
 unsigned long prevmillis;

// Датчика температуры и влажности 

#define dataPin  10 //желтый провод
#define clockPin 11 //голубой провод 
SHT1x sht1x(dataPin, clockPin);

LiquidCrystal_I2C lcd(0x3F,16,2);  // установка  LCD address to 0x3F for a 16 chars and 2 line display

void setup()
{
  
  lcd.init();  // Инициализируем lcd 
 
  // Печать приветствия на  LCD.
  lcd.backlight();
  lcd.print("TEMP and VLAZHN");
   lcd.setCursor(0, 1);
  lcd.print("TEPLICA ");
  delay(2000);
  lcd.clear();
  //режимы pin
 pinMode(button,INPUT_PULLUP);    // кнопка на вход  вкл.подтягивающий резистор. 
pinMode(relay,OUTPUT);           // реле 
attachInterrupt(0, my_func, FALLING); //прерывание на изменение логич. уровня
}

void loop()
{
  float temp_c;

 float humidity;
  
 // Читаем показания датчика SHT10
  temp_c = sht1x.readTemperatureC();
  humidity = sht1x.readHumidity();
  // Выводим данные на LCD
  lcd.setCursor(0, 0);
  lcd.print("Temperat: ");
  lcd.print(temp_c); 
  lcd.print("C  ");
  lcd.setCursor(0, 1);// вывод второй строки
  lcd.print("Vlazhnst: ");
  lcd.print(humidity);
  lcd.println("% ");
  
  
  if (1 == flag)
  { // если кнопку отпустили
    prevmillis = millis();
    digitalWrite(relay,LOW); //включаем реле
    flag = 2;
  }
  
  if (2 == flag)
  {
    if ( millis()-prevmillis >=3000)
    {   //если счёт 3 секунд вышел, то
      digitalWrite(relay,HIGH);   //закрываем окно
      flag=0; //сбрасываем флаг работы
    }
  }
}

void my_func() { //отжали
flag=1; //ставим флаг что работа идёт..
}


[/code]

При включении Ардуины реле щелкает контактами и через мгновение еще раз. Только после второго раза она выходит в ждущий режим. Как исключить это ложное срабатывание?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Я так понимаю, реле у Вас работает в инверсном режиме? Включается низким уровнем (LOW), выключается высоким (HIGH)?

Дело в том, что при включении ардуины на пинах по-умолчанию низкий уровень (LOW). Поэтому сразу после включения ардуины реле тоже включается не доходя даже до условия в void loop(). При инициализации надо принудительно установить высокий уровень (HIGH), тогда реле изначально будет выключено. Для этого добавьте в void setup() строку digitalWrite(relay,HIGH);

 

 
Andrey-S
Offline
Зарегистрирован: 02.01.2015

А в дальнейшем код вообще нормально работает?

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

Ставил сразу HIGH?  тогда вообще беспорядочно щелкало реле. Поставил LOW, - только два срабатывания

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

В общем да. От кнопки срабатывает, но с подтормаживанием

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

Ставил 4-х релейный шилд,  на ХАе роботало без проблем, когда поставил 1-канальное реле -  заморочки пошли

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Jeka_M пишет:

Я так понимаю, реле у Вас работает в инверсном режиме? Включается низким уровнем (LOW), выключается высоким (HIGH)?

А это предположение верно? Просто есть реле, которые включаются HIGH, а есть, который LOW... Если одноканальное реле антипод 4х-канального в этом случае, то все HIGH-LOW необходимо поменять местами)

Dasha2
Offline
Зарегистрирован: 27.06.2015

Реле срабатывает когда я in- цепляю на "-" 5,0в. От + она не срабатывает. Выходит надо на управление прописывать LOW

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Dasha2 пишет:

Реле срабатывает когда я in- цепляю на "-" 5,0в. От + она не срабатывает. Выходит надо на управление прописывать LOW

вы решили что если назваться женским именем, то все бросятся помогать? да нам тут пофигу, даже если вы с Марса...

Dasha2
Offline
Зарегистрирован: 27.06.2015

 Спасибо за совет! :)

У меня была такая же проблема

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

Не это моя помощница, тоже озадачена. Не надо на нее так строго

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

К тому же отвечале мне а не ей

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

использовать транзистор с открытым коллектором, им управлять реле.

 реле тогда можно (и даже нужно) использовать на 12в

на 5в использовать оченть не рекомендую - питание процессора должно быть качественным а не со всякими там висящими реле.

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

ЗЫ: никогда не использую реле на 5в и другим не советую.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Использую если надо и никогда не бывает никаких проблем.
 

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Short Circuit пишет:

 

ЗЫ: никогда не использую реле на 5в и другим не советую.

У меня два восьмиканальных 5В релейных модуля без проблем работают... Тут фишка в том, что не надо их питать от ардуинки... Китайский DC-DC преобразователь и на него всю "нагрузку" (реле, газоанализаторы и т.п.)... Мне это посоветовали месяца три или больше назад завсегдатаи форума и теперь никаких проблем с питанием не возникает))) trembo, Вроде бы, тоже тогда был одним из них)

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

У меня 4-х релейный шилд работает без проблем. С LOW в стендбае. Но когда поставил 1-канальное реле, там оказалось HIGH в режиме молчания. Вот это меня и сбило с толку. Не знал этого.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

вот именно, если 5В то стараются тулить на те же 5В что и проц, а этого категорически не следует делать. уно многие питают от внешних 12В БП.  и  реле на 12В везде как грязи,  и меньше ток потребляют. 

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

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

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

 

аргументирую: 5В тогда берут откуда?   верно - с юсб.  Там мало что само напряжение гуляет 4,5-5В, еще и реле будет на нем прыгать.

а если не с юсб а с отдельного бп, то в 5В от бп смысл пропадает. лучше брать 12В бп и не грузить 5вольтоую часть током более 50мА.

при питании всех реле и прочего от наример юсб(схорошим током, ток 4 или 8 шт реле 5вольтовых - посчитайте сколько) - можно наступить на грабли и долго ломать голову - почему же "глючит" программа. Давно отказался от такого рода граблей.

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

USB применяют только в режиме отладки. В готовом изделии всегда присутствует отдельный источник питания и как правило это 12V

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

Вячеслав 151 пишет:

USB применяют только в режиме отладки. В готовом изделии всегда присутствует отдельный источник питания и как правило это 12V

ну и... и 8 шт реле (ну или меньше) на 5в параллельно с процом? а смысл?

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Вячеслав 151 пишет:

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

Ну вот тут понятие "БОЛЬШИЕ ПРОЕКТЫ" весьма относительные я считаю... МЕГА при грамотном коде зафигачивает довольно-таки неплохие штуки... А по поводу 12В реле я от части согласен - это всегда меньший ток... Но тут опять же во всей этой коммутации кому как: многие из подручных БП все делаеют (а они как на 5В, так и на 12В)... 

rapidshe
Offline
Зарегистрирован: 31.12.2015

т.е. есть на LOW включается, то нельзя переделать чтобы включалось на HIGH?

Andrey-S
Offline
Зарегистрирован: 02.01.2015

rapidshe пишет:

т.е. есть на LOW включается, то нельзя переделать чтобы включалось на HIGH?


Зачастую перемычка есть как раз для этого дела...

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

rapidshe пишет:

т.е. есть на LOW включается, то нельзя переделать чтобы включалось на HIGH?

 

А вообще какая разница от LOW или HIGH? Вы же сами программу пишите. В void setup сразу пишите для Data реле

pinMode(relay, OUTPUT);

digitalWrite(relay,HIGH);

а в void loop    digitalWrite(relay, LOW);

rapidshe
Offline
Зарегистрирован: 31.12.2015

можно сказать по религиозным соображениям)

просто привык если лоу, то выключено, если хай, то включено) 

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Религиозные соображения как правило усредняются через #define. В вашем случае, к примеру так:

#define RELAY_OFF HIGH
#define RELAY_ON   LOW

:)

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

#define RELAY_OFF digitalWrite(relaypin, HIGH) // лучше сразу так

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

rapidshe пишет:

можно сказать по религиозным соображениям)

просто привык если лоу, то выключено, если хай, то включено) 

 

Именно по религиозным соображениям в Англии ездят по левой стороне.
И считают это нормальным. Но для вас нелогичным.
Точно так же если для "включить " нужно подать 0 значит нужно его подать для включения.
RS232. Сигнал "Марк" - единица, передается напряжением от минус 3 до минус 15 Вольт