Добрый день не могу понять что не так делаю почему не работает включение диода и как мне получить RSSI? по задумке когда на первой ардуине нажимаешь кнопку 1, то на второй ардуине должен загореться диод,а когда нажимаешь кнопку 2, то диод должен погаснуть. А на самом деле получается что я нажимаю кнопку 1 или 2 на первой ардуине, то на второй ардуине диод загорается и сразу гаснет железо: 2 arduino uno 2 xbeepro в api режиме вот мой код передатчик: Код (Text): #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); } Приёмник: Код (Text): #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()); } }
Код (Text): data = rx.getData(0) - '0'; Провальная попытка перевести строку в число. getData() возвращает указатель на начало данных в пакете. Иными словами строку. Вы от указателя отнимаете 48 и этот адрес приводите к int. Очевидно вы не то хотели. Попробуйте: Код (Text): data = atoi(rx.getData());
всё заработало 1) здесь максимальное число должно быть 256 и без кавычек uint8_t payload_1[] = { "313" }; uint8_t payload_1[] = {256}; 2) здесь без -'0' data = rx.getData(0) - '0'; data = rx.getData(0); ОСтался один вопрос как RSSI получить в переменную и вывести на дисплей??????? ой