Доброго времени форумчане, скетч взят с интернета, прошу помощи, при подаче питания у меня на 3 пине появляется высокий сигнал сразу, приводит к тому что у меня срабатывает реле (реле стоит вместо транзистора) по схеме поставил только резистор подтяжки на землю в 10ком. Ссылку на источник прилагаю https://drive.google.com/drive/folders/1sK9kES0o6y7wQvnmaP719tACYUZ3j0wu Код (C++): #include <EEPROM.h> #include "LCD_1602_RUS.h" #include "GyverButton.h" LCD_1602_RUS lcd(0x27, 16, 2); boolean Pusk = 0; boolean Meny = 0; float obyem; //переменная прошедшего ОБЪЕМА float zad_obyem = 0; float rashod; //расход воды в минуту volatile unsigned long lastflash, flash; volatile unsigned long impuls = 0; //число импульсов расходомера unsigned long Taimer1; unsigned long Taimer2; float ves_impulsa = 2.40; //вес одного импульса //Настройка кнопок #define BTN1 4 //Кнопка БОЛЬШЕ #define BTN2 5 //Кнопка МЕНЬШЕ #define BTN3 6 //Кнопка СТАРТ #define BTN4 7 //Кнопка СТОП GButton bol(BTN1); GButton men(BTN2); GButton Start(BTN3); GButton Stop(BTN4); #define ADDR 10 //ячейка с ключем первого запуска #define KEY 15 //ключь первого запуска void setup() { Serial.begin(9600); if (EEPROM.read(ADDR) != KEY) { //если во время первого запуска в ячейке 10 ключь не совподает то записывает в 10 ячейку ключь EEPROM.write(ADDR, KEY); EEPROM.put(0, ves_impulsa); } //также записываем стандартный весс импульса. 2,40 EEPROM.get(0, ves_impulsa); pinMode (3, OUTPUT); // Настраиваем 3 цифровой порт на выход digitalWrite (3, LOW); // подать на 3 порт 0 Вольт. attachInterrupt(0, sens, RISING); // подключить прерывание на 2 пин при повышении сигнала lcd.init(); // инициализация дисплея lcd.backlight(); // включить подсветку bol.setTickMode(AUTO); //Функция опроса кнопки БОЛЬШЕ men.setTickMode(AUTO); //Функция опроса кнопки МЕНЬШЕ Start.setTickMode(AUTO); //Функция опроса кнопки СТАРТ Stop.setTickMode(AUTO); //Функция опроса кнопки СТОП } void sens() { flash = micros() - lastflash; // вычислить время между двумя импульсами lastflash = micros(); // запомнить время последнего импульса impuls++; } void loop() { if (micros() - lastflash > 1000000) { // если сигнала нет больше секунды rashod = 0; // считаем, что всё стоит и не крутится } else { obyem = impuls * ves_impulsa / 1000.0; rashod = 60.0 / (flash / 1000000.0 * 450.0); // время одного оборота в секундах, с учётом числа лопастей } if (Pusk == 1 && obyem < zad_obyem - 0.01) { //Если прошло 30 секунд и объем меньше заданного то подаем на 3 пин 5 вольт. digitalWrite (3, HIGH); } // Подаем на 3 пин 5 вольт else if (Pusk == 1 && obyem >= zad_obyem - 0.01) { digitalWrite (3, LOW); //если условие не выполняется по подаем на 3 пин 0 вольт. Pusk = 0; } else if (Pusk == 0) { digitalWrite (3, LOW); //если условие не выполняется по подаем на 3 пин 0 вольт. } if (millis() - Taimer1 > 300) { // кадждые 300 миллисекунд if (Meny == 0) { lcd.setCursor(0, 0); // курсор слева 1 строчка lcd.print(L"Задано"); lcd.setCursor(0, 1); // курсор слева 2 строчка lcd.print(L"Подано"); lcd.setCursor(7, 0); // курсор 9 слева 1 строчка lcd.print(zad_obyem, 1); // выводим RPM lcd.setCursor(7, 1); // курсор 10 слева 2 строчка lcd.print(obyem, 1); // выводим скорость lcd.setCursor(12, 0); // курсор 9 слева 1 строчка lcd.print(rashod, 1); // выводим RPM } else { lcd.setCursor(2, 0); // курсор 9 слева 1 строчка lcd.print(L"Вес импульса"); // выводим RPM lcd.setCursor(6, 1); // курсор 9 слева 1 строчка lcd.print(ves_impulsa); // выводим RPM } Taimer1 = millis(); // сброс таймера } //Работа с кнопками if (bol.isClick() && Meny == 0) { zad_obyem = zad_obyem + 0.1; } if (men.isClick() && Meny == 0) { zad_obyem = zad_obyem - 0.1; } if (bol.isStep() && Meny == 0) { zad_obyem = zad_obyem + 0.5; } if (men.isStep() && Meny == 0) { zad_obyem = zad_obyem - 0.5; } if (Start.isClick() && Meny == 0) { Pusk = 1; } if (Start.isStep()) { Meny = !Meny; lcd.setCursor(0, 0); lcd.print(" "); // Очищаем дисплей lcd.setCursor(0, 1); // lcd.print(" "); // Очищаем дисплей } if (Stop.isClick() && Meny == 0) { Pusk = 0; } if (Stop.isHold() && Meny == 0) { impuls = 0; obyem = 0; } if (bol.isClick() && Meny == 1) { ves_impulsa = ves_impulsa + 0.01; EEPROM.put(0, ves_impulsa); } if (men.isClick() && Meny == 1) { ves_impulsa = ves_impulsa - 0.01; EEPROM.put(0, ves_impulsa); } if (bol.isStep() && Meny == 1) { ves_impulsa = ves_impulsa + 0.1; EEPROM.put(0, ves_impulsa); } if (men.isStep() && Meny == 1) { ves_impulsa = ves_impulsa - 0.1; EEPROM.put(0, ves_impulsa); } }
Как стоит? Где стоит? Рисуйте схему, не ленитесь. Могу предположить, что Вы слишком тупо поставили его "вместо транзистора" и тогда, оно по LOW и срабатывает, транзистор-то землёй управляет.
Щяс установим фотошоп и все отрисую, но по поводу транзистора он там pnp то есть транзистор открывается путем подачи на затвор высокого уровня если я не ошибаюсь , разве нельзя просто напрямую подключить реле?
Судя по схеме, транзистор N-канальный, что аналогично NPN. Включен по схеме с общим истоком (эмиттером). В таком включении он - инвертор. То есть, если вы решили включить нагрузку без транзистора - то обязательно в программе инвертируйте выходной сигнал. ПС. Категорически не рекомендую включать нагрузку высоким уровнем (то есть когда другой конец нагрузки соединен на GND) - верхний транзистор выхода всегда слабее нижнего. ППС. Не забывайте подключить диод-подавитель, иначе импульс самоиндукции обмотки вышибет выход.
Я поставил за место транзистора реле (https://ibb.co/dPDyn3n) ардуинка ведет себя так, первое включение , реле открывается сходу, как тока я устанавливаю значения и жму кнопки старт стоп, то у меня все начинает исправно работать, задано в : void setup pinMode (3, OUTPUT); // Настраиваем 3 цифровой порт на выход digitalWrite (3, LOW); // подать на 3 порт 0 Вольт. неужели из за этого у меня открывается реле?
У меня нет таких релейных модулей. Что в нем за транзистор и каково его включение - не знаю. ПС. После digitalWrite (3, LOW); надо бы поставить паузу типа delay(100). Чтобы реле успело сработать до перехода программы в главный цикл.
Получается что после объявление 3 пина как выход я сделал ему низкий уровень low тем самым подал сигнал на реле ?
Релейный модуль TZT для arduino в наличии, 5 В куплено на алиэкспресс, сопротивление замерить сегодня не смогу, Просто из постов выше я понял что реле может открыться при подачи как и высокого так и низкого уровня , или у меня подозрительно неисправное реле?
надо посмотреть типовую схему подключения реле к выходу микроконтроллера и тогда сразу станет ясно - чего не хватает
Надо четко обозначать - реле (то бишь железяка с катушкой), или релейный модуль (железяка с катушкой и еще что-то полупроводниковое). А это получается совсем разные по свойствам предметы. И реле не открывается - оно или срабатывает или нет. Как работает релейный модуль зависит от его схемы, а не от реле. ПС. Посмотрите при каком уровне на пине срабатывает реле в модуле, отпишитесь. Тогда будет более понятно. ППС. Реле само по себе (не модуль) работает в зависимости от того куда вы кинули второй конец обмотки. На плюс - значит при низком сигнале на пине, и наоборот.
Спасибо огромное, еще вопросик уважаемые мастера, какой провод использовать для подключения счетчика воды? примерно будет стоять метров 10 от ардуино
Да, запросто. Таких модулей (которые включаются по LOW) ничуть не меньше, чем тех, что включаются по HIGH. Вы должны знать, что у Вас за модуль. Если информации нет, это легко проверить на сборке из треёх деталей прежде, чем пихать модуль в большую схему.