Arduino:Примеры/Series1 Tx

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Отправка пакетов[1]

Этот пример показывает, как при помощи библиотеки XBee настроить XBee-модуль на отправку пакетов.

Код

/**
 * Автор – Эндрю Рэпп (Andrew Rapp). 2009 год, все права защищены.
 *
 * Этот файл – часть библиотеки XBee-Arduino.
 *
 * Библиотека XBee для Arduino – это бесплатное ПО: его можно 
 * распространять и/или модифицировать согласно условиям Универсальной 
 * общественной лицензии GNU, изданной Фондом свободного ПО – будь то 
 * 3-тья или более поздняя версия этой лицензии (на ваш выбор).
 *
 * Библиотека XBee-Arduino распространяется бесплатно в надежде на то, 
 * что окажется полезной, но БЕЗО ВСЯКОЙ ГАРАНТИИ; включая даже 
 * обязательную гарантию на КОММЕРЧЕСКОЕ КАЧЕСТВО и ПРИГОДНОСТЬ 
 * КОНКРЕТНОЙ ЦЕЛИ. Более подробно читайте в Универсальной 
 * общественной лицензии GNU.
 *
 * Вы должны получить копию Универсальной общественной лицензии GNU 
 * вместе с библиотекой XBee-Arduino. Если не получили, ее можно найти 
 * на http://www.gnu.org/licenses/.
 */
 
 
#include <XBee.h>

/*
Этот пример – для XBee-модуля Series 1.
Он отправляет запрос TX16 или TX64 со значением analogRead(pin5) и проверяет, успешно ли закончилась операция. Примечание: в моем случае XBee-модуль начинал сообщать об успехе спустя около 15 секунд, поэтому при запуске я добавил задержку.
*/

XBee xbee = XBee();

unsigned long start = millis();

// Выделяем два байта для хранения 10-битных аналоговых данных, 
// которые будут прочитаны:
uint8_t payload[] = { 0, 0 };

// Для XBee-модуля типа Series 1 можно использовать и 16-битный, и 64-битный адреса

// 16-битный адрес: введите адрес удаленного XBee-модуля (как правило, это координатор):
Tx16Request tx = Tx16Request(0x1874, payload, sizeof(payload));

// 64-битный адрес: это адрес (SH + SL) удаленного XBee-модуля:
// XBeeAddress64 addr64 = XBeeAddress64(0x0013a200, 0x4008b490);
// Будет отправляться пакет RX16, за исключением случаев, когда 
// значение MY у принимающего модуля не выставлено на «FFFF».
// Tx64Request tx = Tx64Request(addr64, payload, sizeof(payload));

TxStatusResponse txStatus = TxStatusResponse();

int pin5 = 0;

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);
  Serial.begin(9600);
  xbee.setSerial(Serial);
}

void loop() {
   
   // Запускаем передачу данных после задержки при запуске. 
   // Примечание: Возможно, не самое лучшее решение, потому что это
   // значение в конце концов откатится к «0»:
    if (millis() - start > 15000) {
      // Разбиваем считанное 10-битное значение на два байта
      // и размещаем их в полезной нагрузке:
      pin5 = analogRead(5);
      payload[0] = pin5 >> 8 & 0xff;
      payload[1] = pin5 & 0xff;
      
      xbee.send(tx);

      // Активируем TX-светодиод:
      flashLed(statusLed, 1, 100);
    }
  
    // После отправки TX-запроса 5 секунд ждем статусного ответа.
    if (xbee.readPacket(5000)) {
        // Ответ получен!

        // Должен быть статус ZNET TX:            	
    	if (xbee.getResponse().getApiId() == TX_STATUS_RESPONSE) {
    	   xbee.getResponse().getTxStatusResponse(txStatus);
    		
    	   // Получаем статус о доставке пакета, пятый байт:
           if (txStatus.getStatus() == SUCCESS) {
            	// Успех. Время праздновать!
             	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 {
      // Локальный XBee-модуль не дает своевременного 
      // статусного TX-ответа. Это значит, что он либо неправильно 
      // настроен, либо не подключен.
      flashLed(errorLed, 2, 50);
    }
    
    delay(1000);
}

См.также

Внешние ссылки