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

___L___
Offline
Зарегистрирован: 10.08.2012

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

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

#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);
}

Приемник:

#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());
    }
}

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

В этой теме не работало по той же причине, что и у вас. Вообще странно что светодиод у вас загорается и тухнет, вы точно на светодиод на 13 выводе смотрите?

___L___
Offline
Зарегистрирован: 10.08.2012

 там используется AT режим а у меня API

___L___
Offline
Зарегистрирован: 10.08.2012

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

Оcтался один вопрос как RSSI получить в переменную и вывести на дисплей???????

maksim
Offline
Зарегистрирован: 12.02.2012

Все верно, дело в типе данных.

maksim
Offline
Зарегистрирован: 12.02.2012

По поводу RSSI, я не знаю настроен ли этот вывод по-умолчанию как RSSI, но если настроен, то этот вывод в зависимости от уровня сигнала меняет скважность ШИМ. Можно воспользоваться функцией pulseIn или внешним прерыванием.

___L___
Offline
Зарегистрирован: 10.08.2012

 попробую

 

___L___
Offline
Зарегистрирован: 10.08.2012

 ещё вопрос как  запихнуть это в отдельную функцию

void loop()

{

if (!digitalRead(buttonPins[0]))
{
graphic.Box(10,10,120,50,4);
graphic.setForeColour(0,0,0);
graphic.setFont(11);
graphic.setCoordinate(50,24);
graphic.print("1");
//отправить в переменную число
knopka = 1;
otvet = 1;
}

if (!digitalRead(buttonPins[1]))
{
graphic.Box(10,10,120,50,4);
graphic.setForeColour(0,0,0);
graphic.setFont(11);
graphic.setCoordinate(50,24);
graphic.print("2");
knopka = 2;
otvet = 2;
}

if (!digitalRead(buttonPins[2]))
{
graphic.Box(10,10,120,50,4);
graphic.setForeColour(0,0,0);
graphic.setFont(11);
graphic.setCoordinate(50,24);
graphic.print("3");
knopka = 3;
otvet = 3;
}

if (!digitalRead(buttonPins[3]))
{
graphic.Box(10,10,120,50,4);
graphic.setForeColour(0,0,0);
graphic.setFont(11);
graphic.setCoordinate(50,24);
graphic.print("4");
knopka = 4;
otvet = 4;
}

if (!digitalRead(buttonPins[4]))
{
graphic.Box(10,10,120,50,4);
graphic.setForeColour(0,0,0);
graphic.setFont(11);
graphic.setCoordinate(50,24);
graphic.print("5");
knopka = 5;
otvet = 5;
}
if (!digitalRead(buttonPins[5]))
{
graphic.Box(10,10,120,50,4);
graphic.setForeColour(0,0,0);
graphic.setFont(11);
graphic.setCoordinate(16,24);
graphic.print("Proverka");
knopka = 9;
otvet = 6;
}
if (!digitalRead(buttonPins[6]))
{
graphic.Box(10,10,120,50,4);
graphic.setForeColour(0,0,0);
graphic.setFont(11);
graphic.setCoordinate(16,24);
graphic.print("Viklucit");
knopka = 0;
otvet = 0;
}

if (!digitalRead(buttonPins[7]))
{
xbee.send(zbTx);//кнопка отправить команду из переменной knopka
graphic.Box(10,10,120,50,4);
graphic.setForeColour(0,0,0);
graphic.setFont(11);
graphic.setCoordinate(50,24);
graphic.print("TX");
// flashLed(statusLed, 1, 1000);
}

___L___
Offline
Зарегистрирован: 10.08.2012

продолжение

if (xbee.readPacket(200))  //было 500
{
// Получил ответ!

// должен быть ZNet TX статус
if (xbee.getResponse().getApiId() == ZB_TX_STATUS_RESPONSE) {
xbee.getResponse().getZBTxStatusResponse(txStatus);

// получить статус доставки, пятый байт
// успешно доставлен
if (txStatus.getDeliveryStatus() == SUCCESS) {
graphic.Box(10,10,120,50,4);
graphic.setForeColour(0,0,0);
graphic.setFont(11);
graphic.setCoordinate(50,24);
graphic.print("OK");
graphic.setFont(0);
graphic.setCoordinate(13,40);
graphic.print(otvet);

}
else {
// удаленный XBee не получили наше пакет. оно включено?
// flashLed(errorLed, 3, 500);
graphic.Box(10,10,120,50,4);
graphic.setForeColour(GLCD_RED);
graphic.setFont(11);
graphic.setCoordinate(18,24);
graphic.print("OSHI");
graphic.setFont(0);
graphic.setCoordinate(13,40);
graphic.print(otvet);
}
}
}
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);
}

maksim
Offline
Зарегистрирован: 12.02.2012

 Что бы сильно не заморачиваться, можно засунуть вот этот кусок

void Function(){
  graphic.Box(10,10,120,50,4);
  graphic.setForeColour(0,0,0); 
  graphic.setFont(11);
  graphic.setCoordinate(16,24);
}
......
if (!digitalRead(buttonPins[0]))
{
 Function();
 graphic.print("1"); 
 //отправить в переменную число
 knopka = 1; 
 otvet = 1;
}

if (!digitalRead(buttonPins[1]))
{
 Function();
 graphic.prin<strong></strong>t("2"); 
 knopka = 2;
 otvet = 2;
}
.......

 

maksim
Offline
Зарегистрирован: 12.02.2012
___L___
Offline
Зарегистрирован: 10.08.2012

 спасибо