Arduino:Примеры/Series1 Tx
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Отправка пакетов[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);
}