【问题标题】:How to turn on LED that's attached to an arduino via BLE from ios app?如何从 ios 应用程序通过 BLE 打开连接到 arduino 的 LED?
【发布时间】:2019-07-26 19:16:43
【问题描述】:

这里是场景。我有一个 esp32、2 个 LED 和一个 ios 示例应用程序,我在网上找到了 here。目前,如果我按下我的 esp32 上的按钮,它会通知 ios 应用程序显示“1”,如果再次按下它会显示“0”。这完美地工作。

棘手的部分是这个 ios 应用程序允许我向 esp32 发送写入命令。我想这样做,如果发送“1”,LED A 亮起,LED B 熄灭,那么当发送 0 时,LED A 熄灭,LED B 亮起。我无法做到这一点。尽我所能,我无法弄清楚这个项目的链条中哪里出了问题。可能是 esp32 上的代码,也可能是我不确定的应用程序。

这是我的 arduino 代码。 (代码还有很多没有提到,我其实有 4 个 LED,但我只想在发送写命令时打开 2 个特定的)。

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
bool deviceConnected = false;
bool oldDeviceConnected = false;
boolean oldState = LOW;
uint32_t value = 0;

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
};

void onDisconnect(BLEServer* pServer) {
  deviceConnected = false;
}
};

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string rxValue = pCharacteristic->getValue();

      if (rxValue.length() > 0) {
        Serial.print("Received Value: ");

        for (int i = 0; i < rxValue.length(); i++) {
          Serial.print(rxValue[i]);
         }

        Serial.println();

        if (rxValue.find("1") != -1) {
          digitalWrite(13, HIGH);
          digitalWrite(27, LOW);
        }
        else if (rxValue.find("0") != -1) {
          digitalWrite(13, LOW);
          digitalWrite(27, HIGH);
        }
      }
    }
};

const int bt1 = 14;
boolean bt1g = true;
int bt1t = 0;


void setup() {
  pinMode(13, OUTPUT);
  pinMode(15, OUTPUT);
  pinMode(33, OUTPUT);
  pinMode(27, OUTPUT);
  pinMode(bt1, INPUT_PULLUP);
  Serial.begin(9600);

  BLEDevice::init("ESP32");
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());
  BLEService *pService = pServer->createService(SERVICE_UUID);

  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID,
                      BLECharacteristic::PROPERTY_WRITE  |
                      BLECharacteristic::PROPERTY_NOTIFY
                    );

  pCharacteristic->addDescriptor(new BLE2902());

  pService->start();

  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(false);
  pAdvertising->setMinPreferred(0x0);
  BLEDevice::startAdvertising();
  Serial.println("Waiting a client connection to notify...");
}

void loop()
{


  if (bt1g) {
    if (digitalRead(bt1) == LOW ) {
      bt1t = (bt1t + 1) % 2;
      Serial.println(bt1t);
      bt1g = false;

    }
  }
  if (!bt1g) {
    if (digitalRead(bt1) == HIGH) {
      bt1g = true;
    }
  }

  if (bt1t == 0) {
    digitalWrite(15, LOW);
    digitalWrite(33, HIGH);

  }
  }

  boolean newState = digitalRead(15);

  if (deviceConnected) {
    if (newState != oldState) {
      if (newState == LOW) {
        pCharacteristic->setValue("1");

      }
      else {
        pCharacteristic->setValue("0");

      }
      pCharacteristic->notify();
    };

    oldState = newState;

  }
  delay(50);
}

ios 应用的整个代码似乎太长,无法提交到这篇文章,所以here 是 github

我真的不确定并且陷入了困境。任何帮助表示赞赏!

【问题讨论】:

  • 我试图查看您的代码,但发现它是多余的。为了从您的 iOS apo 接收写入命令,您不需要循环中的任何代码。当从连接的应用程序发送数据时,将触发写入功能的特征回调。您还试图在循环中操纵这些输出的事实令人困惑。为什么不简化您的示例,删除循环中发生的事情并再次尝试发布。我想帮忙,但在遵循您的逻辑时遇到了麻烦

标签: ios swift arduino bluetooth-lowenergy esp32


【解决方案1】:

可能是您没有发现正确的特征吗?看起来您只有一项服务和一项特征。

【讨论】:

  • 我需要多个特征吗?一位用户here at the bottom 表示您可能可以在一个特性中制作多个 LED。
  • 我不完全确定。我不完全清楚客户端(iOS)或设备端(esp32?)的代码是什么你说你想让一个服务/特性控制点亮A-on和B-的统计数据关闭或 A-off 和 B-on。如果是这种情况,那么写入该特征应该可以解决问题。如果这不起作用,它似乎是在硬件方面。您可以使用“LightBlue”等第三方 ble 应用程序进行调试,而不是同时调试您的应用程序和硬件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多