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);
}
Что бы сильно не заморачиваться, можно засунуть вот этот кусок
Вставка программного кода в тему/комментарий
спасибо