Вопрос по работе 2-х канального модуля реле

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Уважаемые коллеги, я здесь новичок, прошу сильно не пинать, если вопрос уже где-то поднимался, просто ткните, куда пойти.

Есть мега 2560, термодатчик DS18B20 и двухканальнй модуль реле Двухканальный релейный модуль

Соглсано программе, реле на модуле должно включаться, если температура датчика опускается ниже заданной.

Однако все происходит с точностью до наоборот. Реле включено (горит индикатор, нормально разомкнутые контакты замкнуты), но при этот статус выхода (пина, на который подключен контакт, управляющий реле) показывает LOW. При указании HIGH реле отключается.

Я никак не пойму, реле инверсное или я что-то все-таки напутал? Помогите разобраться. Ниже листинг программы.

// Подключаем библиотеки
#include <OneWire.h>
#include <DallasTemperature.h>
#include <relay8.h>

// библиотека для работы с дисплеем
#include <UTFT.h>
// создаём объект класса UTFT
// и передаём идентификатор модели дисплея и номера управляющих пинов
UTFT myGLCD(CTE32HR, 38, 39, 40, 41);
// объявления встроенного шрифта
extern uint8_t BigFont[];



// датчик температуры на пине 2
OneWire oneWire(2); 

//Создаем объект sensors, подключенный по OneWire
DallasTemperature sensors(&oneWire);

//Создаем переменные для работы с термометром
DeviceAddress tempDeviceAddress;  //переменная для хранения адреса датчика
float temp1=0; //переменная для текущего значения температуры
int setTmp=0; // переменная для заданного значения температуры

// Подключаем библиотеку для работы с ARDUINO EEPROM
//Заданная температура будет храниться по адресу 0
#include <EEPROM2.h>

//Реле подключено к пину 1
#define RELAY_PIN 1

//Объявим переменную для хранения состояния реле
boolean relayStatus1=0;

//Объявим переменные для задания задержки
long previousMillis1 = 0;
long interval1 = 700; // интервал опроса датчиков температуры

String temp_p;
String relayStatus_p;
String setTmp_p;

void setup() {
//Настроим пин для управления реле
  pinMode(RELAY_PIN,OUTPUT);
  digitalWrite(RELAY_PIN,HIGH);

setTmp = 20;
//Считаем из постоянной памяти заданную температуру


//setTmp = EEPROM_read(0, setTmp);

//Инициализируем термодатчик и установим разрешающую способность 12 бит 
//(обычно она установлена по умолчанию, так что последнюю строчку 
//можно опустить)
  sensors.begin();
  sensors.getAddress(tempDeviceAddress, 0);
  //sensors.setResolution(12);


// инициализируем дисплей
  myGLCD.InitLCD();
// очищаем экран
  myGLCD.clrScr();
// выбираем тип шрифта
  myGLCD.setFont(BigFont);

// выведем на дисплей заданное значение температуры на 2 секундый
  
//myGLCD.setCursor(0, 0); 
myGLCD.print("  Current temp  ", CENTER, 0);

myGLCD.print("  Version 0.1  ", CENTER, 72);
delay(700);

// очищаем экран
myGLCD.clrScr();
}


void loop() {
temp_p = "";
relayStatus_p = "";
setTmp_p = "";

//Модуль опроса датчиков и получения сведений о температуре
//Вызывается 1 раз в секунду
  unsigned long currentMillis1 = millis();
if(currentMillis1 - previousMillis1 > interval1) {
    previousMillis1 = currentMillis1;  

//Запуск процедуры измерения температуры
  sensors.setWaitForConversion(false);
  sensors.requestTemperatures();
  sensors.setWaitForConversion(true);

delay(750); // задержка для обработки информации внутри термометра, в данном случае можно не задавать

//Считывание значения температуры
  sensors.getAddress(tempDeviceAddress, 0);
  temp1=sensors.getTempC(tempDeviceAddress);

//Проверка условия включения/выключения нагревателя
if (temp1<setTmp)
{relayStatus1=1; digitalWrite(RELAY_PIN,LOW);}

if (temp1>=setTmp)
{relayStatus1=0; digitalWrite(RELAY_PIN,HIGH);}

// присваиваем переменные датчиков к переменным вывода на дисплей
temp_p = temp1;
if (digitalRead(RELAY_PIN) == 1)
{relayStatus_p = "ON";}
else 
{relayStatus_p = "OFF";}
setTmp_p = setTmp;

// Вывод текущего значения температуры на дисплей
//myGLCD.setCursor(0, 0); 
myGLCD.print("  Current temp  ", LEFT, 0);
myGLCD.print(temp_p, LEFT, 36); 
myGLCD.print("  Set temp  ", LEFT, 72);
myGLCD.print(setTmp_p, LEFT, 108); 
myGLCD.print("  Relay status  ", LEFT, 142);
myGLCD.print(relayStatus_p, LEFT, 178);

}
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

реле может быть инверсным (условно). смотря к каким контактам подключиться. да и програмно инвертировать вообще не проблема. всего лишь 108 и 111 строка поменять low на high и наоборот

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Смотря к каким контактам подкючиться

- в смысле? На самом ардуино или на модуле?

Касательно 108 и 111 строки сейчас как раз инверсность и сделана. Т.е. при выполнении условия if (temp1 if (temp1 {relayStatus1=1; digitalWrite(RELAY_PIN,LOW);}
реле как раз таки включается, хотя на управляющий пин передается значение LOW.

Просто это как-то нелогично. Статус LOW, а реле включено. У меня таких реле предполагается штук 10, если не больше, и на каждое задавать инверсию, а потом еще и прописывать статусы, вместо того, чтобы читать их непосредственно с пинов - это как-то неправильно получается.
Отсюда и вопрос, как привести все к нормальному состоянию: LOW- выключено, HIGH - включено.

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

dr.lmg,

отложите это скетч в сторонку. Напишите скетч из трёх строчек - включить реле по 1 из сериала и выключть по 0 из сериала. 

Запустите монитор порта и добейтесь, чтобы всё включалось без "посторонних наводок".

А тогда уже вставите работу с реле в которой Вы уверены в основной скетч.

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

dr.lmg пишет:

Просто это как-то нелогично. Статус LOW, а реле включено.

Ну Вы же нам схему всключенрия не дали, так чего спрашиваете?

Как у Вас реле включено? В смысле его катшука? Если одним концом на пин, а другим на + питания, то так и должно быть - LOW - включено, HIGH - выключено.

ВАЖНО - не понимайте буквально мои слова о включении "+ питтания - пин" - разумеется, через транзистор надо. Это я для упрощения разговора.

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Схема включения реле:

Нулевой пин, заданный как OUTPUT, подает сигнал HIGH на IN1 реле, при условии, что заданная температура больше, чем текущая на датчике температуры, и сигнал LOW, если текущая температура больше или равна заданной.

подкючение модуля реле

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

Тогда смотрите описание модуля, что он хочет на ноге HIGH или Low

По любому, мой совет про скетч из трёх строк - лучший подход. Так Вы убедитесь, что другие куски программы не мешают и локализуете проблему - она в работе с реле или в других кусках.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

dr.lmg,

void setup() {
//Настроим пин для управления реле
 pinMode(RELAY_PIN,OUTPUT);
 digitalWrite(RELAY_PIN,HIGH);

С таким подходом при включении МК реле будет неминуемо включаться на долю секунды. Что бы этого не происходило поменяйте строчки местами.

temenator
Offline
Зарегистрирован: 26.12.2015

Если сразу конфигурить выхода оно даже не клацает :)

Тут проблема, что у него не реализован гистерезис.

Будет клацать на переходе -+ значение задания.

Если реле не жалко то пофиг.

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Проблема решена.

Для управления модулем необходимо использовать инициализацию через библиотеку relay8, которая у меня и была подключена, но не использовалась. В итоге инициировать выход для реле через digitalWrite не нужно, указывается реле и пин, с которого идет управляющий сигнал на реле. После чего само реле управляется через on / off с указанием номера пина, на котором оно сидит (с которого идет управляющий сигнал), схема осталась без изменений.

Спасибо всем, кто откликнулся.

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

temenator пишет:

Если сразу конфигурить выхода оно даже не клацает :)

Тут проблема, что у него не реализован гистерезис.

Будет клацать на переходе -+ значение задания.

Если реле не жалко то пофиг.

Не совсем понял про гистерезис.

И еще один вопрос касательно реле. При компиляции и загрузке скетча светодиоды на адруине начинают часто -часто мигать и все подключенные реле начинают стрекотать. После загрузки все приходит в нормальное состояние. Это так должно быть?

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Повторю последний вопрос, так же касающийся реле:

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

VictorNsk
VictorNsk аватар
Offline
Зарегистрирован: 27.09.2015

dr.lmg пишет:

Не совсем понял про гистерезис.

И еще один вопрос касательно реле. При компиляции и загрузке скетча светодиоды на адруине начинают часто -часто мигать и все подключенные реле начинают стрекотать. После загрузки все приходит в нормальное состояние. Это так должно быть?

Гистерезис разность температур включения и отключения реле. При достижении температуры Т1 реле отключено, при достижении температуры Т2 реле включено. Разность температур должна составлять от 1 до 5 град. С. (как рекомендация). Т1>Т2.

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

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

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

dr.lmg пишет:

Повторю последний вопрос, так же касающийся реле:

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

Да. Только не при компиляции, конечно, а именно при загрузке. Мигает и стрекочет то, что подключено к тем же ногам, через которые загрузка идёт. На них же меняетеся что-то при загрузке, вот оно и мигает.

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Отпишусь касательно библиотеки relay8 - эта библиотека по сути нужна для включения выключения всяких рекламных / световых вещей. Для работы в качестве управления реле в моем проекте вещь никуда не годная, поэтому от нее отказался, управляю реле сигналами на пинах черех readPin / writePin.