Реле не отключается при логической единице
- Войдите на сайт для отправки комментариев
Втр, 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();
}
}
помогите справиться с недугом.
#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 миливольт при нуле.
Это он показывает на выходе контроллера.
А сколько показывает мультиметр на разомкнутом входе реле?
У него пин реле настраивается как выход только при каком-то условии. А выполняется ли это условие при включении - большой вопрос
Загрузить примерно такой код и проверить - работает реле или нет. А потом уже думать, где со своим кодом накосячил
#define RELE D5 void setup() { pinMode(RELE, OUTPUT); } void loop() { digitalWrite(RELE, HIGH); delay(1000); digitalWrite(RELE, LOW); delay(1000); }Оказалось, что при питании реле от 5в, оно не видит напряжение в 3.3 вольта от платы. Запитал реле от 3.3 вольта и всё исправно заработало
Загрузить примерно такой код и проверить - работает реле или нет. А потом уже думать, где со своим кодом накосячил
#define RELE D5 void setup() { pinMode(RELE, OUTPUT); } void loop() { digitalWrite(RELE, HIGH); delay(1000); digitalWrite(RELE, LOW); delay(1000); }не так. HIGH и LOW должны заметно различаться, например, 2000 и 500.
Без разницы: реле либо щелкает, либо - нет.
не так. HIGH и LOW должны заметно различаться, например, 2000 и 500.
Без разницы: реле либо щелкает, либо - нет.
а если щелкает, то знать, куда - совсем не интересно?
В данном случае - нет. У ТС оно вообще не щелкает ))
Тогда зачем код из сообщения №7?
Тогда зачем код из сообщения №7?
Для проверки - рабочий ли вообще модуль, и на тот ли пин, что указан в прошивке, модуль подключен. У ТС реле было постоянно включено и не реагировало на смену уровня на пине.
Вот именно.
А для проверки достаточно меандра, мудрить со скважностью смысла нет.
Дык, а кто мудрил? Я не мудрил ))
Так и я к тому (см. пост №10).
Ну, вроде разобрались.