Вопрос по работе 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,
С таким подходом при включении МК реле будет неминуемо включаться на долю секунды. Что бы этого не происходило поменяйте строчки местами.
Если сразу конфигурить выхода оно даже не клацает :)
Тут проблема, что у него не реализован гистерезис.
Будет клацать на переходе -+ значение задания.
Если реле не жалко то пофиг.
Проблема решена.
Для управления модулем необходимо использовать инициализацию через библиотеку relay8, которая у меня и была подключена, но не использовалась. В итоге инициировать выход для реле через digitalWrite не нужно, указывается реле и пин, с которого идет управляющий сигнал на реле. После чего само реле управляется через on / off с указанием номера пина, на котором оно сидит (с которого идет управляющий сигнал), схема осталась без изменений.
Спасибо всем, кто откликнулся.
Если сразу конфигурить выхода оно даже не клацает :)
Тут проблема, что у него не реализован гистерезис.
Будет клацать на переходе -+ значение задания.
Если реле не жалко то пофиг.
Не совсем понял про гистерезис.
И еще один вопрос касательно реле. При компиляции и загрузке скетча светодиоды на адруине начинают часто -часто мигать и все подключенные реле начинают стрекотать. После загрузки все приходит в нормальное состояние. Это так должно быть?
Повторю последний вопрос, так же касающийся реле:
При компиляции и загрузке скетча светодиоды на адруине начинают часто -часто мигать и все подключенные реле начинают стрекотать. После загрузки все приходит в нормальное состояние. Это так должно быть?
Не совсем понял про гистерезис.
И еще один вопрос касательно реле. При компиляции и загрузке скетча светодиоды на адруине начинают часто -часто мигать и все подключенные реле начинают стрекотать. После загрузки все приходит в нормальное состояние. Это так должно быть?
Гистерезис разность температур включения и отключения реле. При достижении температуры Т1 реле отключено, при достижении температуры Т2 реле включено. Разность температур должна составлять от 1 до 5 град. С. (как рекомендация). Т1>Т2.
Идет загрузка программы, состояние выходов не определены. После загрузки должно быть все нормально. На время отладки программы и ее загрузке желательно отключить реле.
LOW означает низкий уровень на выходе, что приводит к протеканию тока через маленькую черненькую штутчечку и включению реле.
Повторю последний вопрос, так же касающийся реле:
При компиляции и загрузке скетча светодиоды на адруине начинают часто -часто мигать и все подключенные реле начинают стрекотать. После загрузки все приходит в нормальное состояние. Это так должно быть?
Да. Только не при компиляции, конечно, а именно при загрузке. Мигает и стрекочет то, что подключено к тем же ногам, через которые загрузка идёт. На них же меняетеся что-то при загрузке, вот оно и мигает.
Отпишусь касательно библиотеки relay8 - эта библиотека по сути нужна для включения выключения всяких рекламных / световых вещей. Для работы в качестве управления реле в моем проекте вещь никуда не годная, поэтому от нее отказался, управляю реле сигналами на пинах черех readPin / writePin.