Серво

Тема в разделе "Arduino & Shields", создана пользователем Vladyka1701, 9 мар 2014.

  1. Vladyka1701

    Vladyka1701 Нерд

    Делаю замок на серво. Первая проблема
    Код (Text):

    #include <IRremote.h>

    #include <Servo.h>

    Servo Door;

    #define LOCK = 0xFF906F

    #define OPEN = 0xFFA857

    int RECV_PIN = 4;

    int LOCK_LED = 36;

    int OPEN_LED = 32;

    int ir_code = 0;

    IRrecv irrecv(RECV_PIN);

    decode_results results;

    void setup()
    {
      Door.attach(7);
      Door.write(90);
      Serial.begin(9600);
      irrecv.enableIRIn();
    }

    void loop() {
      if (irrecv.decode(&results)) {
      ir_code = results.value;
      if (ir_code == 0xFF906F) {

          Door.write(0);
          irrecv.resume();
        }
        irrecv.resume();
      }
    }
    Серво никак не реагирует на пульт. Где я напутал?
     
  2. atompost

    atompost Гик

    Посмотрите здесь может что то пригодится ;)
     
  3. Vladyka1701

    Vladyka1701 Нерд

    Познавательная статья:). Но мой пульт выдает HEX значение. Нужно ли мне менять results.value на HEX?Можно ли вообще делать #define?
     
  4. rav_75

    rav_75 Гик

    Я извиняюсь, но пульт вообще выдает нолики и единички, т.е. не горит - горит светодиод и компилятор тоже приведет все к ноликам - единичкам, все остальное от лукавого. Другое дело, как Вам удобно записывать. Записи int val = 0xFF, int val = 255, int val = 0b11111111 абсолютно идентичны, так как представляют одно и тоже число в разных системах счисления.
    Делать #define можно и нужно. Только не так #define LOCK = 0xFF906F, а так #define LOCK 0xFF906F
    Можно, потому что компилятор сам везде, где встретит, подменит LOCK на значение 0xFF906F, а нужно, потому что в коде вы сможете вместо малопонятных чисел типа 0xFF906F использовать понятную константу LOCK, чем улучшите читаемость кода и уменьшите вероятность ошибки.
     
    Unixon нравится это.
  5. Vladyka1701

    Vladyka1701 Нерд

    Код (Text):
    #include <IRremote.h>

    #include <Servo.h>

    Servo Door;

    #define LOCK 0xFF906F

    #define OPEN 0xFFA857

    int RECV_PIN = 4;

    int LOCK_LED = 36;

    int OPEN_LED = 32;

    int ir_code = 0;

    boolean locked = false;

    IRrecv irrecv(RECV_PIN);

    decode_results results;

    void setup()
    {
      Door.attach(7);
      Door.write(90);
      pinMode(LOCK_LED, OUTPUT);
      Serial.begin(9600);
      irrecv.enableIRIn();
    }

    void loop() {
    if (irrecv.decode(&results)) {
      Serial.println(results.value);
      irrecv.resume(); // Receive the next value
      }
      if ((results.value == LOCK) && (locked == false)) {

          Door.write(0);
          locked = true;
          digitalWrite(LOCK_LED, HIGH);
          digitalWrite(OPEN_LED, LOW);
          irrecv.resume();
      }
      if (irrecv.decode(&results)) {
      Serial.println(results.value);
      irrecv.resume();
      }
      if ((results.value == OPEN) && (locked == true)) {
        Door.write(180);
          locked = false;
          digitalWrite(OPEN_LED, HIGH);
          digitalWrite(LOCK_LED,LOW);
          irrecv.resume();
      }
       
    }
    Подправил код, но теперь работает, если при включении платы тыкать ОТКРЫТЬ и ЗАКРЫТЬ. Если задержаться на секунду, то всё виснет.
     
  6. atompost

    atompost Гик

    мне кажется вы не до конца доработали триггер значения locked в условии if в секции void loop()