Подскажите новичку

Sharlatan
Offline
Зарегистрирован: 12.08.2016
//имитатор датчика глубины
#define SK_PLUS 13                 //импульсы по одному проводу (датчик вращается по часовой)
#define SK_MINUS 12                //импульсы по другому проводу (датчик вращается против часовой)
#define LED 11                     //светодиод индикатор 10 оборотов

void setup()
{
  pinMode(SK_MINUS, OUTPUT);
  pinMode(SK_PLUS, OUTPUT);
  pinMode(LED, OUTPUT);
}

void loop()
{
  for (int x = 0; x < 100; x++) {
    digitalWrite(SK_PLUS, HIGH);
    delay(100);
    digitalWrite(SK_PLUS, LOW);
    delay(100);

    if (x == 10 ) {                 //моргает через 10 циклов for всего один раз
      digitalWrite(LED, HIGH);      //как сделать, что бы через каждые 10 метров(циклов)
      delay(100);                   //вспыхивал светодиод
      digitalWrite(LED, LOW);
      delay(100);
    }
  }
  for (int y = 0; y < 100; y++) {
    digitalWrite(SK_MINUS, HIGH);
    delay(100);
    digitalWrite(SK_MINUS, LOW);
    delay(100);

    if (y == 10, 20, 30, 40, 50) {
      digitalWrite(LED, HIGH);
      delay(100);
      digitalWrite(LED, LOW);
    }
  }
}

__Alexander
Offline
Зарегистрирован: 24.10.2012

 if (x % 10 == 0)

Sharlatan
Offline
Зарегистрирован: 12.08.2016

Спасибо огромное

Sharlatan
Offline
Зарегистрирован: 12.08.2016

Подскажите пожалйуста как этот код написать без delay?

Radjah
Offline
Зарегистрирован: 06.08.2014
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуйте сменить подход. Вот Вам пример для спуска, для подема напишите сами. Код делает тоже что и for но не вешает систему

//имитатор датчика глубины
#define SK_PLUS 13                 //импульсы по одному проводу (датчик вращается по часовой)
#define SK_MINUS 12                //импульсы по другому проводу (датчик вращается против часовой)
#define LED 11                     //светодиод индикатор 10 оборотов
unsigned long currentTime; //Переменная для pause
int spusk = 0;
int podem = 0;
int var = 0;

void setup()
{
  pinMode(SK_MINUS, OUTPUT);
  pinMode(SK_PLUS, OUTPUT);
  pinMode(LED, OUTPUT);
}

//Функция pause
int pause(int y)
{
  static bool fl_pause = 0;
  bool x = 0;
  if (fl_pause == 0)currentTime = millis(), fl_pause = 1;
  if (millis() - currentTime >= y) x = 1, fl_pause = 0;
  return x;
}

void loop()
{
  if (spusk < 100)
  {
    switch (var) {
      case 0:
        spusk ++;
        digitalWrite(SK_PLUS, HIGH);
        if (spusk % 10 == 0)digitalWrite(LED, HIGH);
        var = 1;
        break;
      case 1:
        if (pause(100))
        {
          digitalWrite(SK_PLUS, LOW);
          if (spusk % 10 == 0)digitalWrite(LED, LOW);
          var = 2;
        }
        break;
      case 2:
        if (pause(100))
        {
          var = 0;
        }
        break;
    }
  }

}

 

Sharlatan
Offline
Зарегистрирован: 12.08.2016

Во первых, спасибо за правильный вектор 

//имитатор датчика глубины
#define SK_PLUS 11 //импульсы по одному проводу (датчик вращается по часовой)
#define SK_MINUS 12 //импульсы по другому проводу (датчик вращается против часовой)
#define LED 13 //светодиод индикатор 10 оборотов
unsigned long currentTime; //Переменная для pause
int spusk = 0; //переменная спуск
int podem = 0; //переменная подъем
int var = 0; //общая переменная

void setup()
{
  pinMode(SK_MINUS, OUTPUT); //вывод ШК+
  pinMode(SK_PLUS, OUTPUT); //вывод ШК-
  pinMode(LED, OUTPUT); //метки глубины
}

//Функция pause
int pause(int y)
{
  static bool fl_pause = 0;
  bool x = 0;
  if (fl_pause == 0)currentTime = millis(), fl_pause = 1;
  if (millis() - currentTime >= y) x = 1, fl_pause = 0;
  return x;
}

void loop()
{
  if (spusk < 100)                                          //если циклов спуск меньше 100
  {
    switch (var) {                                          //то начинаем сравнивать переменную вар
      case 0:                                               //выполняем когда var = 0
        spusk ++;                                           //добавляем к переменной(циклу) спуск +1
        digitalWrite(SK_PLUS, HIGH);                        //уровень +5 на выходе ШК+
        if (spusk % 10 == 0)digitalWrite(LED, HIGH);        //метки глубины
        var = 1;                                            //переменной var присваивается значение 1
        break;                                              //выход из цикла
      case 1:                                               //выполняется когда var = 1
        if (pause(100))                                     //если пауза 100 
        {
          digitalWrite(SK_PLUS, LOW);                        //уровень 0 на выходе ШК+
          if (spusk % 10 == 0)digitalWrite(LED, LOW);        //метки глубины
          var = 2;                                           //переменной var при сваевается значение 2
        }
        break;                                               //выход из цикла
      case 2:
        if (pause(100))
        {
          var = 0;
        }
        break;
    }
  }
  if (spusk == 100)                                          //если циклов "спуск" ровно 100
  {
    switch (var) {                                          //то мы делаем
      case 0:                                               //выполняется когда var = 0
        podem ++;                                           //добавляем к циклу спуск +1
        digitalWrite(SK_MINUS, HIGH);                       //уровень +5 на выходе ШК+
        if (podem % 10 == 0)digitalWrite(LED, HIGH);        //метки глубины
        var = 1;                                            //переменной var присваивается значение 1
        break;                                              //выход из цикла
      case 1:                                               //выполняется когда var = 1
        if (pause(100))
        {
          digitalWrite(SK_MINUS, LOW);                       //уровень 0 на выходе ШК+
          if (podem % 10 == 0)digitalWrite(LED, LOW);        //метки глубины
          var = 2;                                           //переменной var при сваевается значение 2
        }
        break;                                               //выход из цикла
      case 2:
        if (pause(100))
        {
          var = 0;
        }
        break;
    }
    if (podem == 100) {                                      //если циклов подъем равняется 100
      spusk = 0;                                             //то приравниваем переменную спуск со 100 на 0
      podem = 0;                                             //и приравниваем переменную подьём со 100 на 0
    }
  }
}

объясните пожалуйста, если вас не затруднит что происходит в 39 и 47 строке 

if (pause(100)) 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Sharlatan. попробую я объяснить.Хотя vosara код другой, но подход тот же.

Вoт код Blink

void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
}
void loop() {
  digitalWrite(13, HIGH); 
  delay(1000);   
  digitalWrite(13, LOW);  
  delay(1000); 
} 

На что уходит мощь процессора ? На паузы delay. А вот этот код

const int out_pin=13;// нога LED
uint8_t stat = 0;

void setup() {
  pinMode(out_pin, OUTPUT);
  digitalWrite(out_pin, stat);
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  static uint32_t future1 = 0 ;
  if (MILLIS>=future1) {
  future1 = MILLIS + 1000 ; // вычислит. поток 1 действует раз в 1000 миллисекунд.
    // код потока 1
  stat =!stat;
  digitalWrite(out_pin, stat);   
  }
 }

На постояную проверку millis.

берем аналогию. У вас есть часы и вы пытаетесь организовать работу по разгрузке машин. Машины приходят по 1 в час. Можно постоянно торчать на месте разгрузки машин . А можно разгрузить машину и свалить с места разгрузки , но поглядывать на часы. Вот это и есть millis(). Но есть маленькая заморочка. Если вы  подрядились на почасовую разгрузку машин, вы не можете пойти на весь день на рыбалку. Точнее можете. Но вам придется бегать как Фигаро тут, Фигаро там. Так это я к чему. Программы с millis любят циклы с for. Особенно если они долгие. Вот и приходится размыкать такие циклы. Откладывать следующий проход цикла for, на следующий проход цикла loop. 

 

 

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

С 18й по 25ю строчки написана функция паизы "int pause(int y)"  построеная не на "делай" - которая останавлюет систему а на милис, вот к ней мы и обращаемся не тормозя систему, задав паузу в 100 мс  " " номожно задать любое число. После 100 мс возвращается 1 разрешая нам выполнить код в блоке if (pause(100)) {}