Официальный сайт компании Arduino по адресу arduino.cc
Реле не отключается при логической единице
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Втр, 01/12/2020 - 01:33
Всем привет !
Столкнулся с такой проблемой, реле (модуль) низкого уровня всегда замкнуто, хоть и плата не подает напряжение на входящий пин, хоть подает- реле всё равно. Как только отсоединяю сигнальный провод тут-же размыкается. Мультиметр показывает 3.3 вольта при подаче логической единицы от платы и 50 миливольт при нуле.
вот мой инвалидный код
#include "OTABlynkCredentials.h"
#ifdef ESP8266
#include <BlynkSimpleEsp8266.h>
#elif defined(ESP32)
#include <BlynkSimpleEsp32.h>
#else
#error "Board not found"
#endif
#include <DHT_U.h>
#include <SimpleTimer.h>
SimpleTimer timer;
#include <Wire.h> //библиотека шины I2C
#include <LiquidCrystal_I2C.h> //библиотека для дисплеев
LiquidCrystal_I2C LCD(0x27, 16, 2);
//#define RELE 0 //определяем цифровой пин для реле (esp01,Node MCU)
#define RELE D5
#define DHTPIN 2 // определяем цифровой пин для датчика(esp01, Node MCU)
#define DHTTYPE DHT22 // DHT 22, AM2302, AM2321
DHT dht(DHTPIN, DHTTYPE); //объявляем объект
credentials Credentials;
//Variables
char auth_token[33];
bool connected_to_internet = 0;
const int Erasing_button = 0;
//Provide credentials for your ESP server
char* esp_ssid = "Vaillant";
char* esp_pass = "40225418";
byte gr[8] = //байтовая маска знака градусы
{B11100, B10100, B11100, B00000, B00000, B00000, B00000, B00000,};
byte simV[8] = //буква В
{B11100, B10010, B10010, B11110, B10001, B10001, B10001, B11110,};
byte simK[8] = //буква К
{B10001, B10010, B10100, B11000, B11100, B10010, B10001, B10001,};
byte simL[8] = //буква Л
{B00011, B00101, B01001, B01001, B01001, B01001, B01001, B10001,};
byte simY[8] = //буква Ы
{B10001, B10001, B10001, B11101, B10101, B10101, B10101, B11101,};
float TEMPON; //для температуры включения
float TEMPOFF; //для тепературы выключения
float TIMER; //для тепературы выключения
uint32_t zadergka; // переменная хранения времени для отправки уведомлений в блинк (unsigned long)
WidgetLED led1(V0); //определяем виртуальный пин для виджета "светодиод"
BLYNK_CONNECTED() { //синхронизация виртуального порта для блинка (ползунки пределов сарабатывания реле)
Blynk.syncVirtual(V2);
Blynk.syncVirtual(V3);
Blynk.syncVirtual(V4);
}
BLYNK_WRITE(V2) //привязка виртуального пина к виджету включения
{
TEMPON = param.asInt();
}
BLYNK_WRITE(V3) //привязка виртуального пина к виджету выключения
{
TEMPOFF = param.asInt();
}
BLYNK_WRITE(V4) //привязка виртуального пина к виджету выключения
{
TIMER = param.asInt();
}
void setup()
{
Serial.begin(115200);
pinMode(Erasing_button, INPUT);
for (uint8_t t = 4; t > 0; t--) {
Serial.println(t);
delay(1000);
}
// Press and hold the button to erase all the credentials
if (digitalRead(Erasing_button) == LOW)
{
Credentials.Erase_eeprom();
}
String auth_string = Credentials.EEPROM_Config();
auth_string.toCharArray(auth_token, 33);
if (Credentials.credentials_get())
{
Blynk.config(auth_token);
connected_to_internet = 1;
}
else
{
Credentials.setupAP(esp_ssid, esp_pass);
connected_to_internet = 0;
}
if (connected_to_internet)
{
Serial.begin(115200); //консоль отладки (при скорости 9600 датчик DHT22 периодически пропадает)
dht.begin(); //старт датчика
timer.setInterval(1000L, dataSensor); // Настройка функции, вызываемой каждую секунду 1000L =1сек, датчики DHT медленные, рекомендуется от 1 сек
//delay(10); //задержка
pinMode(RELE, OUTPUT); //конфигурация пина для сигнала на выход
digitalWrite (RELE, HIGH); // логика пина при старте, исключает кратковременное срабатывание при запуске
//может потребоваться инвертирование в зависимости от выбора реле (не катит с esp01)
//ВЫВОД ДАННЫХ НА ДИСПЛЕЙ
LCD.init(); //инициализация дисплея
LCD.backlight(); //включаем подсветку
//выводим текст ТЕМПЕРАТУРЫ И ВЛАЖНОСТИ на дисплей
LCD.setCursor(0, 0); //ставим курсор на 0 символ 1 строки
LCD.print("T:"); //выводим текст Т
LCD.setCursor(8, 0); //ставим курсор на 9 символ 1 строки
LCD.print("H:"); //выводим текст H
LCD.setCursor(14, 0); //ставим курсор на 15 символ 1 строки
LCD.print("%"); //выводим текст %
//выводим текст порогов включения выключения на дисплей
LCD.setCursor(0, 1); //
LCD.print("On:"); //
LCD.setCursor(6, 1); //
LCD.print("Off:"); //
//ПРИСВОИМ НОМЕРА СИМВОЛАМ
LCD.createChar(1, gr); //знак градусы
LCD.createChar(2, simV); //буква В
LCD.createChar(3, simK); //буква К
LCD.createChar(4, simL); // буква Л
LCD.createChar(5, simY); //буква Ы
//СИМВОЛЫ НЕ МЕНЯЮЩИЕСЯ НА ЭКРАНЕ
//выводим знак градусы
LCD.setCursor(6, 0); //
LCD.print("\1"); //
}
/*else
{
delay(1000000);
resetFunc(); //вызов ресета
}*/
}
void dataSensor()
{
float h = dht.readHumidity(); // вывод переменной влажности, до точки с зпт. можно задать корректировку
float t = dht.readTemperature(); // вывод переменной температуры, до точки с зпт. можно задать корректировку
Blynk.virtualWrite(V5, h); // отправка значений влажности на виртуальный порт 5
Blynk.virtualWrite(V6, t); // отправка значений температуры на виртуальный порт 6
//выводим переменные на дисплей
LCD.setCursor(2, 0); //ставим курсор на 2 символ 1 строки
LCD.print(t, 1); //выводим переменную температуры
LCD.setCursor(10, 0); //ставим курсор на 11 символ 1 строки
LCD.print(h, 1); //выводим переменную влажности
//вывод переменных порогов включения выключения реле
LCD.setCursor(3, 1); //
LCD.print(TEMPON, 0); //
LCD.setCursor(10, 1); //
LCD.print(TEMPOFF, 0); //
//Вывод данных для сериалпорт, можно протестировать если плата NodeMCU
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print("С");
Serial.print("Vlagnost: ");
Serial.print(h);
Serial.print("%");
Serial.println("Failed to read from DHT sensor!");
if (TIMER == 1)
{
if (t <= TEMPON)
{
led1.on();
digitalWrite(RELE, LOW); //инвертируем если нужна обратная логика
Serial.println("LOW"); //отладка, вывод в сериал, инвертируем если обратная логика
LCD.setCursor(13, 1); //место начала вывода на дисплей
LCD.print("\2\3\4"); //вывод состояния реле на дисплей ВКЛ
}
else if (t >= TEMPOFF)
{
led1.off();
digitalWrite(RELE, HIGH); //инвертируем если нужна обратная логика
Serial.println("HIGH"); //отладка, вывод в сериал, инвертируем если обратная логика
LCD.setCursor(13, 1); //место начала вывода на дисплей
LCD.print("\2\5\3"); //вывод состояния реле на дисплей ВЫК
}
}
else if (TIMER == 0)
{
led1.off();
digitalWrite(RELE, HIGH);
Serial.println("HIGH"); //отладка, вывод в сериал, инвертируем если обратная логика
LCD.setCursor(13, 1); //место начала вывода на дисплей
LCD.print("\2\5\3"); //вывод состояния реле на дисплей ВЫК
}
}
void loop()
{
Credentials.server_loops();
if (connected_to_internet)
{
Blynk.run();
timer.run();
}
}
помогите справиться с недугом.
А пин, к которому подключено реле, как настроен?
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/ne-rabotaet-mo...
реле (модуль) низкого уровня всегда замкнуто, хоть и плата не подает напряжение на входящий пин, хоть подает- реле всё равно. Как только отсоединяю сигнальный провод тут-же размыкается. Мультиметр показывает 3.3 вольта при подаче логической единицы от платы и 50 миливольт при нуле.
Это он показывает на выходе контроллера.
А сколько показывает мультиметр на разомкнутом входе реле?
реле (модуль) низкого уровня всегда замкнуто, хоть и плата не подает напряжение на входящий пин, хоть подает- реле всё равно. Как только отсоединяю сигнальный провод тут-же размыкается. Мультиметр показывает 3.3 вольта при подаче логической единицы от платы и 50 миливольт при нуле.
Это он показывает на выходе контроллера.
А сколько показывает мультиметр на разомкнутом входе реле?
У него пин реле настраивается как выход только при каком-то условии. А выполняется ли это условие при включении - большой вопрос
Загрузить примерно такой код и проверить - работает реле или нет. А потом уже думать, где со своим кодом накосячил
Оказалось, что при питании реле от 5в, оно не видит напряжение в 3.3 вольта от платы. Запитал реле от 3.3 вольта и всё исправно заработало
Загрузить примерно такой код и проверить - работает реле или нет. А потом уже думать, где со своим кодом накосячил
не так. HIGH и LOW должны заметно различаться, например, 2000 и 500.
Без разницы: реле либо щелкает, либо - нет.
не так. HIGH и LOW должны заметно различаться, например, 2000 и 500.
Без разницы: реле либо щелкает, либо - нет.
а если щелкает, то знать, куда - совсем не интересно?
В данном случае - нет. У ТС оно вообще не щелкает ))
Тогда зачем код из сообщения №7?
Тогда зачем код из сообщения №7?
Для проверки - рабочий ли вообще модуль, и на тот ли пин, что указан в прошивке, модуль подключен. У ТС реле было постоянно включено и не реагировало на смену уровня на пине.
Вот именно.
А для проверки достаточно меандра, мудрить со скважностью смысла нет.
Дык, а кто мудрил? Я не мудрил ))
Так и я к тому (см. пост №10).
Ну, вроде разобрались.