Помогите новичку подправить скетч

Тема в разделе "Arduino & Shields", создана пользователем anton6228, 5 мар 2018.

  1. anton6228

    anton6228 Нуб

    Доброго всем, помогите подправить скетч, смысл такой- хочу организовать открытие и закрытие ворот по блютуз с помощью андроид на адуино нано, hc-06 и высокоуровневом двухканальном реле модуле.
    На воротах нет концевиков в место этого в коде нужно прописать следующий алгоротм - при приеме определенной команды реле1 срабатывает и остается замкнутым нужное количество секунд (ворота открылиль и остановились на нужной высоте ) РЕЛЕ РАЗМЫКАЕТСЯ, и так же для опускания (реле2).
    Код (C++):

    byte zxx;    
    void setup() {  
    Serial.begin(9600);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    }
    void loop() {
    if (Serial.available() > 0) {Blu = Serial.read();}
    if (zxx==203){digitalWrite(5,1); delay(нужное количество м.секунд);  digitalWrite(5,0);}
    if (zxx==205){digitalWrite(6,1); delay(нужное количество м.секунд); digitalWrite(6,0);}
    }
     
    с "делеями" не работает...
     
  2. Не концевики нужны обязательно. Рано или поздно возникнет момент что ворота или не закроются или очень сильно откроются разломав все сто может сломаться. Спать хочу но не совсем понял чего надо то. Во первых думаю лучше флаг завести что пришла именно нужная команда. А потом можно и deley(),и миллис
     
  3. b707

    b707 Гуру

    Антон, этот код вообще не рабочий. Например, откуда берется значение zxx ? - вы его нигде в программе не присваиваете. Кроме того, если zxx - команда по блютуз - то ее надо обнулять после открытия-закрытия ворот, иначе ворота после команды будут бесконечно открыватся или закрыватся, разломав все вокруг.
    А вот "делеи" как раз в этом коде будут работать :)
     
  4. anton6228

    anton6228 Нуб

    так и происходит, после исполнения первой команды она(команда) выполняется бесконечно, помогите исправить.
     
  5. anton6228

    anton6228 Нуб

    Это мой первый "проэкт" после мигания светодиодом на плате, поэтому для меня еще долеки "флаги" и все такое, на счет концевиков Вы правы, придется ставить.
     
  6. ORLENOK

    ORLENOK Гик

    Код писал в браузере, если что не ругать)
    Код (C++):
    bool isOpen = false; // флаг того, что ворота открыты. Изначально считаем, что закрыты.
    byte currentCommand;    //текущая команда
    void setup() {  
    Serial.begin(9600);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    }
    void loop() {
    if (Serial.available() > 0)
    {
    currentCommand = Serial.read();
    }
    if (currentCommand==203 && ! isOpen) //проверяем, что пришла команда открытия и ворота не открыты
    {
    digitalWrite(5,1);
    delay(нужное количество м.секунд);  digitalWrite(5,0);
    currentCommand = 0; //обнуляем текущую команду
    isOpen = !isOpen;
    }
    if (currentCommand==205 && isOpen) //проверяем, что пришла команда закрытия и ворота открыты.
    {
    digitalWrite(6,1);
    delay(нужное количество м.секунд); digitalWrite(6,0);
    currentCommand = 0; //обнуляем текущую команду
    isOpen = !isOpen;
    }
    }
     
  7. fogary

    fogary Гик

    Код (C++):
    #define COD_OPENING 203
    #define COD_CLOSURE 205

    enum door_action { opening, closure, nothing };

    boolean is_door_open = false;

    void door_control(door_action act);

    void setup() {
      Serial.begin(9600);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
    }

    void loop() {
      door_action cur_act;

      if (Serial.available()) {
        byte zxx = Serial.read();

        switch (zxx) {
          case COD_OPENING:
            cur_act = is_door_open ? nothing : opening; //надеюсь с синтаксисом не напутал (и ниже case то же)
            door_control(cur_act);
            break;
          case COD_CLOSURE:
            cur_act = is_door_open ? closure : nothing;
            door_control(cur_act);
            break;
        }
      }
    }

    void door_control(door_action act) {
      byte pin_no;

      swith (act) {
        case opening:
          pin_no = 5;
          break;
        case closure:
          pin_no = 6;
          break;
        case nothing:
          return;
      }

      digitalWrite(pin_no, HIGH);
      delay(нужное количество м.секунд);
      digitalWrite(pin_no, LOW);

      is_door_open = !is_door_open;
    }
     
  8. anton6228

    anton6228 Нуб

    Большее спасибо, все работает как надо.
     
  9. anton6228

    anton6228 Нуб

    Спасибо большое ,все работает, только в одном switсh буквы "с" не хватало, по не опытности ели нашел...