Есть код на ардуино не получается добавить задуманное в код

код для Ардуино UNO
изменить код для открытия закрытия раздвижных дверей
необходимо чтобы только при закрытии, датчик ультразвуковой( при повторном приближении) или датчик инфракрасный (при разрыве ) двигатель возвращался назад на то количество шагов которые он уже при закрытий прошел
На данный момент при приближении к датчику ультразвука двери открываются на заданное количество шагов двигателя, затем задержка и двери закрываются на тоже количество шагов двигателя.

#include <Ultrasonic.h>
int sound = 500;
int distance = 0;

Ultrasonic ultrasonic(7, 8);

//Пины управления шаговиком
#define STEP_PIN         2
#define DIR_PIN          3
#define ENABLE_PIN       4



//Здесь можно настроить время поворота и паузы
#define move_forward_time 3000    //время прямого хода в мсек
#define move_back_time 3000       //время обратного хода в мсек
#define pause_time 4000           //время паузы в мсек
#define frequency 1000           //Время между импульсами в мксек. 1000 мксек = 1 мсек = 0.001 сек. Частота следования импульсов 1/0.001 = 1 кГц, 
//Не рекомендуется устанавливать время меньше 100 мсек, т.к. частота будет 10 кГц


uint32_t timer = 0;//Таймер для millis()

//Логический флаг для рабочего режима
bool flag = 0;

void setup() 
{

  pinMode(STEP_PIN   , OUTPUT);       //Настраиваем пины управления
  pinMode(DIR_PIN    , OUTPUT);
  pinMode(ENABLE_PIN , OUTPUT);

  digitalWrite(ENABLE_PIN , HIGH);    //Выключаем мотор, чтобы не грелся
}

void loop () 


{  distance = ultrasonic.distanceRead();
  if (distance < 40 ) {       //Если нажали на кнопку
    digitalWrite(ENABLE_PIN , LOW);       //Включаем мотор
    flag = 1;                             //Активируем флаг рабочего режима
    timer = millis();                     //Запускаем таймер
  }

  if (flag) {                                 //Если флаг активирован
    digitalWrite(DIR_PIN    , HIGH);         //Задаем направление вращения

       for (int i = 0; i < 3200; i++) {          //Выполняем нужное число шагов 200*16 = 3200 шагов оборот
          digitalWrite(STEP_PIN    , HIGH);
          delayMicroseconds(frequency);
          digitalWrite(STEP_PIN    , LOW);
        }
         

          delay(pause_time);                        //Пауза pause_time мсек
          
          digitalWrite(DIR_PIN    , LOW);        //Крутим движок move_back_time мсек
         for (int i = 0; i < 3200; i++) {          //Выполняем нужное число шагов 200*16 = 3200 шагов оборот
          digitalWrite(STEP_PIN    , HIGH);
          delayMicroseconds(frequency);
          digitalWrite(STEP_PIN    , LOW);
        }
        flag = 0;

    digitalWrite(ENABLE_PIN , HIGH);        //Выключаем движок, чтобы не грелся
  }
}
введите или вставьте сюда код

По бюджету 2000 рублей Ну как говорится если что пишите свои условия

могу помочь со скетчем, пишите fridgetester@mail.ru

“датчик инфракрасный” в коде не обнаружен.
Поясните, что вы имели в виду.

Нажали на кнопку? дистанционно, что ли?

Да я его еще не добавил

[quote=“MMM, post:5, topic:15563, full:true”]

его тоже должен соискатель добавить?

нет щас добавлю

я вас еще в личке спросил - можно пин STEP_PIN шаговика перекинуть на другой номер или он фиксирован?

Да можно изменить конечно они наверху пины 2,3,4

#include <Ultrasonic.h>
int sound = 500;
int distance = 0;

Ultrasonic ultrasonic(7, 8);

//Пины управления шаговиком
#define STEP_PIN         2
#define DIR_PIN          3
#define ENABLE_PIN       4

//Пин ИК датчик
#define start_button 6

//Здесь можно настроить время поворота и паузы
#define move_forward_time 3000    //время прямого хода в мсек
#define move_back_time 3000       //время обратного хода в мсек
#define pause_time 4000           //время паузы в мсек
#define frequency 1000           //Время между импульсами в мксек. 1000 мксек = 1 мсек = 0.001 сек. Частота следования импульсов 1/0.001 = 1 кГц, 
//Не рекомендуется устанавливать время меньше 100 мсек, т.к. частота будет 10 кГц


uint32_t timer = 0;//Таймер для millis()

//Логический флаг для рабочего режима
bool flag = 0;

void setup() 
{
  pinMode(start_button, INPUT_PULLUP);  //Подтягиваем ИК датчик к питанию
  pinMode(STEP_PIN   , OUTPUT);       //Настраиваем пины управления
  pinMode(DIR_PIN    , OUTPUT);
  pinMode(ENABLE_PIN , OUTPUT);

  digitalWrite(ENABLE_PIN , HIGH);    //Выключаем мотор, чтобы не грелся
}

void loop () 


{  distance = ultrasonic.distanceRead();
  if (distance < 40 || !digitalRead(start_button)) {       //Если УЗД меньше 40 см || ИК датчик поставил на включение потому что не знаю куда его поставить на этом задании
    digitalWrite(ENABLE_PIN , LOW);       //Включаем мотор
    flag = 1;                             //Активируем флаг рабочего режима
    timer = millis();                     //Запускаем таймер
  }

  if (flag) {                                 //Если флаг активирован
    digitalWrite(DIR_PIN    , HIGH);         //Задаем направление вращения

       for (int i = 0; i < 3200; i++) {          //Выполняем нужное число шагов 200*16 = 3200 шагов оборот
          digitalWrite(STEP_PIN    , HIGH);
          delayMicroseconds(frequency);
          digitalWrite(STEP_PIN    , LOW);
        }
         

          delay(pause_time);                        //Пауза pause_time мсек
          
          digitalWrite(DIR_PIN    , LOW);        //Крутим движок move_back_time мсек
         for (int i = 0; i < 3200; i++) {          //Выполняем нужное число шагов 200*16 = 3200 шагов оборот
          digitalWrite(STEP_PIN    , HIGH);
          delayMicroseconds(frequency);
          digitalWrite(STEP_PIN    , LOW);
        }
        flag = 0;

    digitalWrite(ENABLE_PIN , HIGH);        //Выключаем движок, чтобы не грелся
  }
}
Вот скейтч с ИК датчиком только я его добавил во включение двигателя открытие так как не знаю куда его поставить же

Вот скейтч с ИК датчиком только я его добавил во включение двигателя открытие так как не знаю куда его поставить же

не успели
Я уже написал код с Ультрасоником без датчика

#include <Ultrasonic.h>
int sound = 500;
int distance = 0;

Ultrasonic ultrasonic(7, 8);

//Пины управления шаговиком
#define STEP_PIN         11
#define DIR_PIN          3
#define ENABLE_PIN       4


// уровни пина DIR для открывания и закрывания
#define OPEN_DOOR HIGH
#define CLOSE_DOOR LOW



//Здесь можно настроить число шагов и время паузы
#define STEPS 3200                //число шагов для открывания или закрывания
#define pause_time 4000           //время паузы в мсек
//#define frequency 1000           //Время между импульсами в мксек - ФИКСИРОВАНО!!

//Логический флаг для рабочего режима
bool flag = 0;
//Флаг "мотор в работе"
volatile bool stepper_in_progress = 0;
volatile uint16_t step_cnt = 0;

// настройка таймера2 на генерацию импульсов с частотой 1 Кгц на пине 11
void setup_timer2() {
  // stop the timer
  TCCR2B = 0; TCNT2 = 0;
  // set PWM for 50% duty cycle
  OCR2A = 128;
  // set fast PWM Mode
  TCCR2A = (1 << WGM21) | (1 << WGM20);
  // set none-inverting mode
  TCCR2A |= (1 << COM2A1);
  /* Clear pending interrupts */
  TIFR2   = 1 << TOV2;
  /* Enable Timer 2 Overflow Interrupt */
  TIMSK2  = 1 << TOIE2;
  // set prescaler 64 and start the timer
  TCCR2B |= (1 << CS22);
}
// обработчик прерывания по переполнению таймера2
// при каждом прерывании уменьшаем счетчик, по достижении нуля выключаем ШИМ
ISR(TIMER2_OVF_vect)
{
  if (step_cnt) step_cnt--;
  else  {
    TCCR2B = 0;  // stop the timer
    stepper_in_progress = 0;
  }
}

// двигать шаговый в фоне на заданное число шагов в заданном направлении
// на время движения выставить флаг stepper_in_progress = 1
void move_stepper_async(uint8_t dir, uint16_t steps) {
  digitalWrite(DIR_PIN    , dir);
  step_cnt = steps;
  stepper_in_progress = 1;
  setup_timer2();
}

// остановить шаговый и вернуть НЕПРОЙДЕННОЕ число шагов
uint16_t stop_stepper() {
  if (stepper_in_progress) {
    TCCR2B = 0;  // stop the timer
  }
  uint16_t tmp = step_cnt;
  step_cnt = 0;
  stepper_in_progress = 0;
  return tmp;
}

void setup()
{

  pinMode(STEP_PIN   , OUTPUT);       //Настраиваем пины управления
  pinMode(DIR_PIN    , OUTPUT);
  pinMode(ENABLE_PIN , OUTPUT);

  digitalWrite(ENABLE_PIN , HIGH);    //Выключаем мотор, чтобы не грелся
}

void loop ()


{
  distance = ultrasonic.distanceRead();

  if (distance < 40 ) {       //Если нажали на кнопку
    digitalWrite(ENABLE_PIN , LOW);       //Включаем мотор
    flag = 1;                             //Активируем флаг рабочего режима
  }

  if (flag) {                                 //Если флаг активирован
    move_stepper_async(OPEN_DOOR, STEPS);     //Включаем мотор в направлении OPEN_DOOR на STEPS шагов
    while (stepper_in_progress) {
      
      delay(10);                              //ждем окончания движения, 
                                              //в это время можно делать что-то полезное
    }
    delay(pause_time);                        //Пауза pause_time мсек
   
    move_stepper_async(CLOSE_DOOR, STEPS);    //Включаем мотор в направлении CLOSE_DOOR на STEPS шагов
    
    while (stepper_in_progress) {             // пока мотор движется
      distance = ultrasonic.distanceRead();       //проверяем дистанцию
      if (distance < 40 ) {                         // если есть препятствие
        uint16_t steps_to_close = stop_stepper();   // останавливаем мотор и запоминаем число шагов
        move_stepper_async(OPEN_DOOR, STEPS - steps_to_close); //откатываем мотор обратно на пройденные шаги
        while (stepper_in_progress) delay(10);      //ждем окончания движения
      }
    }
  }
  flag = 0;

  digitalWrite(ENABLE_PIN , HIGH);        //Выключаем движок, чтобы не грелся
}

Пояснение - управление шаговиком асинхронно (то есть независимо от основного кода) посредством ШИМ на таймере2.

Пин STEP шаговика должен быть на пине 11
Частота шагов фиксирована, примерно 1 кГЦ

Update - исправил опечатку в 61 строке
Дополнение2 - еще раз исправил

Спасибо ! Первый код не сработал щас попробую дополненый .
Дайте сберкарту или номер к нему

Учтите, что этот код - заготовка, демонстрация способа решения, а не готовое практическое решение.

да, спасибо конечно я уже столкнулся с проблемой логику не до конца описал и получилось. Не много не так

интересно, почему код выкладывается без цветной подсветки синтаксиса?

Проверил опытным путем - подсветка работает только для кодов примерно 18-20 строк и менее, при более длинном коде все черное

Кажется допер внизу ведь просто прописать на закрытие move_stepper_async(CLOSE_DOOR, STEPS);
и работает . Спасибо!!! все равно я должен отблагодарить .

неправильно. Он тогда будет закрываться независимо от показаний утрасоник-датчика.

Я же вам в личку выложил исправленный код, вы что, не читаете сообщения?