Xbee API, arduino uno, Управление, RSSi

Тема в разделе "Arduino & Shields", создана пользователем Дмитрий_, 4 окт 2012.

  1. Дмитрий_

    Дмитрий_ Нерд

    Добрый день не могу понять что не так делаю почему не работает включение диода
    и как мне получить RSSI?
    по задумке когда на первой ардуине нажимаешь кнопку 1, то на второй ардуине должен загореться диод,а когда нажимаешь кнопку 2, то диод должен погаснуть.
    А на самом деле получается что я нажимаю кнопку 1 или 2 на первой ардуине, то на второй ардуине диод загорается и сразу гаснет
    железо:
    2 arduino uno
    2 xbeepro в api режиме


    вот мой код передатчик:

    Код (Text):

    #include <XBee.h>
    #include <SoftwareSerial.h>
     
    /*Это пример для XBee Series 2
      Отправляет запрос TX ZB со значением analogRead (PIN5) и проверяет статус ответа на успех
    */
     
    // создаём XBee объект
    XBee xbee = XBee();
     
    uint8_t payload_1[] = { "313" };
    uint8_t payload_2[] = { "128" };
    // SH + SL Адрес получателя XBee
    XBeeAddress64 addr64 = XBeeAddress64(0x0013a200, 0x409879f5);
    ZBTxRequest zbTx_1 = ZBTxRequest(addr64, payload_1, sizeof(payload_1));
     
    ZBTxRequest zbTx_2 = ZBTxRequest(addr64, payload_2, sizeof(payload_2));
     
    ZBTxStatusResponse txStatus = ZBTxStatusResponse();
     
    int buttonPins[3] = {2, 3, 4}; // pins
     
     
    int statusLed = 11;
    int errorLed = 12;
     
    void flashLed(int pin, int times, int wait) {
     
      for (int i = 0; i < times; i++) {
        digitalWrite(pin, HIGH);
        delay(wait);
        digitalWrite(pin, LOW);
     
        if (i + 1 < times) {
          delay(wait);
        }
      }
    }
     
    void setup() {
      pinMode(statusLed, OUTPUT);
      pinMode(errorLed, OUTPUT);
     
    /* Установить кнопку контактов в качестве входных данных, установить подтягивающий резистор */
      for (int i=0; i<3; i++)
      {
        pinMode(buttonPins[i], INPUT);
        digitalWrite(buttonPins[i], HIGH);
      }
     
      xbee.begin(9600);
    }
     
    void loop() {
     
    if (!digitalRead(buttonPins[0]))
      {
      xbee.send(zbTx_1);
      flashLed(statusLed, 1, 1000);
      }
    if (!digitalRead(buttonPins[1]))
      {
      xbee.send(zbTx_2);
      flashLed(statusLed, 1, 1000);
      }
    if (!digitalRead(buttonPins[2]))
      {
    //  xbee.send(zbTx);
      flashLed(statusLed, 1, 1000);
      }
     
      // flash TX indicator
     
      // После отправки запроса TX, мы ожидаем, статус ответа
      // Ждём пол секунды для статус ответа
      if (xbee.readPacket(500)) {
        // Получил ответ!
     
        // должен быть ZNet TX статус              
        if (xbee.getResponse().getApiId() == ZB_TX_STATUS_RESPONSE) {
          xbee.getResponse().getZBTxStatusResponse(txStatus);
     
          // получить статус доставки, пятый байт
          if (txStatus.getDeliveryStatus() == SUCCESS) {
            // Успех. время праздновать flash
            flashLed(statusLed, 5, 50);
          } else {
            // удаленный XBee не получили наше пакет. оно включено?
            flashLed(errorLed, 3, 500);
          }
        }
      } else if (xbee.getResponse().isError()) {
        //nss.print("Error reading packet.  Error code: ");
        //nss.println(xbee.getResponse().getErrorCode());
      } else {
        // local XBee не обеспечивают своевременную TX Статус ответ -- should not happen
      //  flashLed(errorLed, 2, 50);
      }
     
      delay(1000);
    }
     

    Приёмник:
    Код (Text):

    #include <XBee.h>
    #include <SoftwareSerial.h>
     
    /*
    Это пример для XBee Series 2
    Получает пакет ZB RX и задает значение ШИМ на основе пакетной передачи данных.
    Светодиод ошибки мигает, если неожиданного получения пакета
    */
     
    XBee xbee = XBee();
    XBeeResponse response = XBeeResponse();
    // создавать многократно используемые объекты для ответов  и ожидаем для обработки
    ZBRxResponse rx = ZBRxResponse();
    ModemStatusResponse msr = ModemStatusResponse();
     
    uint8_t data = 0;
     
    int statusLed = 11;
    int errorLed = 12;
    int dataLed = 10;
    int uprLed = 13;
    void flashLed(int pin, int times, int wait)
    {
       
          for (int i = 0; i < times; i++)
      {
          digitalWrite(pin, HIGH);
          delay(wait);
          digitalWrite(pin, LOW);
         
          if (i + 1 < times)
            {
            delay(wait);
            }
        }
    }
     
    void setup()
    {
      pinMode(statusLed, OUTPUT);
      pinMode(errorLed, OUTPUT);
      pinMode(dataLed,  OUTPUT);
      pinMode(uprLed, OUTPUT);
     
      // запуск сериал для xbee
      xbee.begin(9600);
     
      flashLed(statusLed, 3, 50);
    }
     
    // непрерывно читает пакеты, глядя на прием ZB или состояния модема
    void loop()
    {
       
     
        xbee.readPacket();
       
        if (xbee.getResponse().isAvailable())
          {
          // есть что-то
         
          if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE)
          {
            // получил пакет ZB RX
           
            // Теперь заполните нашу zb rx class
            xbee.getResponse().getZBRxResponse(rx);
               
            if (rx.getOption() == ZB_PACKET_ACKNOWLEDGED)
            {
                // Отправитель получил ACK
                flashLed(statusLed, 10, 10);
            }
           
            else
            {
                // мы его получили (что очевидно), но отправитель не получил ACK
                flashLed(errorLed, 2, 20);
            }
           
           
              data = rx.getData(0) - '0';
           
          }
         
          if (data == 313)
            {
            digitalWrite(uprLed, HIGH);
            }
           
          if (data == 128)
            {
            digitalWrite(uprLed, LOW);
            }
         
           
          else if (xbee.getResponse().getApiId() == MODEM_STATUS_RESPONSE)
          {
            xbee.getResponse().getModemStatusResponse(msr);
            // местные XBee посылает ответ на определенные события, такие как ассоциации /                    диссоциации
           
            if (msr.getStatus() == ASSOCIATED)
            {
              // яй это здорово. светодиодная вспышка
              flashLed(statusLed, 10, 10);
            }
           
            else if (msr.getStatus() == DISASSOCIATED)
            {
              // это ужасно .. светодиодной вспышкой, чтобы показать наше недовольство
              flashLed(errorLed, 10, 10);
            }
           
            else
            {
              // другой статус
              flashLed(statusLed, 5, 10);
            }
          }
         
          else
          {
              // Не то, что мы ожидали
            flashLed(errorLed, 1, 25);  
          }
        }
       
        else if (xbee.getResponse().isError())
        {
          //nss.print("Error reading packet.  Error code: ");
          //nss.println(xbee.getResponse().getErrorCode());
        }
    }
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    Код (Text):

    data = rx.getData(0) - '0';
     
    Провальная попытка перевести строку в число. getData() возвращает указатель на начало данных в пакете. Иными словами строку. Вы от указателя отнимаете 48 и этот адрес приводите к int. Очевидно вы не то хотели. Попробуйте:

    Код (Text):

    data = atoi(rx.getData());
     
     
  3. Дмитрий_

    Дмитрий_ Нерд

    спасибо попробую
     
  4. Дмитрий_

    Дмитрий_ Нерд

    при создании ругается!

    ardu.jpg
     
  5. Дмитрий_

    Дмитрий_ Нерд

    всё заработало
    1) здесь максимальное число должно быть 256 и без кавычек
    uint8_t payload_1[] = { "313" };
    uint8_t payload_1[] = {256};
    2) здесь без -'0'
    data = rx.getData(0) - '0';
    data = rx.getData(0);

    ОСтался один вопрос как RSSI получить в переменную и вывести на дисплей???????
    ой
     
  6. А что за библиотека XBee.h? В чем ее преимущество перед обычным serial?
     
  7. Дмитрий_

    Дмитрий_ Нерд