Реле не отключается при логической единице

koralandre
Offline
Зарегистрирован: 01.12.2020

Всем привет !

Столкнулся с такой проблемой, реле (модуль) низкого уровня всегда замкнуто, хоть и плата не подает напряжение на входящий пин, хоть подает- реле всё равно. Как только отсоединяю сигнальный провод тут-же размыкается. Мультиметр показывает 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();
  }
 
}
 
 
помогите справиться с недугом.
koralandre
Offline
Зарегистрирован: 01.12.2020
#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();
  }

}

 

v258
Offline
Зарегистрирован: 25.05.2020

А пин, к которому подключено реле, как настроен?

nik182
Offline
Зарегистрирован: 04.05.2015
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

koralandre пишет:

реле (модуль) низкого уровня всегда замкнуто, хоть и плата не подает напряжение на входящий пин, хоть подает- реле всё равно. Как только отсоединяю сигнальный провод тут-же размыкается. Мультиметр показывает 3.3 вольта при подаче логической единицы от платы и 50 миливольт при нуле. 

Это он показывает на выходе контроллера.

А сколько показывает мультиметр на разомкнутом входе реле?

SLKH
Offline
Зарегистрирован: 17.08.2015

andriano пишет:

koralandre пишет:

реле (модуль) низкого уровня всегда замкнуто, хоть и плата не подает напряжение на входящий пин, хоть подает- реле всё равно. Как только отсоединяю сигнальный провод тут-же размыкается. Мультиметр показывает 3.3 вольта при подаче логической единицы от платы и 50 миливольт при нуле. 

Это он показывает на выходе контроллера.

А сколько показывает мультиметр на разомкнутом входе реле?

имхо, нет схемы подключения - нет предмета для обсуждения.

v258
Offline
Зарегистрирован: 25.05.2020

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

v258
Offline
Зарегистрирован: 25.05.2020

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

#define RELE D5

void setup() {
  pinMode(RELE, OUTPUT);
}

void loop() {
  digitalWrite(RELE, HIGH);   
  delay(1000);                       
  digitalWrite(RELE, LOW);    
  delay(1000); 
}

 

koralandre
Offline
Зарегистрирован: 01.12.2020

Оказалось, что при питании реле от 5в, оно не видит напряжение в 3.3 вольта от платы. Запитал реле от 3.3 вольта и всё исправно заработало 

SLKH
Offline
Зарегистрирован: 17.08.2015

v258 пишет:

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

#define RELE D5

void setup() {
  pinMode(RELE, OUTPUT);
}

void loop() {
  digitalWrite(RELE, HIGH);   
  delay(1000);                       
  digitalWrite(RELE, LOW);    
  delay(1000); 
}

 

не так. HIGH и LOW должны заметно различаться, например, 2000 и 500.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

SLKH пишет:

не так. HIGH и LOW должны заметно различаться, например, 2000 и 500.

Без разницы: реле либо щелкает, либо - нет.

SLKH
Offline
Зарегистрирован: 17.08.2015

andriano пишет:

SLKH пишет:

не так. HIGH и LOW должны заметно различаться, например, 2000 и 500.

Без разницы: реле либо щелкает, либо - нет.

а если щелкает, то знать, куда - совсем не интересно?

v258
Offline
Зарегистрирован: 25.05.2020

SLKH пишет:

а если щелкает, то знать, куда - совсем не интересно?

В данном случае - нет. У ТС оно вообще не щелкает ))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Тогда зачем код из сообщения №7?

v258
Offline
Зарегистрирован: 25.05.2020

andriano пишет:

Тогда зачем код из сообщения №7?

Для проверки - рабочий ли вообще модуль, и на тот ли пин, что указан в прошивке, модуль подключен. У ТС реле было постоянно включено и не реагировало на смену уровня на пине.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вот именно.

А для проверки достаточно меандра, мудрить со скважностью смысла нет.

v258
Offline
Зарегистрирован: 25.05.2020

Дык, а кто мудрил? Я не мудрил ))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Так и я к тому (см. пост №10).

Ну, вроде разобрались.