Помогите/подскажите с кодом

Тема в разделе "Arduino & Shields", создана пользователем simpl1k, 6 июн 2020.

  1. simpl1k

    simpl1k Нуб

    Добрый день. Вообщем есть моторизированный монитор который открывается при подаче 12в. Подали 12в монитор открылся, далее есть кнопка (tilt в коде) при нажатии которой монитор по значению потенциометра опускается на определенный угол.

    Код (C++):
    #include <Eeprom24C01_02.h>
    #include <Wire.h>

    // устанавливаем порты:
    const uint8_t motor_in1 = 8;    // номер порта к которому подключен драйвер мотора с входом 1
    const uint8_t motor_in2 = 9;    // номер порта к которому подключен драйвер мотора с входом 2
    const uint8_t acc = 12;         // номер порта к которому подключен acc
    const uint8_t btn_open = 11;    // номер порта к которому подключена кнопка OpenClose
    const uint8_t btn_tilt = 10;    // номер порта к которому подключена кнопка Tilt
    const uint8_t pot = 1;

    // переменные:
    bool acc_val = 0;               // переменная для хранения состояния ACC
    bool btn_open_close_val = 1;    // переменная для чтения статуса кнопки OpenClose
    bool btn_tilt_val = 1;          // переменная для чтения статуса кнопки Tilt

    void setup()
    {
      delay(200);
       //устанавливаем скорость 9600 бит/сек
      Serial.begin(9600);
     
      // инициализировать порты драйвера электродвигателей:
      pinMode(motor_in1, OUTPUT);
      pinMode(motor_in2, OUTPUT);
     
    // инициализировать кнопки в качестве входа:
      pinMode(btn_open, INPUT_PULLUP);
      pinMode(btn_tilt, INPUT_PULLUP);

    // инициируем порт потенциометра
      pinMode(pot, INPUT);
    }

    // адреса eeprom
    const byte address = 0;

    void loop()
    {
    acc_val = digitalRead(acc); // читаем состояние значения ACC:

    btn_open_close_val = digitalRead(btn_open);
    btn_tilt_val = digitalRead(btn_tilt);  
     
    pot_val = analogRead(pot) / 4;
    Serial.println(pot_val);

    if (acc_val == HIGH) { // если на acc пришел сигнал 12+
       if (pot_val <= 30) {  //если монитор закрыт то.
        digitalWrite(motor_in1, HIGH); // открываем монитор
        do {
            Serial.println("motor up"); //
            delay(50);          // подождать, пока датчик стабилизируется
            pot_val = analogRead(pot) / 4; // проверить датчик
            }
            while (pot_val < 220); // если крышка поднялась то сигнал будет больше 220, цикл разрывается
            digitalWrite(motor_in1, LOW); // отключаем мотор для поднятия крышки
          }
            else {
              tilt();
              }

       }
    void tilt()
    {
        if (btn_tilt_val == LOW && pot_val == constrain(pot_val, 180, 256))
        {
        if (pot_val >= 218)
          {
          digitalWrite(motor_in2, HIGH);
          {
          delay(50);          
          pot_val = analogRead(pot) / 4;
          }
          while (pot_val > 216);
          digitalWrite(motor_in2, LOW);
          }

         
        else if (pot_val == constrain(pot_val, 200, 216))
          {
          digitalWrite(motor_in2, HIGH);
          do
          {
          delay(50);          
          pot_val = analogRead(pot) / 4;
          }
          while (pot_val > 198);
          digitalWrite(motor_in2, LOW);
          }
          else if (pot_val == constrain(pot_val, 180, 190))
          {
          digitalWrite(motor_in1, HIGH);
          do
          {
          delay(50);          
          pot_val = analogRead(pot) / 4;
          }
          while (pot_val < 220  );
          digitalWrite(motor_in1, HIGH);
          }
        }
      else
        {
        digitalWrite(motor_in1, LOW); // отключаем мотор  
        digitalWrite(motor_in2, LOW); // отключаем мотор
        }

       
    }
     
    Теперь 2 вопроса.
    1. Я хочу добавить доп. кнопку опен, она должна закрывать монитор даже если поданы 12в, я добавил условие для нее через if , и такая проблема, при нажатии кнопки монитор закрывается, НО тут же открывается, потому что начинает выполняться условие if (acc_val == HIGH) { , т.е как мне сделать что бы ACC как бы отслеживал, если кнопка опен была нажата , то не начинал отслеживать значение потенциометра и выполнять свой цикл?) /Надеюсь понятно объяснил.
    2. В блоке void tilt при нажатии кнопки меняться положение монитора, и я заметил такой момент, если зажать кнопку tilt то монитор начинает двигаться из начального положения в третье непрерывно, туда сюда.

    Драйвер движка l293b если это имеет роль.

    Заранее спасибо за подсказки.
     
  2. b707

    b707 Гуру

    используйте флаг, на ардуино-ру написал подробнее