Включение реверса двигателя по тактовой кнопке.

elektron2020
Offline
Зарегистрирован: 30.05.2019

   int ledPin1 = 13;  // мотор двери вверх
   int ledPin2 = 12;  // мотор двери вниз
   int switchPin = 7; // кнопка двери старт
   int ledPin5 = 3;   // реле свет 
   int ledPin6 = 4;   // питание датчиков Холла
   int lightSwitchPin = 8; // кнопка двери стоп (ready)
   int ledPin3 = 11;     // мотор окна вверх
   int ledPin4 = 10;     // мотор окна вниз
   int plusButtonPin = 5;   // кнопка окна вверх
   int minusButtonPin = 6;  // кнопка окна вниз
   
   #define czSwitchPin  9  // сигнал ЦЗ закрыть окно
   bool  czSwitchPin_state = false;      // переменная для хранения состояния кнопки сигнал ЦЗ закрыть окно
   uint32_t ms_button = 0;
   
   int statePlus; // переменная для хранения состояния кнопки окно вверх
   int stateMinus; // переменная для хранения состояния кнопки окно вниз
   int cPlus;
   int cMinus;
   int valLight;
   int stateLight;  // переменная для хранения состояния кнопки двери стоп (ready)
  
   int cLight;
   int val;
   int state;        // переменная для хранения состояния кнопки двери старт
   int c;
   #define TIME 60000 // 60 сек
   unsigned long int time;
   
   
void setup() {
    pinMode (ledPin1, OUTPUT); //пин мотор двери вверх, подключенный, как выход
    pinMode (ledPin2, OUTPUT); //пин мотор двери вниз, подключенный, как выход
    pinMode (switchPin, INPUT); //пин кнопка двери старт, подключенный, как вход
    digitalWrite (ledPin1, LOW); //пин, подключенный, как выход
    digitalWrite (ledPin2, LOW); //пин, подключенный, как выход
    pinMode (ledPin5, OUTPUT); //пин реле свет, подключенный, как выход
    pinMode (ledPin6, OUTPUT); //пин питание датчиков Холла, подключенный, как выход
    pinMode (lightSwitchPin, INPUT); //пин кнопка двери стоп (ready), подключенный, как вход
    pinMode (czSwitchPin, INPUT); //пин сигнал ЦЗ закрыть окно, подключенный, как вход
    digitalWrite (ledPin5, LOW); //пин, подключенный, как выход
    digitalWrite (ledPin6, HIGH); //пин, подключенный, как выход
    pinMode (ledPin3, OUTPUT); //пин мотор окна вверх, подключенный, как выход
    pinMode (ledPin4, OUTPUT); //пин мотор окна вниз, подключенный, как выход
    pinMode (plusButtonPin, INPUT); //пин кнопка окна вверх, подключенный, как вход
    pinMode (minusButtonPin, INPUT); //пин кнопка окна вниз, подключенный, как вход
    digitalWrite (ledPin3, LOW); //пин, подключенный, как выход
    digitalWrite (ledPin4, LOW); //пин, подключенный, как выход
    pinMode (czSwitchPin, INPUT); //пин сигнал ЦЗ закрыть окно, подключенный, как вход
}

void loop()                                   
 {
   stateLight = digitalRead(lightSwitchPin);  // кнопка двери стоп (ready)
    

   if (stateLight == LOW  && cLight == 0) // отпустили кнопку
   { 
    val = 0;
    cLight = 1;
  
   }
  if (stateLight == HIGH && cLight == 1) // нажали кнопку
    {
    valLight = ++valLight;
    
    if (valLight == 2)
    {
      valLight = 1;
    }
    cLight = 0;
     time = millis(); // обнуляем счетчик 
   } 
    if (valLight == 0 )
   {
    digitalWrite (ledPin5, LOW);  //пин реле свет, подключенный, как выход
    digitalWrite (ledPin6, HIGH); // питание датчиков Холла
   }
    if (valLight == 1)
   {
    digitalWrite (ledPin5, HIGH); //пин реле свет, подключенный, как выход
    digitalWrite (ledPin6, LOW);  // питание датчиков Холла
   }
    if (valLight == 2)
   {
    digitalWrite (ledPin5, HIGH); //пин реле свет, подключенный, как выход
    digitalWrite (ledPin6, LOW);  // питание датчиков Холла
   }
    if (valLight == 3 )
   {
    digitalWrite (ledPin5, LOW);   //пин реле свет, подключенный, как выход
    digitalWrite (ledPin6, HIGH);  // питание датчиков Холла
   }
   
    // если после 60ти секунд мы не нажали второй раз на кнопку, то возвращаемся в дефолт - тушим светодиоды
    if (millis() - time > TIME)
     {
       if (valLight != 3)
       {
          valLight = 0;
       }  
     }
 {
  state = digitalRead(switchPin);

  if (state == LOW  && c == 0) //отпустили кнопку
   {
    c = 1;
   }
  if (state == HIGH && c == 1) // нажали кнопку
  {
    val = ++val;
    if (val == 3)
    {
      val = 0;
    }
    c = 0;
    time = millis(); // обнуляем счетчик 
  }

  if (val == 0 ) // выключаем светодиоды
  {
    digitalWrite (ledPin1, LOW);  // мотор двери вверх
    digitalWrite (ledPin2, LOW);  // мотор двери вниз
  }
  if (val == 1 ) // если кнопку нажали 1 раз нажали и отпустили 
  {
    digitalWrite (ledPin1, HIGH);  // мотор двери вверх
    digitalWrite (ledPin2, LOW);   // мотор двери вниз
  }
     if (val == 2 ) // если кнопку нажали 2 раз нажали и отпустили 
  {
    digitalWrite (ledPin1, LOW);  // мотор двери вверх
    digitalWrite (ledPin2, HIGH); // мотор двери вниз
  }
      if (val == 3) // если кнопку нажали 3 раз нажали и отпустили 
  {
    digitalWrite (ledPin1, LOW);  // мотор двери вверх
    digitalWrite (ledPin2, LOW);  // мотор двери вниз
  } 

  // если после 60ти секунд мы не нажали второй раз на кнопку, то возвращаемся в дефолт - тушим светодиоды
    if (millis() - time > TIME)
    {
       if (val != 3)
       {
          val = 0;
       }  
    }
   } 
    {
    statePlus = digitalRead( plusButtonPin);
    stateMinus = digitalRead( minusButtonPin);

      if (statePlus == HIGH )  // проверяем нежатали кнопка, если нажата, то buttonState будет HIGH :
        {
       digitalWrite (ledPin6, LOW);   // питание датчиков Холла
       digitalWrite (ledPin3, HIGH);   // мотор окна вверх
       digitalWrite (ledPin4, LOW);    // мотор окна вниз
        } 
        else {
           digitalWrite(ledPin3, LOW);  // мотор окна вверх
             }
      if (stateMinus == HIGH ) // проверяем нежатали кнопка, если нажата, то buttonState будет HIGH :
        {
       digitalWrite (ledPin6, LOW);  // питание датчиков Холла
       digitalWrite (ledPin3, LOW);   // мотор окна вверх
       digitalWrite (ledPin4, HIGH); // мотор окна вниз
        } 
        else { 
           digitalWrite(ledPin4, LOW);  // мотор окна вниз
             }   
       }

       //Блок управления закрытием окна от ЦентроЗамка
       
        { 
      uint32_t ms = millis();    
       //  фиксируем нажатие кнопки
        if( digitalRead(czSwitchPin) == LOW  && ( ms - ms_button ) > 5000 )
            {
          czSwitchPin_state = true;
           digitalWrite (ledPin4, LOW); 
           digitalWrite (ledPin6, LOW);   // питание датчиков Холла
           digitalWrite (ledPin3, HIGH);  // мотор окна вверх
            } 
          // фиксируем отпускание кнопки 
            if( digitalRead(czSwitchPin) == HIGH )
            { 
           czSwitchPin_state = false;
            ms_button    = ms;
           digitalWrite(ledPin3, LOW);   // мотор окна вверх
           digitalWrite (ledPin6, HIGH);  // питание датчиков Холла       
            }
        
       }
 }     

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это что? Вы в смысле хотите оставить миру учебное пособие как это делать? Так хоти пару предложений бы написали что к чему то.

elektron2020
Offline
Зарегистрирован: 30.05.2019
Всем доброго дня. Сгорел контроллер в одном автомобильном блоке. Пытаюсь заменить его ардуиной. Защита отдребезга распаяна на плате. Выходы транзизторные ключи управляют реле. Сдетства дружу с паяльником и тестром. И во времена институтской молодости изучал BASIC.
Гдето накосячил в сетче. При одиночном нажатии switchPin срабатывает включение мотора вверх(val == 1), при следующем нажатии switchPin  опять срабатывает включение мотора вверх(val == 1), а нужно чтобы срабатывало включение мотора вниз(val == 2). Только двойной клик switchPin приводит к включению мотора вниз(val == 2). 
Что происходит по схеме.
кнопка двух ходовая 1ступень нажатия(lightSwitchPin) и 2 ступень нажатия ( switchPin)
соответсвенно механически 2 ступень может быть нажата только когда сработала 1 ступень.
 
Сам исправил один косяк теперь при повторном нажатии (lightSwitchPin) питание включения на 60сек реле свет. не отключается а начинается новый отсчет времени так и должно быть в оригинале.
 
Алгоритм 
 по умолчанию все разомкнуто 
 при нажатии 1ступени (команда замок разблокирован) lightSwitchPin замкнут на +5в.
включено на 60сек реле свет.
 при нажатии 2ступени switchPin замкнут на +5в.(без фиксации)(val == 1)
включается (ledPin1, OUTPUT HIGH); //пин мотор двери вверх (при этом сама кнопка отпущена lightSwitchPin замкнут на +5в. а  switchPin разомкнут). 
По достижении  мотор двери вверхней точки (команда замок заблокирован).lightSwitchPin разомкнут остановить мотор (ledPin1, OUTPUT LOW).
 
Запомнили это состояние.
 
 должно сохраниться состояние было switchPin (val == 1) и при следующем нажатии switchPin должно исполниться состояние switchPin (val == 2), и будет исполнен следующий блок: 
 
При следующем нажатии:
 
 
 
 при нажатии 1ступени (команда замок разблокирован) lightSwitchPin замкнут на +5в.
включено на 60сек реле свет.
 при нажатии 2ступени switchPin замкнут на +5в.(без фиксации)
включается (ledPin2, OUTPUT HIGH); //пин мотор двери вниз (при этом сама кнопка отпущена lightSwitchPin замкнут на +5в. а  switchPin разомкнут). 
По достижении  мотор двери нижней точки (команда замок заблокирован).lightSwitchPin разомкнут остановить мотор (ledPin2, OUTPUT LOW).
 
И так далее по циклу.
 
 Только двойное нажатие на кнопку switchPin вызывает срабатывание второй части блока.
elektron2020
Offline
Зарегистрирован: 30.05.2019

написал ниже. 

elektron2020
Offline
Зарегистрирован: 30.05.2019

ЕвгенийП пишет:

Это что? Вы в смысле хотите оставить миру учебное пособие как это делать? Так хоти пару предложений бы написали что к чему то.

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

b707
Offline
Зарегистрирован: 26.05.2017

я так и не поял - это у вас нажатие двух кнопок 200 строк кода занимает?

elektron2020
Offline
Зарегистрирован: 30.05.2019

b707 пишет:

я так и не поял - это у вас нажатие двух кнопок 200 строк кода занимает?

Нет алгоритм нажатия с 51 по 140 строку.
Ниже управление другими моторами, там все работает.

elektron2020
Offline
Зарегистрирован: 30.05.2019

https://youtu.be/uLGMQ6WG9Kc
Ссылка на видео как должно работать.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
 
if (valLight == 2)
    {
      valLight = 1;
valLight- никогда не будет = 2 пока присутствует выше указаный код
--------------
if (val == 3)
    {
      val = 0;
val- никогда не будет = 3 пока присутствует выше указаный код
Так что проверка на 2 и 3 не коректна
А в случае с valLight - не выполнение куска полезного кода
elektron2020
Offline
Зарегистрирован: 30.05.2019

vosara пишет:

 
if (valLight == 2)
    {
      valLight = 1;
valLight- никогда не будет = 2 пока присутствует выше указаный код
--------------
if (val == 3)
    {
      val = 0;
val- никогда не будет = 3 пока присутствует выше указаный код
Так что проверка на 2 и 3 не коректна
А в случае с valLight - не выполнение куска полезного кода


Спасибо за подсказку. Сейчас проверю эту версию.
Собственно претензий к valLight у меня и не было, всё выплоняется как задумано.
Вопрос к исполнению val . Всегда первым исполняется val==1.Вторым нажатием переключается на val==2.
А нужно чтобы нажал исполнилось val==1. При следующем запуске valLight. Исполнилось val==2.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
Вот Вы пишете (А нужно чтобы нажал исполнилось val==1. При следующем запуске valLight. Исполнилось val==2.)
Следовательно val==2 у Вас зависит от состояния valLight - А в коде этой зависимиости нет!
 
elektron2020
Offline
Зарегистрирован: 30.05.2019

Походу я понял свою ошибку.
Кнопкой lightswitch исполняется два алгоритма.
1. Включение реле свет. На 60сек. при повторном нажатии счетчик обнуляется и считает заново.
2.управление запуском и остановом мотора.
А я все обозначил все одной константой и переменной.
Вот у меня все и крутилось возле val=1
А кнопка switch это всего лишь выбор состояния мотора.
Вверх или вниз.