Xbee API, arduino uno, Управление, RSSi
- Войдите на сайт для отправки комментариев
Чт, 04/10/2012 - 11:22
Добрый день не могу понять что не так делаю почему не работает включение диода
и как мне получить 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());
}
}
В этой теме не работало по той же причине, что и у вас. Вообще странно что светодиод у вас загорается и тухнет, вы точно на светодиод на 13 выводе смотрите?
там используется AT режим а у меня API
всё заработало
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 получить в переменную и вывести на дисплей???????
Все верно, дело в типе данных.
По поводу RSSI, я не знаю настроен ли этот вывод по-умолчанию как RSSI, но если настроен, то этот вывод в зависимости от уровня сигнала меняет скважность ШИМ. Можно воспользоваться функцией pulseIn или внешним прерыванием.
попробую
ещё вопрос как запихнуть это в отдельную функцию
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);
}
продолжение
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);
}
Что бы сильно не заморачиваться, можно засунуть вот этот кусок
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; } .......Вставка программного кода в тему/комментарий
спасибо