Нужна помощь со скетчем (Реле и кнопки для MPU6050 )

Тема в разделе "Arduino & Shields", создана пользователем Lexan, 2 апр 2016.

  1. Lexan

    Lexan Нуб

    Привет ребята, нужна ваша помощь.
    Удалось запустить скеч для MPU6050. Он передает данные осей X и Y, в монитор порта с помощью "Kalman.h" . Нужно добавить функцыи, с кнопками и рэле. Но чтобы не путаца решил попробовать пока отдельно написать эти функцыи.

    Но чтото у меня пока не очень получается. Помогите решить эту задачу.



    Итак задача...

    Имеются:
    КНОПКА1 //кнопка1 обычная тактовая без фиксацый
    КНОПКА2 //кнопка2 обычная тактовая без фиксацый
    RELAY1 //реле инверсное
    RELAY2 //реле инверсное
    BUZZER //пищалка
    По умолчанию RELAY1 и RELAY2 отключены.

    При нажатии на тактовую (кнопку1):
    Включить (RELAY1)
    Запомнить покозатели (kalAngleX)
    Запомнить показатели (kalAngleY)

    При изменении показателей (kalAngleX) и (kalAngleY), больше или меньше 5 градусов:
    Включить (RELAY2) //на 60сек
    Включить (BUZZER) //на 60сек
    Через 60сек выключить:
    Выключить (РЕЛЕ2)
    Выключить (BUZZER)

    После начать цыкл, как после нажатия (кнопки1)

    Но есле нажать (кнопку2) то:
    Выключить (RELAY1)
    Выключить (RELAY2) есле включено
    Выключить (BUZZER) если включён.



    Пробовал написать начало. Вот что получилось:

    Код (C++):
    #define BUZZER_PIN       6;     // 6 пин Пищалки
    #define RELAY_PIN        4;     //4 пин  РЕЛЕ1
    #define RELAY_PIN2       5;     // 5 пин РЕЛЕ2
    #define BUTTON_PIN1      2;     // пин для Кнопка1
    #define BUTTON_PIN2      3;     // пин для Кнопка2
    #define BEEP_INTERVAL  1000     // частота включения зуммера, мсек
    #define BUZZER_TIMEOUT 30UL     // длительность звучания зуммера, сек
    #define RELAY_TIMEOUT2 30UL     // длительнасть включения Реле2, сек
    boolean relayEnable = false;    // флаг Реле1
    boolean relay2Enable = false;   // флаг Реле2
    boolean buzzerEnable = false;   // флаг Пищалки


    void setup() {

    Serial.begin(9600);
      pinMode(RELAY_PIN, OUTPUT);   // Реле1
      pinMode(RELAY_PIN2, OUTPUT);  // Реле2
      pinMode(BUTTON_PIN1, INPUT);  // Кнопка1
      pinMode(BUTTON_PIN2, INPUT);  // Кнопка2
      pinMode(BUZZER_PIN, OUTPUT);  // Пищалка

    }

    void loop() {


    }
     
    Последнее редактирование: 2 апр 2016
  2. Lexan

    Lexan Нуб

    Я так понял нужно использовать опираторы сравнения?
    Что то типо такого?

    if (kalAngleX разница записанного числа больше чем на 5 то...) // Здесь я не могу разобратся, как взять это число по нажатию на кнопку1?
     
  3. Securbond

    Securbond Гуру

    Гуглом пользоваться совсем не умеете ?
    Код (C++):
    void loop(){
      // считываем значения с входа кнопки
      buttonState = digitalRead(buttonPin);
      // проверяем нажата ли кнопка
      // если нажата, то buttonState будет HIGH:
      if (buttonState == HIGH) {
        // включаем светодиод
        digitalWrite(ledPin, HIGH);
      }
      else {
        // выключаем светодиод
        digitalWrite(ledPin, LOW);
      }
    }
     
    опЕраторы , типА ...

    В вашем случае, вместо включения диода, сравниваете ваши переменные и производите нужные действия.
     
    Последнее редактирование: 2 апр 2016
  4. Lexan

    Lexan Нуб

    Да тут понятно, сама кнопка это пол беды.
    А как запомнить значение одной из осей в момент нажатия кнопки1 например kalAngleX и сравнивать её с самим kalAngleX в настоящее время?
     
    Последнее редактирование: 2 апр 2016
  5. Securbond

    Securbond Гуру

    Я не знаю как вы считываете данные... но прежде чем скетч выводит данные в ком, он сохраняет их в переменную. Вот эту переменную и нужно сравнивать..
    Разберитесь хорошенько со скетчем который вы используете... что и откуда он берет... И уже потом прикручивайте условия...
    Вам скорее всего нужно не сохранять данные (они должны быть уже сохранены перед выводом в компорт ), а начинать их сравнивать после нажатия кнопки.
     
  6. Lexan

    Lexan Нуб

    Ну видимо выводится две переменные kalAngleX и kalAngleY.
    Ну пока что хотя бы с одной переменной разобраться.

    Так... вот она переменная (kalAngleX) и как её запомнить и сравнивать с ней же в настоящее время?
     
  7. Securbond

    Securbond Гуру

    Выложите скетч с выводом переменных, так Вам быстрее помогут...
     
  8. Securbond

    Securbond Гуру

    kalAngleX, kalAngleY - вот ваши переменные, их и сравнивайте...
    Что значит сравнить с ней же ?
     
  9. Lexan

    Lexan Нуб

    Не пойму, как скопировать отсюда значение переменной (kalAngleX) в момент нажатия кнопки1, и после сравнивать это значение со значением в настоящее время?

    Например:
    Значение (kalAngleX) в момент нажатия на кнопку1 было 180 (и оно запомнилось) назовем его (Число1).
    А через 2 минуты в настоящий момент значение (kalAngleX) изменилось допустим на 190, назовем его (Число2).
    И по условиям должно сработать реле2 в том случае (Если Число1 больше или меньше Числа2 более чем на 5)
     
  10. Securbond

    Securbond Гуру

    Вводите ещё одну перем нную kalXold например и сохраняете в неё значение
    kalXold = kalAngleX; , a по нажатию кнопки сравниваете
    If кнопка нажата и kalXold больше или меньше (как вам нужно) kalAngelX ....
    Включить реле ....
     
  11. Lexan

    Lexan Нуб

    Как осуществить это сохранение kalXold = kalAngleX в тот момент когда была нажата кнопка?
    Тоесть чтобы он не копировал одно значение в другое постоянно.
    А только один раз после нажатия кнопки.
    Ну и после уже сравнивать их в if...
     
  12. Securbond

    Securbond Гуру

    If кнопка нажата, kalXold = kalAngleX;
    В чем сложность ? Писать одно условие в другом то же ни кто не запрещает.
     
  13. Lexan

    Lexan Нуб

    Ребят, голова уже закипает)))

    Как правильно написать такое выражение?? Суть в том чтобы узнать разницу между двумя числами и результат сравнить с числом 5.



    if (kalXold > kalAngleX || kalXold < kalAngleX) // a больше > чем b на 5 и || a меньше < чем b на 5

    или както так?

    if (kalXold - kalAngleX = Xresult && Xresult > 5 || kalXold + kalAngleX = Xresult && Xresult > 5) // a-b=c, а с в свою очередь >5
     
  14. Securbond

    Securbond Гуру

    Может так?
    if (kalAngleX-kalXold)>=5
     
  15. Lexan

    Lexan Нуб

    спасибо разобрался
    if (a - b <= 5) {}

    if (a - b >= 5) {}