Автоматические рулонные шторы

unlimiter77

✩✩✩✩✩✩✩
30 Янв 2020
6
0
Меня зовут Павел, в программировании конечно же новичок. Сделал по многочисленным примерам из сети автоматические рулонные шторы. Алгоритм: после включения 2 шторы поднимаются вверх пока не упрутся в концевики.
После есть 4 режима:
0-й автоматический по датчику света по умолчанию. Светло - открываются, темно закрываются.
1й- две шторы одновременно пульта ДУ или с кнопок на корпусе вверх-вниз;
2й- одна штора с пульта ДУ или с кнопок на корпусе вверх-вниз;
3й- вторая штора с пульта ДУ или с кнопок на корпусе вверх-вниз;


индикация режимов: оба светодиода не горят режим 0 автомат
оба светодиода горят режим 3, две шторы вместе вручную
по одному- первая или вторая штора отдельно вручную

Работает все замечательно за исключением кнопок на корпусе. Вот код
C++:
//Настройка шаового двиателя------------------------------------------------

#include <CustomStepper.h>            // Подключаем библиотеку управления шаговым двигателем. По умолчанию настроена на двигатель 28BYJ-48-5V

CustomStepper stepper1(12, 11, 10, 9);  // Указываем пины, к которым подключен драйвер первого шагового двигателя

CustomStepper stepper2(5, 6, 7, 8);    // Указываем пины, к которым подключен драйвер Второго шагового двигателя

#include "IRremote.h"                 // подключаем библиотеку ИК приемника

//--------------------------------------------------------------------------



//Настраиваем дисплей-------------------------------------------------------

//#include <LiquidCrystal_I2C.h>    // Подключаем библиотеку дисплея

//LiquidCrystal_I2C lcd(0x3f,16,2);

//--------------------------------------------------------------------------



//Настройка нижнего и среднего положения штор---------------------------------------------------------------------------------------------------

//

#define niz1 120900   //Число шагов для нижнего положения штора 1

#define niz2 120800   //Число шагов для нижнего положения штора 2                                                                              //



//----------------------------------------------------------------------------------------------------------------------------------------------





//Настройка кнопок----------------------------------------------------------

#include <GyverButton.h>               //Библиотека управления кнопками

#define BTN1 2           // кнопка Вверх подключена к 2 цифровому пину

#define BTN2 14          // кнопка Стоп подключена к 14 цифровому пину

#define BTN3 17          // кнопка Вниз подключена к 17 цифровому пину

GButton Vverh(BTN1);

GButton Stop(BTN2);

GButton Vniz(BTN3);



//Флаги для работы кнопок-----------------------------------------------------

boolean Kvverh = 0;

boolean Kstop = 0;

boolean Kvniz = 0;

boolean Stop1 = 0;

boolean Stop2 = 0;

boolean Flag = 0;



#define svet A1     // подключение датчика света

long schet1 = 0;    //Счетчик шагов первой шторы

long schet2 = 0;    //Счетчик шагов первой шторы

long hagi = 0;

unsigned long time1; //переменная для первого таймера

unsigned long pult;  //переменная для кнопок пульта





word osveh;

byte meny = 0;

int  receiver = 16;                         // Пин на котором сидит ИК приемник

IRrecv irrecv(receiver);                    // Создаём 'irrecv' это ИК приемник

decode_results results;                     // Создаем экземпляр 'decode_results' Это тоже нужно для ИК приемника



void setup() {

  pinMode (4, INPUT_PULLUP);        //Концевик 1 шторы

  pinMode (3, INPUT_PULLUP);        //Концевик 2 шторы

  pinMode (18, OUTPUT);             //светодиод индикации режимов

  pinMode (19, OUTPUT);             //светодиод индикации режимов

  pinMode (A1, INPUT_PULLUP);       //фоторезистор

  pinMode (2, INPUT_PULLUP);

  pinMode (14, INPUT_PULLUP);

  pinMode (17, INPUT_PULLUP);



  irrecv.enableIRIn();      // Инициализация приемника

  Stop1 = digitalRead(4);   //Опрашиваем концевик 1 шторы

  Stop2 = digitalRead(3);   //Опрашиваем концевик 2 шторы

  Serial.begin(9600);



  //Выставляем опрос кнопок в режим АВТО

  Vverh.setTickMode(AUTO);

  Stop.setTickMode(AUTO);

  Vniz.setTickMode(AUTO);



  //Калибровка шторы при включении, поднимаем пока не упремся в концевик

  while (Stop1 == 1 && Stop2 == 1)

  { // Если опущены все шторы то даем команду на подъем всех штор

    stepper1.setDirection(CCW);

    stepper1.rotate();

    stepper2.setDirection(CCW);

    stepper2.rotate();

    delayMicroseconds(850);

    Stop1 = digitalRead(4);

    Stop2 = digitalRead(3);

  }

  while (Stop1 == 1)

  {

    stepper1.setDirection(CCW);

    stepper1.rotate();

    delayMicroseconds(900);

    Stop1 = digitalRead(4);

  }

  while (Stop2 == 1)

  {

    stepper2.setDirection(CCW);

    stepper2.rotate();

    delayMicroseconds(900);

    Stop2 = digitalRead(3);

  }

}

void loop() {

  //Рыбор режима работы (АВТО,РУЧНОЙ)----------------------------------------------------

  if (Stop.isHolded()) {

    if (meny < 3) {

      meny++;

    } else {

      meny = 0;

    }

  }



  //-------------------------------------------------------------------------------------

  if (irrecv.decode(&results))                // Если на ИК приемник пришел сигнал



  {

    Serial.println( results.value );

    switch (results.value)                  // Значеник которое пришло на ИК приемник будет в results.value



    {



      /-----(Клавиша опускания)-----/

      case 284123805:

        pult = 2;                           // Вызываем функцию опускания шторы

        break;

      /-----(Клавиша поднятия)-----/

      case 284103405:                 

        pult = 1;                           // Вызываем пункцию поднятия шторы

        break;

      /-----(Клавиша стоп)-----/

      case 284137575:                 

        pult = 0;                            // Вызываем пункцию поднятия шторы

        break;



      /-----(Клавиша автоматического определения)-----/

      case 284121255:                 



        meny = 0;              // Режим работы автоматический

        break;

      /-----(Клавиша меню две шторы вместе)-----/

      case 284115135:                 



        meny = 1;              // две шторы одновременно ручные

        break;

      /-----(Клавиша меню 1 штора )-----/

      case 284131455:                 



        meny = 2;              // первая штора ручная

        break;

      /-----(Клавиша меню 2 штора )-----/

      case 284098815:               

        meny = 3;              // вторая штора ручная

        break;

    }



    irrecv.resume();                      // Ждем следующего сигнала от ИК

  }

  //АВтоматический режим работы----------------------------------------------------------





  if (meny == 0) {

    if (millis() - time1 > 1000) {

      time1 = millis();

      digitalWrite (18, 0);

      digitalWrite (19, 0);

      osveh = analogRead(svet);

      osveh = map(osveh, 0, 1023, 1023, 0);





      if (osveh >= 400) {

        hagi = 0;

      }

      if (osveh < 400) {

        hagi = niz1, niz2;

      }

      //Serial.println (osveh);

    }

  }



  if (meny == 1) {

    digitalWrite (18, 1);

    digitalWrite (19, 1);

    if ( Vverh.isClick()) {

      hagi = 0;

      Serial.println( "vverh" );

    }

    if (Vniz.isClick())   {

      hagi = niz1, niz2;

      Serial.println( "vniz" );

    }

    if (Stop.isClick())   {

      hagi = schet1, schet2;

      Serial.println( "stop" );

    }

    /* if (pult == 2)         {

       hagi = niz1, niz2;

      }

      if (pult == 1)         {

       hagi = 0;

      }

      if (pult == 0)         {

       hagi = schet1, schet2;

      }

    */

  }

  if (meny == 2) {

    digitalWrite (18, 1);

    digitalWrite (19, 0);

    if ( Vverh.isClick()) {

      hagi = 0;

    }

    if (Vniz.isClick())   {

      hagi = niz1;

    }

    if (Stop.isClick())   {

      hagi = schet1;

    }

    if (pult == 2)         {

      hagi = niz1;

    }

    if (pult == 1)         {

      hagi = 0;

    }

    if (pult == 0)         {

      hagi = schet1;

    }

  }

  if (meny == 3) {

    digitalWrite (18, 0);

    digitalWrite (19, 1);

    if ( Vverh.isClick()) {

      hagi = 0;



    }

    if (Vniz.isClick())   {

      hagi = niz2;



    }

    if (Stop.isClick())   {

      hagi = schet2;



    }

    if (pult == 2)         {

      hagi = niz2;

    }

    if (pult == 1)         {

      hagi = 0;

    }

    if (pult == 0)         {

      hagi = schet2;

    }

  }





  //Serial.println( pult );



  // Исполнительный код движения штор-----------------------------------------------------



  if (meny == 0 || meny == 1) {

    if (schet1 < hagi && schet2 < hagi )  //Опускание шторы

    { stepper1.setDirection(CW);

      stepper1.rotate();

      stepper2.setDirection(CW);

      stepper2.rotate();

      schet1++;

      schet2++;

      delayMicroseconds(750);

    }

    if (schet1 < hagi && schet2 == hagi )  //Опускание шторы

    { stepper1.setDirection(CW);

      stepper1.rotate();

      stepper2.setDirection(STOP);

      stepper2.rotate();

      schet1++;

      delayMicroseconds(750);

    }

    if (schet1 == hagi && schet2 < hagi )  //Опускание шторы

    { stepper1.setDirection(STOP);

      stepper1.rotate();

      stepper2.setDirection(CW);

      stepper2.rotate();

      schet2++;

      delayMicroseconds(750);



    }



    if (schet1 > hagi && schet2 > hagi )  //Подъем шторы

    { stepper1.setDirection(CCW);

      stepper1.rotate();

      stepper2.setDirection(CCW);

      stepper2.rotate();

      schet1--;

      schet2--;

      delayMicroseconds(800);

    }

    if (schet1 > hagi && schet2 == hagi )  //Подъем шторы

    { stepper1.setDirection(CCW);

      stepper1.rotate();

      stepper2.setDirection(STOP);

      stepper2.rotate();

      schet1--;

      delayMicroseconds(800);

    }

    if (schet1 == hagi && schet2 > hagi )  //Подъем шторы

    { stepper1.setDirection(STOP);

      stepper1.rotate();

      stepper2.setDirection(CCW);

      stepper2.rotate();

      schet2--;

      delayMicroseconds(800);

    }

    if (schet1 > hagi && schet2 < hagi )  //

    { stepper1.setDirection(CCW);

      stepper1.rotate();

      stepper2.setDirection(CW);

      stepper2.rotate();

      schet1--;

      schet2++;

      delayMicroseconds(800);

    }



    if (schet1 < hagi && schet2 > hagi )  //

    { stepper1.setDirection(CW);

      stepper1.rotate();

      stepper2.setDirection(CCW);

      stepper2.rotate();

      schet1++;

      schet2--;

      delayMicroseconds(800);

    }



    if (schet1 == hagi && schet2 == hagi )  //СТОП

    { stepper1.setDirection(STOP);

      stepper1.rotate();

      stepper2.setDirection(STOP);

      stepper2.rotate();

    }

  }

  if (meny == 2) {

    Flag = 0;

    if (schet1 > hagi)  //Подъем шторы

    { stepper1.setDirection(CCW);

      stepper1.rotate();

      stepper2.setDirection(STOP);

      stepper2.rotate();

      schet1--;

      delayMicroseconds(800);

    }

    if (schet1 < hagi)  //Опускание шторы

    { stepper1.setDirection(CW);

      stepper1.rotate();

      stepper2.setDirection(STOP);

      stepper2.rotate();

      schet1++;

      delayMicroseconds(750);

    }

    if (schet1 == hagi)  //СТОП

    { stepper1.setDirection(STOP);

      stepper1.rotate();

      stepper2.setDirection(STOP);

      stepper2.rotate();

    }

  }

  if (meny == 3) {

    while (Flag == 0) {

      hagi = schet2;

      Flag = 1;

    }

    if (schet2 > hagi)  //Подъем шторы

    { stepper2.setDirection(CCW);

      stepper2.rotate();

      stepper1.setDirection(STOP);

      stepper1.rotate();

      schet2--;

      delayMicroseconds(800);

    }

    if (schet2 < hagi)  //Опускание шторы

    { stepper2.setDirection(CW);

      stepper2.rotate();

      stepper1.setDirection(STOP);

      stepper1.rotate();

      schet2++;

      delayMicroseconds(750);

    }

    if (schet2 == hagi)  //СТОП

    { stepper2.setDirection(STOP);

      stepper2.rotate();

      stepper1.setDirection(STOP);

      stepper1.rotate();

    }

  }



}
При удалении части кода для ИК пульта (строки 379-397) кнопки начинают работать так как и должны:

Кнопка Stop при удержании по очереди переключает меню. 0, 1, 2, 3.
Кнопки Vverh и Vniz работают вверх и вниз в режимах 1, 2, 3, кнопка Stop в этих режимах при однократном нажатии останавливает шторы во время движения.

а пульт соответственно перестает работать.

Подскажите в чем проблема, думаю что-то элементарное, но знаний не хватает пока.
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,191
1,281
Москва
1) Код надо оформить в виде кода. и, в данном случае, т.к. он достаточно большой, его лучше скрыть под спойлер. (надо отредактировать сообщение)
2) Прочитав описание, не понял как должны работать кнопки, и как они работают сейчас.
Вот сейчас что бы понять в чем проблема надо перелопатить ВЕСЬ код, что требует времени. Не каждый захочет это делать. Многие глянут и уйдут. Чем подробнее и ПОНЯТНЕЕ опишешь , тем вероятнее тебе помогут.
что такое hagi ?
Когда вставишь код, то напиши номера строк. где обрабатываются нажатия кнопок и сигналы с пульта, что бы не рыскать.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,191
1,281
Москва
вот чему по твоему тут будет равно hagi ?
hagi = niz1, niz2;

Если я правильно понял , то кнопке на корпусе должна соотв. кнопка на пульте ? тогда я бы сделал так:
если ((нажакта кнопка на корпусе) или (нажата соотв. кнопка на пульте)) то сделать то то и то то.
как у тебя
C++:
    if (Vniz.isClick())   {

      hagi = niz1;

    }
...
    if (pult == 2)         {

      hagi = niz1;

    }
Как сделал бы я
C++:
    if (Vniz.isClick() || (pult == 2) )   {

      hagi = niz1;

    }

Я не стал бы это разбивать на отдельные условия, это не верно.

И еще вопрос (важный) : Чему равна переменная pult если кнопка не была нажата ?
 

unlimiter77

✩✩✩✩✩✩✩
30 Янв 2020
6
0
вот чему по твоему тут будет равно hagi ?
hagi = niz1, niz2;
накладочка.. В исходном примере количество шагов для обеих штор одинаково, а у меня разное. а как тогда правильно сделать?
пока вернул одинаковое количество.
Чему равна переменная pult
чему ее сделать равной?
приравнял к 3 unsigned long pult = 3;

со всеми вышеуказанными правками изменений нет (((

исправленный:
//Настройка шаового двиателя------------------------------------------------
#include <CustomStepper.h>            // Подключаем библиотеку управления шаговым двигателем. По умолчанию настроена на двигатель 28BYJ-48-5V
CustomStepper stepper1(12, 11, 10, 9);  // Указываем пины, к которым подключен драйвер первого шагового двигателя
CustomStepper stepper2(5, 6, 7, 8);    // Указываем пины, к которым подключен драйвер Второго шагового двигателя
#include "IRremote.h"                 // подключаем библиотеку ИК приемника
//--------------------------------------------------------------------------

//Настраиваем дисплей-------------------------------------------------------
//#include <LiquidCrystal_I2C.h>    // Подключаем библиотеку дисплея
//LiquidCrystal_I2C lcd(0x3f,16,2);
//--------------------------------------------------------------------------

//Настройка нижнего и среднего положения штор---------------------------------------------------------------------------------------------------
//
#define niz1 120800   //Число шагов для нижнего положения штора 1
#define niz2 120800   //Число шагов для нижнего положения штора 2                                                                              //

//----------------------------------------------------------------------------------------------------------------------------------------------


//Настройка кнопок----------------------------------------------------------
#include <GyverButton.h>               //Библиотека управления кнопками
#define BTN1 2           // кнопка Вверх подключена к 2 цифровому пину
#define BTN2 14          // кнопка Стоп подключена к 14 цифровому пину
#define BTN3 17          // кнопка Вниз подключена к 17 цифровому пину
GButton Vverh(BTN1);
GButton Stop(BTN2);
GButton Vniz(BTN3);

//Флаги для работы кнопок-----------------------------------------------------
boolean Kvverh = 0;
boolean Kstop = 0;
boolean Kvniz = 0;
boolean Stop1 = 0;
boolean Stop2 = 0;
boolean Flag = 0;

#define svet A1     // подключение датчика света
long schet1 = 0;    //Счетчик шагов первой шторы
long schet2 = 0;    //Счетчик шагов первой шторы
long hagi = 0;
unsigned long time1; //переменная для первого таймера
unsigned long pult = 3;  //переменная для кнопок пульта


word osveh;
byte meny = 0;
int  receiver = 16;                         // Пин на котором сидит ИК приемник
IRrecv irrecv(receiver);                    // Создаём 'irrecv' это ИК приемник
decode_results results;                     // Создаем экземпляр 'decode_results' Это тоже нужно для ИК приемника

void setup() {
  pinMode (4, INPUT_PULLUP);        //Концевик 1 шторы
  pinMode (3, INPUT_PULLUP);        //Концевик 2 шторы
  pinMode (18, OUTPUT);             //светодиод индикации режимов
  pinMode (19, OUTPUT);             //светодиод индикации режимов
  pinMode (A1, INPUT_PULLUP);       //фоторезистор
  pinMode (2, INPUT_PULLUP);
  pinMode (14, INPUT_PULLUP);
  pinMode (17, INPUT_PULLUP);

  irrecv.enableIRIn();      // Инициализация приемника
  Stop1 = digitalRead(4);   //Опрашиваем концевик 1 шторы
  Stop2 = digitalRead(3);   //Опрашиваем концевик 2 шторы
  Serial.begin(9600);

  //Выставляем опрос кнопок в режим АВТО
  Vverh.setTickMode(AUTO);
  Stop.setTickMode(AUTO);
  Vniz.setTickMode(AUTO);

  //Калибровка шторы при включении, поднимаем пока не упремся в концевик
  while (Stop1 == 1 && Stop2 == 1)
  { // Если опущены все шторы то даем команду на подъем всех штор
    stepper1.setDirection(CCW);
    stepper1.rotate();
    stepper2.setDirection(CCW);
    stepper2.rotate();
    delayMicroseconds(850);
    Stop1 = digitalRead(4);
    Stop2 = digitalRead(3);
  }
  while (Stop1 == 1)
  {
    stepper1.setDirection(CCW);
    stepper1.rotate();
    delayMicroseconds(900);
    Stop1 = digitalRead(4);
  }
  while (Stop2 == 1)
  {
    stepper2.setDirection(CCW);
    stepper2.rotate();
    delayMicroseconds(900);
    Stop2 = digitalRead(3);
  }
}
void loop() {
  //Рыбор режима работы (АВТО,РУЧНОЙ)----------------------------------------------------
  if (Stop.isHolded()) {
    if (meny < 3) {
      meny++;
    } else {
      meny = 0;
    }
  }

  //-------------------------------------------------------------------------------------
  if (irrecv.decode(&results))                // Если на ИК приемник пришел сигнал

  {
    Serial.println( results.value );
    switch (results.value)                  // Значеник которое пришло на ИК приемник будет в results.value

    {

      /[I]-----(Клавиша опускания)-----[/I]/
      case 284123805:
        pult = 2;                           // Вызываем функцию опускания шторы
        break;
      /[I]-----(Клавиша поднятия)-----[/I]/
      case 284103405:                      
        pult = 1;                           // Вызываем пункцию поднятия шторы
        break;
      /[I]-----(Клавиша стоп)-----[/I]/
      case 284137575:                      
        pult = 0;                            // Вызываем пункцию поднятия шторы
        break;

      /[I]-----(Клавиша автоматического определения)-----[/I]/
      case 284121255:                      

        meny = 0;              // Режим работы автоматический
        break;
      /[I]-----(Клавиша меню две шторы вместе)-----[/I]/
      case 284115135:                      

        meny = 1;              // две шторы одновременно ручные
        break;
      /[I]-----(Клавиша меню 1 штора )-----[/I]/
      case 284131455:                      

        meny = 2;              // первая штора ручная
        break;
      /[I]-----(Клавиша меню 2 штора )-----[/I]/
      case 284098815:                    
        meny = 3;              // вторая штора ручная
        break;
    }

    irrecv.resume();                      // Ждем следующего сигнала от ИК
  }
  //АВтоматический режим работы----------------------------------------------------------


  if (meny == 0) {
    if (millis() - time1 > 1000) {
      time1 = millis();
      digitalWrite (18, 0);
      digitalWrite (19, 0);
      osveh = analogRead(svet);
      osveh = map(osveh, 0, 1023, 1023, 0);


      if (osveh >= 400) {
        hagi = 0;
      }
      if (osveh < 400) {
        hagi = niz1, niz2;
      }
      //Serial.println (osveh);
    }
  }

  if (meny == 1) {
    digitalWrite (18, 1);
    digitalWrite (19, 1);
    if ( Vverh.isClick() || (pult == 1)) {
      hagi = 0;
      //Serial.println( "vverh" );
    }
    if (Vniz.isClick() || (pult == 2))   {
      hagi = niz1, niz2;
     // Serial.println( "vniz" );
    }
    if (Stop.isClick() || (pult == 0))   {
      hagi = schet1, schet2;
      //Serial.println( "stop" );
    }
    /* if (pult == 2)         {
       hagi = niz1, niz2;
      }
      if (pult == 1)         {
       hagi = 0;
      }
      if (pult == 0)         {
       hagi = schet1, schet2;
      }
    */
  }
  if (meny == 2) {
    digitalWrite (18, 1);
    digitalWrite (19, 0);
    if ( Vverh.isClick()) {
      hagi = 0;
    }
    if (Vniz.isClick())   {
      hagi = niz1;
    }
    if (Stop.isClick())   {
      hagi = schet1;
    }
    if (pult == 2)         {
      hagi = niz1;
    }
    if (pult == 1)         {
      hagi = 0;
    }
    if (pult == 0)         {
      hagi = schet1;
    }
  }
  if (meny == 3) {
    digitalWrite (18, 0);
    digitalWrite (19, 1);
    if ( Vverh.isClick()) {
      hagi = 0;

    }
    if (Vniz.isClick())   {
      hagi = niz2;

    }
    if (Stop.isClick())   {
      hagi = schet2;

    }
    if (pult == 2)         {
      hagi = niz2;
    }
    if (pult == 1)         {
      hagi = 0;
    }
    if (pult == 0)         {
      hagi = schet2;
    }
  }


  //Serial.println( pult );

  // Исполнительный код движения штор-----------------------------------------------------

  if (meny == 0 || meny == 1) {
    if (schet1 < hagi && schet2 < hagi )  //Опускание шторы
    { stepper1.setDirection(CW);
      stepper1.rotate();
      stepper2.setDirection(CW);
      stepper2.rotate();
      schet1++;
      schet2++;
      delayMicroseconds(750);
    }
    if (schet1 < hagi && schet2 == hagi )  //Опускание шторы
    { stepper1.setDirection(CW);
      stepper1.rotate();
      stepper2.setDirection(STOP);
      stepper2.rotate();
      schet1++;
      delayMicroseconds(750);
    }
    if (schet1 == hagi && schet2 < hagi )  //Опускание шторы
    { stepper1.setDirection(STOP);
      stepper1.rotate();
      stepper2.setDirection(CW);
      stepper2.rotate();
      schet2++;
      delayMicroseconds(750);

    }

    if (schet1 > hagi && schet2 > hagi )  //Подъем шторы
    { stepper1.setDirection(CCW);
      stepper1.rotate();
      stepper2.setDirection(CCW);
      stepper2.rotate();
      schet1--;
      schet2--;
      delayMicroseconds(800);
    }
    if (schet1 > hagi && schet2 == hagi )  //Подъем шторы
    { stepper1.setDirection(CCW);
      stepper1.rotate();
      stepper2.setDirection(STOP);
      stepper2.rotate();
      schet1--;
      delayMicroseconds(800);
    }
    if (schet1 == hagi && schet2 > hagi )  //Подъем шторы
    { stepper1.setDirection(STOP);
      stepper1.rotate();
      stepper2.setDirection(CCW);
      stepper2.rotate();
      schet2--;
      delayMicroseconds(800);
    }
    if (schet1 > hagi && schet2 < hagi )  //
    { stepper1.setDirection(CCW);
      stepper1.rotate();
      stepper2.setDirection(CW);
      stepper2.rotate();
      schet1--;
      schet2++;
      delayMicroseconds(800);
    }

    if (schet1 < hagi && schet2 > hagi )  //
    { stepper1.setDirection(CW);
      stepper1.rotate();
      stepper2.setDirection(CCW);
      stepper2.rotate();
      schet1++;
      schet2--;
      delayMicroseconds(800);
    }

    if (schet1 == hagi && schet2 == hagi )  //СТОП
    { stepper1.setDirection(STOP);
      stepper1.rotate();
      stepper2.setDirection(STOP);
      stepper2.rotate();
    }
  }
  if (meny == 2) {
    Flag = 0;
    if (schet1 > hagi)  //Подъем шторы
    { stepper1.setDirection(CCW);
      stepper1.rotate();
      stepper2.setDirection(STOP);
      stepper2.rotate();
      schet1--;
      delayMicroseconds(800);
    }
    if (schet1 < hagi)  //Опускание шторы
    { stepper1.setDirection(CW);
      stepper1.rotate();
      stepper2.setDirection(STOP);
      stepper2.rotate();
      schet1++;
      delayMicroseconds(750);
    }
    if (schet1 == hagi)  //СТОП
    { stepper1.setDirection(STOP);
      stepper1.rotate();
      stepper2.setDirection(STOP);
      stepper2.rotate();
    }
  }
  if (meny == 3) {
    while (Flag == 0) {
      hagi = schet2;
      Flag = 1;
    }
    if (schet2 > hagi)  //Подъем шторы
    { stepper2.setDirection(CCW);
      stepper2.rotate();
      stepper1.setDirection(STOP);
      stepper1.rotate();
      schet2--;
      delayMicroseconds(800);
    }
    if (schet2 < hagi)  //Опускание шторы
    { stepper2.setDirection(CW);
      stepper2.rotate();
      stepper1.setDirection(STOP);
      stepper1.rotate();
      schet2++;
      delayMicroseconds(750);
    }
    if (schet2 == hagi)  //СТОП
    { stepper2.setDirection(STOP);
      stepper2.rotate();
      stepper1.setDirection(STOP);
      stepper1.rotate();
    }
  }

}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,191
1,281
Москва
у тебя получается так, если есть сигнал от пульта, то меняется pult
если сигнала нет, то остается старый pult
при этом если нажата кнопка, то старый pult все равно остается. если я правильно все понял.
 

unlimiter77

✩✩✩✩✩✩✩
30 Янв 2020
6
0
да, в мониторе порта так и есть(((
после того как прописал unsigned long pult = 3, пока не нажимаю пульт, кнопки работают.
А как правильно сделать? Почему остается pult если кнопка не нажата?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,191
1,281
Москва
потому что pult существует. И у него так и будет какое то значение - переменная глобальная. Пример. я получаю данные с ИК пульта. команду две кнопки вверх и вниз. Тогда текущая команда для обработки будет иметь 3 значения: нет команды, команда вверх и команда вниз
enum cmPult :uint8_t (cmNone,cmUp,cmDown); - это список для упрощения

если нет команды с пульта, то действие будет cmNone
иначе
{
если команда вверх, то действие cmUp;
если команда вниз, то действие cmDown;
}

Так бы работало, если бы не кнопки:
если кнопка не нажат , то действие будет cmNone
иначе
{
если команда вверх, то действие cmUp;
если команда вниз, то действие cmDown;
}

Тут будет затираться команда от пульта, если кнопка не нажата. Надо сделать так
если команда cmNone тогда:
если кнопка не нажат , то действие будет cmNone
иначе
{
если команда вверх, то действие cmUp;
если команда вниз, то действие cmDown;
}
 
Изменено:

unlimiter77

✩✩✩✩✩✩✩
30 Янв 2020
6
0
сделал так:
C++:
if (meny == 1) {
    digitalWrite (18, 1);
    digitalWrite (19, 1);
    if ( Vverh.isClick() || (results.value == 284103405)) {
      hagi = 0;
      
      Serial.println( "vverh" );
    }
    if (Vniz.isClick() || (results.value == 284123805))   {
      pult == 10;
      hagi = niz1, niz2;
      
      Serial.println( "vniz" );
    }
    if (Stop.isClick() || (results.value == 284137575))   {
      pult == 10;
      hagi = schet1, schet2;
      
      Serial.println( "stop" );
Всё заработало как нужно. только при нажатии кнопок пульта вылетает по десятку дублей:
C++:
23:06:42.895 -> vverh
23:06:42.895 -> vverh
23:06:42.929 -> vverh
23:06:42.929 -> vverh
23:06:42.929 -> 4294967295
23:06:45.234 -> 284137575
23:06:45.234 -> stop
23:06:45.234 -> stop
23:06:45.234 -> stop
23:06:45.234 -> stop
23:06:45.268 -> stop
23:06:45.268 -> stop
23:06:45.268 -> stop
23:06:45.268 -> stop
23:06:45.268 -> stop
23:06:45.301 -> stop
23:06:45.301 -> stop
23:06:45.301 -> stop
23:06:45.301 -> stop
23:06:45.301 -> stop
23:06:45.301 -> stop
23:06:45.335 -> stop
23:06:45.335 -> stop
23:06:45.335 -> stop
23:06:45.335 -> 4294967295
23:06:47.648 -> vniz
23:06:49.142 -> stop
23:06:49.923 -> vverh
23:06:51.383 -> stop
а кнопки как положено по одной команде. Как же все таки правильно сделать?
 

unlimiter77

✩✩✩✩✩✩✩
30 Янв 2020
6
0
Ура!!! поместил в loop unsigned long pult = 3; все идеально! Спасибо большое за помощь, объяснения и терпение!