кнопка,датчик и реле , Nano.

Foton

✩✩✩✩✩✩✩
16 Сен 2021
4
0
здравствуйте, помогите пожалуйста в оптимизации и перевода кода на "человеческий" язык :)
имеем в наличии ардуино Nano, блок из 4х реле и оптический шлицевой датчик.
принцип таков; при нажатии на кнопку включаем 1 реле,затем включаем 2 реле, через время выключаем 2 реле , включаем 3 реле и через время выключаем 3 реле и выключаем 1 реле,
в общем в период работы 1 реле , реле 2 и 3 успевают по разу открыться и закрыться (через установленные интервалы (delay))
это работает, все ок, но еще надо бы чтобы в течение всей этой суеты непрерывно опрашивался пин с оптодатчика, и при изменении сигнала срабатывала реле4
независимо от стадии выполнения первого условия , так сказать параллельно,
в видео уроке где то видел, чтобы не опрашивать пин вручную, там функция что ли какая то создается...
спасибо, извиняюсь за "delay",

C++:
void setup() {
pinMode(5, INPUT_PULLUP);  //KNOPKA
pinMode(11,OUTPUT );//  реле 1
pinMode(10,OUTPUT); //   реле 2
pinMode(9, OUTPUT);   //  реле 3
pinMode(8, INPUT_PULLUP); //оптический датчик  ((HOLL))
pinMode(12,OUTPUT); // реле 4

  digitalWrite(11,1);  // задаем уровень сигнала
  digitalWrite(10,1);    // --||--
digitalWrite(9, 1);     // --||--
digitalWrite(12,1);     // --||--


}

void loop() {
boolean b1 = !digitalRead(5);
boolean b2 = !digitalRead(8);

if(b1==1) {          //если кнопка нажата
  digitalWrite(11,0); // вкл реле 1 
delay (25);
  digitalWrite(10,0);  //вкл реле 2 
  delay(25);
   digitalWrite(10,1);    //выкл реле 2
  delay(10);
    digitalWrite(9,0);  //вкл реле 3
  delay(25);
   digitalWrite(9,1);    //выкл реле 3
    delay(25);
   digitalWrite(11,1); // выкл реле 1
}
if (b2 ==1){           //если сигнал с оптики приходит,   ||      как эту часть кода запустить
  digitalWrite(12,1); // то включаем  реле 4               ||      на проверку
   delay(22);                                     //    ||    независимо и непрерывно
    digitalWrite(12,0); //и выключаем реле 4                ||    ????
   }}
 
Изменено:

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
в видео уроке где то видел, чтобы не опрашивать пин вручную, там функция что ли какая то создается...
Вы наверное о прерываниях? Но в текущей реализации это не ваш вариант, т.к. на момент выполнения кода по прерыванию - основной код выполнятся не будет (а скорее всего надо, чтобы выполнялся без длительных задержек).
Самым правильным решением будет избавиться от "delay".

*** Привел ваш текущий код в лучший вид
Код:
// Определяем тригге реле, чтобы можно было поменять 1 раз тут, а не во всем скетче
#define TRIGGER LOW   // TRIGGER - включаем реле, !TRIGGER - выключаем реле

// Определяем пины кнопоки, холла и реле (чтобы в случае чего менять тут)
const int button = 5;
const int holl = 8;
const int relay1 = 11;
const int relay2 = 10;
const int relay3 = 9;
const int relay4 = 12;

// Определяем задержки
const int period1 = 25;
const int period2 = 10;
const int period3 = 22;


void setup() {
  pinMode(button, INPUT_PULLUP);  // Кнопка
  pinMode(relay1, OUTPUT );//  реле 1
  pinMode(relay2, OUTPUT); //   реле 2
  pinMode(relay3, OUTPUT);   //  реле 3
  pinMode(holl, INPUT_PULLUP); //оптический датчик  ((HOLL))
  pinMode(relay4, OUTPUT); // реле 4

  digitalWrite(relay1, !TRIGGER);  // задаем уровень сигнала
  digitalWrite(relay2, !TRIGGER);    // --||--
  digitalWrite(relay3, !TRIGGER);     // --||--
  digitalWrite(relay4, !TRIGGER);     // --||--

}

void loop() {
  boolean b1 = !digitalRead(button);
  boolean b2 = !digitalRead(holl);

  if (b1) {          //если кнопка нажата
    digitalWrite(relay1, TRIGGER); // вкл реле 1
    delay(period1);
    digitalWrite(relay2, TRIGGER);  //вкл реле 2
    delay(period1);
    digitalWrite(relay2, !TRIGGER);    //выкл реле 2
    delay(period2);
    digitalWrite(relay3, TRIGGER);  //вкл реле 3
    delay(period1);
    digitalWrite(relay3, !TRIGGER);    //выкл реле 3
    delay(period1);
    digitalWrite(relay1, !TRIGGER); // выкл реле 1
  }
  if (b2) {           //если сигнал с оптики приходит,   ||      как эту часть кода запустить
    digitalWrite(relay4, !TRIGGER); // то включаем  реле 4               ||      на проверку
    delay(period3);                                     //    ||    независимо и непрерывно
    digitalWrite(relay4, TRIGGER); //и выключаем реле 4                ||    ????
  }
}
Ваша задача сейчас - изучить работу с таймерами, разобраться в конструкции if else (или switch), далее подключить библиотеку с кнопкой (где будет включен антидребезг).
С таймерами можете попробовать эту библиотеку
 
Изменено:
  • Лойс +1
Реакции: Foton

Foton

✩✩✩✩✩✩✩
16 Сен 2021
4
0
спасибо, прерывание вроде самое то, (в данной схеме приоритет точности на датчике холла)
но, вот дичь какая, вся электроника ардуино, реле, стабилизаторы напряжения и высоковольтная китайская катушка в 40 киловольт на выходе, с питанием 5 Вольт 4 Ампера , все это находятся на площади в 2 ладони , ,

и от щелканья реле, провод(10 см спец провод)вставленный в ардуино борд на пин 3 (прерывания) ловит наводку как антенна и дает сигнал на работу,
пробывал подтягивать пин резистором 5 Ком и 10 Ком
и тут вопрос,не сгорит ли ардуинка от того что начну подбирать сопротивление по номиналу вплоть до ~12 ом(край)
или как обойти наводку на пин ,не прибегая к фольге??))

C++:
// Определяем тригге реле, чтобы можно было поменять 1 раз тут, а не во всем скетче
#define TRIGGER LOW   // TRIGGER - включаем реле, !TRIGGER - выключаем реле

// Определяем пины кнопоки, холла и реле (чтобы в случае чего менять тут)
const int button = 5;
\\const int holl = 8;         тут теперь пин 3 (прерывания)
const int relay1 = 11;
const int relay2 = 10;
const int relay3 = 9;
const int relay4 = 12;

// Определяем задержки
const int period1 = 25;
const int period2 = 10;
const int period3 = 22;
volatile boolean flag;

void setup() {
  pinMode(button, INPUT_PULLUP);  // Кнопка
  pinMode(relay1, OUTPUT );//  реле 1
  pinMode(relay2, OUTPUT); //   реле 2
  pinMode(relay3, OUTPUT);   //  реле 3
  pinMode(holl, INPUT_PULLUP); //оптический датчик  ((HOLL))
  pinMode(relay4, OUTPUT); // реле 4

  digitalWrite(relay1, !TRIGGER);  // задаем уровень сигнала
  digitalWrite(relay2, !TRIGGER);    // --||--
  digitalWrite(relay3, !TRIGGER);     // --||--
  digitalWrite(relay4, !TRIGGER);     // --||--

  pinMode(3,INPUT_PULLUP); // пин 3 (прерывания)
  attachInterrupt(1, myHoll, CHANGE); //пусть срабатывает на любые изменения сигнала..
}

void loop() {
  boolean b1 = !digitalRead(button);
// boolean b2 = !digitalRead(holl);   временно выкл т.к myHoll
if (flag){
   digitalWrite(relay4, !TRIGGER); // то включаем  реле 4 (holl)          
    delay(period3);                                    
    digitalWrite(relay4, TRIGGER); //и выключаем реле 4  (holl)
    flag = 0;
}
  if (b1) {          //если кнопка нажата
    digitalWrite(relay1, TRIGGER); // вкл реле 1
    delay(period1);
    digitalWrite(relay2, TRIGGER);  //вкл реле 2
    delay(period1);
    digitalWrite(relay2, !TRIGGER);    //выкл реле 2
    delay(period2);
    digitalWrite(relay3, TRIGGER);  //вкл реле 3
    delay(period1);
    digitalWrite(relay3, !TRIGGER);    //выкл реле 3
    delay(period1);
    digitalWrite(relay1, !TRIGGER); // выкл реле 1      
  }
}
void myHoll(){
  flag = 1;
}
а, да, еще delay на millis переточить,...чуь позже, пока не актуально..
 

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
@Foton, наблюдал реле с полной развязкой через оптопару (убираете джампер и подключаете БП), естественно питать их надо от совсем другого источника. Ну или пробовать твердотельные реле, от них помех быть не должно. Но может кто еще чего посоветует
 

Foton

✩✩✩✩✩✩✩
16 Сен 2021
4
0
а касательно твердотельных релюх,... изначально все на них и планировалось делать,..
только тут :1 реле действует на соленойд
2 реле -другой соленойд
а 2 остальных реле управляют 2х проводным электроприводом автозамка (
такс казать драйвер для сервопривода чтоле)))
мне кажется замена реле на твердотельное тут невозможно, или как минимум нужны нпн и пнп мосфеты, чтобы серву очень быстро крутить туды-сюды
а с одинаковыми твердотелыми релюхами что то не выходит..аж мосты диодные кумекал всякие...
что скажете ? есть вариант перевести на твердотельные ??? или стоит докупить драйвера для сервов, да мосфетоф заодно обратноуровневых относительно имеющихся..??))
 

kostyamat

★★★★★★✩
29 Окт 2019
1,098
631
и от щелканья реле, провод(10 см спец провод)вставленный в ардуино борд на пин 3 (прерывания) ловит наводку как антенна и дает сигнал на работу,
Чем управляет это реле? Реле - это модуль, или вы сами что-то паяли? Если паяли сами, есть ли снабберный диод в цепи катушки реле?
пробывал подтягивать пин резистором 5 Ком и 10 Ком
Куда подтягивали, к земле или +5в? Ставить резистор менее 1кОМ не стоит, куда бы не подтягивали. Можно поставить также два диода. Первый - анод к земле, катод к пину, второй - анод к пину, катод к +питания. Это так же может убрать импульсные помехи.
 
  • Лойс +1
Реакции: Foton

Foton

✩✩✩✩✩✩✩
16 Сен 2021
4
0
...вся приблуда использовалась стандартная китайская,
© Ставить резистор менее 1кОМ не стоит (y)
© Можно поставить также два диода (y)
всем спасибо,нашел тут ответы на все интересующие вопросы))
темный лес неясного еще впереди и вопросы еще будут, а мы продолжаем эксперименты))
IMG_20210919_165144.jpg
 

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
@Foton, Это макет, или вы принципиально не паяете?)
Чем дольше смотрю, тем больше вопросов и меньше ответов. Что это и зачем? Если не секрет, конечно)