#1 Re: Програмування Arduino » Як правильно перервати цикл? » 2023-03-19 23:00:07

B21
гоcть пише:

Внимание вопрос: Что будет, если нажать на кнопку, когда датчик Холла стоит на магните?  lol

Магнит никогда не станет на датчике холла, даже после срабатывания датчика холла моторчик по инерции проворачивает магнит за его пределы, нереально что бы мотор остановил магнит напротив датчика, ну а что бы перестраховаться можно после срабатывания датчика добавить задержку 0.2 - 0.4сек, но тогда мотор стартовать будет с другой точки.

#2 Re: Програмування Arduino » Як правильно перервати цикл? » 2023-03-18 22:49:56

B21
г0cть пише:
B21 пише:

Снова не сработало реле

Вот схема подключения

С такой схемой и не будет. Код не соответствует схеме. По схеме кнопка замыкается на землю, у вас в коде (и соотв. у меня) на +. Что за датчик? Когда он срабатывает приходит + или 0?

int hollPin = 6;
int MotorPin = 4;
int PrivodPin = 2;
bool flag = 0;

void setup() {
  Serial.begin(9600);
  pinMode(MotorPin, OUTPUT);
  digitalWrite(MotorPin, HIGH);
  pinMode(PrivodPin, INPUT_PULLUP);
  pinMode(hollPin, INPUT_PULLUP);

}
void loop() {

  if (!digitalRead(PrivodPin) && !flag) {
    digitalWrite(MotorPin, LOW);
    flag = 1;
  }
  if (!digitalRead(hollPin) && flag) digitalWrite(MotorPin, HIGH);

  if (digitalRead(PrivodPin) && flag)flag = 0;

}

на схеме в симуляторе: переключатель - кнопка, кнопка -датчик
https://wokwi.com/projects/359522045614208001

з/ы ну и дребезг никто не отменял  smile

Кароч походу датчик холла по одному месту пошел, поставил новый цифровой датчик A3144, при срабатывании приходит 0. Последняя версия твоего кода рабочая единственное что убрал PULLUPпы, резисторы оба оставил и добавил delay(10); после if (!digitalRead(PrivodPin) && !flag) {.
Моя версия кода тоже сработала, правда и в одной и другой версии +3000мс не сработали, то есть если датчик холла не сработает то мотор будет крутится бесконечно. 3 сек была тип защита, или датчик или время, и получается что датчик холла отключается только тогда когда замкнута кнопка, а если вдруг кнопка отожмется назад то датчик холла не сработает и будет ждать сначала нажатую кнопку а потом сработает...
А так всем огромное спасибо за помощь)

#3 Re: Програмування Arduino » Як правильно перервати цикл? » 2023-03-17 23:40:41

B21
г0cть пише:

Если правильно понял алгоритм, то как-то так

int hollPin = 6;
int MotorPin = 4;
int PrivodPin = 2;
bool flag = 0;

void setup() {
  Serial.begin(9600);
  pinMode(MotorPin, OUTPUT);
  digitalWrite(MotorPin, HIGH);
  pinMode(PrivodPin, INPUT);
  pinMode(hollPin, INPUT);

}
void loop() {

  if (digitalRead(PrivodPin) && !flag) {
    digitalWrite(MotorPin, LOW);
    flag = 1;
  }
  if (digitalRead(hollPin) && flag) digitalWrite(MotorPin, HIGH);

  if (!digitalRead(PrivodPin) && flag)flag = 0;

}

Снова не сработало реле, почему то светодиод промигивает на 20% яркости и все - такое ощущение что контакт плохой, НО когда заливаешь предыдущий скетч без while - светодиод загорается на полную и реле работает как надо.
Если бы был плохой контакт - никакой бы скетч не заработал, а так даже через setup включаешь, 5 сек и выключаешь - все работает.
Вот схема подключения
sxem1.png

#4 Re: Програмування Arduino » Як правильно перервати цикл? » 2023-03-17 19:15:55

B21
Roman1984 пише:

Обратите внимание, что внутри цикла while(true) переменная currentTime и переменная startTime уже не зависят от millis() и как следствие не меняются.

int hollPin = 6;
int MotorPin = 4;
int PrivodPin = 2; 
int FlagOld = 0;
int FlagNew = 0;

unsigned long currentTime;    
unsigned long startTime;

void setup() {
  Serial.begin(9600);
  pinMode(MotorPin, OUTPUT);
  digitalWrite(MotorPin, HIGH);
  pinMode(PrivodPin, INPUT);
  digitalWrite(PrivodPin, LOW);
  pinMode(hollPin, INPUT);
  currentTime = millis();       
  startTime = currentTime;  
  
}
void loop() {
 FlagNew = digitalRead(PrivodPin);
  if (FlagOld != FlagNew && FlagNew == 1) {
    digitalWrite(MotorPin, LOW);    
    while(true){
        currentTime = millis(); 
        if (digitalRead(hollPin) == HIGH || (currentTime == startTime + 3000)) {
      break;
      } 
    }

  digitalWrite(MotorPin, HIGH);
  FlagOld = FlagNew;
  }
  else if (FlagOld != FlagNew)
    FlagOld = FlagNew;
  }

Немного изменил переменные но реле все равно не включается...

В моей предыдущей версии кода реле работало но не было того самого цикла который прерывал работу реле после срабатывания датчика холла. Собственно вместо

delay(2000);

и был написан цикл но реле на нем не включается а лампочка на нем слегка промигивает как будто контакт плохой...

//рабочая версия без цикла
FlagNew = digitalRead(PrivodPin);
  if (FlagOld != FlagNew && FlagNew == 1) {
    digitalWrite(MotorPin, LOW);
    delay(2000);
    digitalWrite(MotorPin, HIGH);
    FlagOld = FlagNew;
    Serial.println(FlagNew);
  }
  else if (FlagOld != FlagNew)
    FlagOld = FlagNew;

#5 Програмування Arduino » Як правильно перервати цикл? » 2023-03-17 11:56:26

B21
відповідей: 14

Всім привіт, підкажіть, як правильно перервати цикл.
Принцип роботи коду:
Натискаєш кнопку – вмикається реле – після спрацьовування датчика холу – вимикається реле, кнопка весь цей час натиснута – відпускаєш кнопку – нічого не відбувається – далі натискаєш і все по колу.
Без циклу while(true) - реле вмикається натисканням кнопки ,
з циклом - на реле злегка спалахує лампочка включення і все.
Як правильно зробити переривання?

int hollPin = 6;
int MotorPin = 4;
int PrivodPin = 2; 
int FlagOld = 0;
int FlagNew = 0;


void setup() {
  Serial.begin(9600);
  pinMode(MotorPin, OUTPUT);
  digitalWrite(MotorPin, HIGH);
  pinMode(PrivodPin, INPUT);
  digitalWrite(PrivodPin, LOW);
  pinMode(hollPin, INPUT);
  
}
void loop() {
 FlagNew = digitalRead(PrivodPin);
  if (FlagOld != FlagNew && FlagNew == 1) {
    digitalWrite(MotorPin, LOW);    
    unsigned long currentTime = millis();    
    unsigned long startTime = millis();
    while(true){
        if (digitalRead(hollPin) == HIGH || (currentTime == startTime + 3000)) {
      break;
      } 
    }

  digitalWrite(MotorPin, HIGH);
  FlagOld = FlagNew;
  }
  else if (FlagOld != FlagNew)
    FlagOld = FlagNew;
  }

#6 Програмування Arduino » Проблемы с Max7219 » 2022-12-28 17:14:53

B21
відповідей: 0

Всем привет, подскажите в чем проблема? В общем подключал к драйверу Max7219 отдельно 8 светодиодов, SEG"и на аноды а катоды на DIG 0, с 8 синими светодиодами все работает и управляется, подключаешь 8 зеленых или 8 красных/желтых - не работает, то есть при включении загораются и горят на одном уровне не реагируя ни на что. (между ISET и +5в стоит резистор 10ком)

Підвал форуму