Вопрос по работе 2-х канального модуля реле
- Войдите на сайт для отправки комментариев
Чт, 07/01/2016 - 19:44
Уважаемые коллеги, я здесь новичок, прошу сильно не пинать, если вопрос уже где-то поднимался, просто ткните, куда пойти.
Есть мега 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);
}
}
реле может быть инверсным (условно). смотря к каким контактам подключиться. да и програмно инвертировать вообще не проблема. всего лишь 108 и 111 строка поменять low на high и наоборот
Смотря к каким контактам подкючиться
- в смысле? На самом ардуино или на модуле?
Касательно 108 и 111 строки сейчас как раз инверсность и сделана. Т.е. при выполнении условия if (temp1 if (temp1 {relayStatus1=1; digitalWrite(RELAY_PIN,LOW);}
реле как раз таки включается, хотя на управляющий пин передается значение LOW.
Просто это как-то нелогично. Статус LOW, а реле включено. У меня таких реле предполагается штук 10, если не больше, и на каждое задавать инверсию, а потом еще и прописывать статусы, вместо того, чтобы читать их непосредственно с пинов - это как-то неправильно получается.
Отсюда и вопрос, как привести все к нормальному состоянию: LOW- выключено, HIGH - включено.
dr.lmg,
отложите это скетч в сторонку. Напишите скетч из трёх строчек - включить реле по 1 из сериала и выключть по 0 из сериала.
Запустите монитор порта и добейтесь, чтобы всё включалось без "посторонних наводок".
А тогда уже вставите работу с реле в которой Вы уверены в основной скетч.
Просто это как-то нелогично. Статус LOW, а реле включено.
Ну Вы же нам схему всключенрия не дали, так чего спрашиваете?
Как у Вас реле включено? В смысле его катшука? Если одним концом на пин, а другим на + питания, то так и должно быть - LOW - включено, HIGH - выключено.
ВАЖНО - не понимайте буквально мои слова о включении "+ питтания - пин" - разумеется, через транзистор надо. Это я для упрощения разговора.
Схема включения реле:
Нулевой пин, заданный как OUTPUT, подает сигнал HIGH на IN1 реле, при условии, что заданная температура больше, чем текущая на датчике температуры, и сигнал LOW, если текущая температура больше или равна заданной.
Тогда смотрите описание модуля, что он хочет на ноге HIGH или Low
По любому, мой совет про скетч из трёх строк - лучший подход. Так Вы убедитесь, что другие куски программы не мешают и локализуете проблему - она в работе с реле или в других кусках.
dr.lmg,
void setup() { //Настроим пин для управления реле pinMode(RELAY_PIN,OUTPUT); digitalWrite(RELAY_PIN,HIGH);С таким подходом при включении МК реле будет неминуемо включаться на долю секунды. Что бы этого не происходило поменяйте строчки местами.
Если сразу конфигурить выхода оно даже не клацает :)
Тут проблема, что у него не реализован гистерезис.
Будет клацать на переходе -+ значение задания.
Если реле не жалко то пофиг.
Проблема решена.
Для управления модулем необходимо использовать инициализацию через библиотеку relay8, которая у меня и была подключена, но не использовалась. В итоге инициировать выход для реле через digitalWrite не нужно, указывается реле и пин, с которого идет управляющий сигнал на реле. После чего само реле управляется через on / off с указанием номера пина, на котором оно сидит (с которого идет управляющий сигнал), схема осталась без изменений.
Спасибо всем, кто откликнулся.
Если сразу конфигурить выхода оно даже не клацает :)
Тут проблема, что у него не реализован гистерезис.
Будет клацать на переходе -+ значение задания.
Если реле не жалко то пофиг.
Не совсем понял про гистерезис.
И еще один вопрос касательно реле. При компиляции и загрузке скетча светодиоды на адруине начинают часто -часто мигать и все подключенные реле начинают стрекотать. После загрузки все приходит в нормальное состояние. Это так должно быть?
Повторю последний вопрос, так же касающийся реле:
При компиляции и загрузке скетча светодиоды на адруине начинают часто -часто мигать и все подключенные реле начинают стрекотать. После загрузки все приходит в нормальное состояние. Это так должно быть?
Не совсем понял про гистерезис.
И еще один вопрос касательно реле. При компиляции и загрузке скетча светодиоды на адруине начинают часто -часто мигать и все подключенные реле начинают стрекотать. После загрузки все приходит в нормальное состояние. Это так должно быть?
Гистерезис разность температур включения и отключения реле. При достижении температуры Т1 реле отключено, при достижении температуры Т2 реле включено. Разность температур должна составлять от 1 до 5 град. С. (как рекомендация). Т1>Т2.
Идет загрузка программы, состояние выходов не определены. После загрузки должно быть все нормально. На время отладки программы и ее загрузке желательно отключить реле.
LOW означает низкий уровень на выходе, что приводит к протеканию тока через маленькую черненькую штутчечку и включению реле.
Повторю последний вопрос, так же касающийся реле:
При компиляции и загрузке скетча светодиоды на адруине начинают часто -часто мигать и все подключенные реле начинают стрекотать. После загрузки все приходит в нормальное состояние. Это так должно быть?
Да. Только не при компиляции, конечно, а именно при загрузке. Мигает и стрекочет то, что подключено к тем же ногам, через которые загрузка идёт. На них же меняетеся что-то при загрузке, вот оно и мигает.
Отпишусь касательно библиотеки relay8 - эта библиотека по сути нужна для включения выключения всяких рекламных / световых вещей. Для работы в качестве управления реле в моем проекте вещь никуда не годная, поэтому от нее отказался, управляю реле сигналами на пинах черех readPin / writePin.