在 Arduino 中接收到可用变量的字符串
Recieved String to useable variable in Arduino
我正在尝试使用通过蓝牙从移动应用程序发送到 Arduino 的数据。根据所需的功能,将收到 2 个字符串。
第一个函数:当接收到字符串"ledon"或"ledoff"时,点亮或熄灭一个led。
第二个功能:我从应用程序中获取用户在 2 个框中输入的数据,一个是文本框,另一个是密码框,Arduino 将其作为一个字符串接收,并以逗号作为分隔符,因此字符串可以分成它的组成部分,在本例中是 "ssid name" 和 "network key"。我打算将这些详细信息写入板载 SD 卡,以便 wifi 模块能够登录到 ssid 和网络密钥也相关的网络。
到目前为止,我可以让 LED 灯正常工作,我还可以读取字符串,用定界符分隔并打印到串行监视器。然而,当我尝试组合这两个代码时,尽管正确的命令被打印到串行监视器中,但 led 功能无法打开或关闭 led 灯。我已经研究了如何解决这个问题,尝试将每个要求作为一个独立的函数并在循环部分调用它们,它们单独工作但是当再次一起调用时 LED 无法亮起。
这是我目前使用的代码:
const int ledPin = 11;
String readString;
void setup() {
Serial.begin(9600);
pinMode (ledPin, OUTPUT);
}
void loop() {
while (Serial.available()) {
delay(3);
char c = Serial.read();
readString += c;
}
//turns led on or off
if (readString.length() >0) {
Serial.println(readString);
if (readString == "ledon")
{
digitalWrite (ledPin, HIGH);
}
if (readString == "ledoff")
{
digitalWrite (ledPin, LOW);
}
readString="";
//seperates the string into 2 lines using the delimiter ","
String first = Serial.readStringUntil(',');
Serial.read(); //next character is comma, so skip it using this
String second = Serial.readStringUntil(',');
Serial.read();
Serial.println(first);
Serial.println(second);
readString="";
}
}
如果我注释掉代码的字符串部分,led 可以正常打开和关闭,如果我尝试 运行 代码按原样打印出您期望的所有内容,但 led 不亮上。
我是 Arduino、c 和 c++ 的新手,我似乎无法理解这一点,所以任何帮助都会很棒。
我用来控制它的应用是在 Mit 的 App Inventor 2 中构建的
我终于解决了这个问题。
我决定查看其他合乎逻辑的步骤来找到解决方案。
我认为问题可能是不同的字符串执行不同的操作,可能在某种程度上存在冲突。
在我的研究中,我发现蓝牙模块 HC-05 有 2 个引脚,在我的例子中没有被使用,关键引脚和状态引脚,在这个堆栈溢出讨论中 Tell when Bluetooth module connects on Arduino 并决定这个逻辑使用 "State pin" 表示蓝牙连接将消除字符串逻辑中任何冲突的可能性。
一旦我找到了放置和排序 "where" 语句的最佳方式,我就设法在我的项目中获得了此时的功能,然后允许我继续开发的下一步。
我现在得到的代码:
const int ledPin1 = 11;
const int ledPin2 = 4;
String readString;
boolean BTconnected = false;
void setup() {
Serial.begin(9600);
pinMode (ledPin1, OUTPUT);
pinMode (ledPin2, INPUT);
}
void loop() {
while (!BTconnected)
{
if ( digitalRead(ledPin2)==HIGH) { BTconnected = true;};
}
digitalWrite(ledPin1, HIGH);
Serial.println("HC-05 is now connected");
Serial.println("");
while (BTconnected)
{
if ( digitalRead(ledPin2)==LOW) { BTconnected = false;
digitalWrite(ledPin1, LOW);
Serial.println("HC-05 is now disconnected");
Serial.println("");
};
while (Serial.available())
{
delay(3);
char c = Serial.read();
readString += c;
}
if (readString.length() >0) {
//Serial.println(readString);
//readString="";
String first = Serial.readStringUntil(',');
Serial.read(); //next character is comma, so skip it using this
Serial.println(first);
//readString="";
String second = Serial.readStringUntil(',');
Serial.read();
Serial.println(second);
Serial.println("");
//readString="";
}
}
}
我正在尝试使用通过蓝牙从移动应用程序发送到 Arduino 的数据。根据所需的功能,将收到 2 个字符串。
第一个函数:当接收到字符串"ledon"或"ledoff"时,点亮或熄灭一个led。
第二个功能:我从应用程序中获取用户在 2 个框中输入的数据,一个是文本框,另一个是密码框,Arduino 将其作为一个字符串接收,并以逗号作为分隔符,因此字符串可以分成它的组成部分,在本例中是 "ssid name" 和 "network key"。我打算将这些详细信息写入板载 SD 卡,以便 wifi 模块能够登录到 ssid 和网络密钥也相关的网络。
到目前为止,我可以让 LED 灯正常工作,我还可以读取字符串,用定界符分隔并打印到串行监视器。然而,当我尝试组合这两个代码时,尽管正确的命令被打印到串行监视器中,但 led 功能无法打开或关闭 led 灯。我已经研究了如何解决这个问题,尝试将每个要求作为一个独立的函数并在循环部分调用它们,它们单独工作但是当再次一起调用时 LED 无法亮起。
这是我目前使用的代码:
const int ledPin = 11;
String readString;
void setup() {
Serial.begin(9600);
pinMode (ledPin, OUTPUT);
}
void loop() {
while (Serial.available()) {
delay(3);
char c = Serial.read();
readString += c;
}
//turns led on or off
if (readString.length() >0) {
Serial.println(readString);
if (readString == "ledon")
{
digitalWrite (ledPin, HIGH);
}
if (readString == "ledoff")
{
digitalWrite (ledPin, LOW);
}
readString="";
//seperates the string into 2 lines using the delimiter ","
String first = Serial.readStringUntil(',');
Serial.read(); //next character is comma, so skip it using this
String second = Serial.readStringUntil(',');
Serial.read();
Serial.println(first);
Serial.println(second);
readString="";
}
}
如果我注释掉代码的字符串部分,led 可以正常打开和关闭,如果我尝试 运行 代码按原样打印出您期望的所有内容,但 led 不亮上。
我是 Arduino、c 和 c++ 的新手,我似乎无法理解这一点,所以任何帮助都会很棒。
我用来控制它的应用是在 Mit 的 App Inventor 2 中构建的
我终于解决了这个问题。 我决定查看其他合乎逻辑的步骤来找到解决方案。 我认为问题可能是不同的字符串执行不同的操作,可能在某种程度上存在冲突。 在我的研究中,我发现蓝牙模块 HC-05 有 2 个引脚,在我的例子中没有被使用,关键引脚和状态引脚,在这个堆栈溢出讨论中 Tell when Bluetooth module connects on Arduino 并决定这个逻辑使用 "State pin" 表示蓝牙连接将消除字符串逻辑中任何冲突的可能性。 一旦我找到了放置和排序 "where" 语句的最佳方式,我就设法在我的项目中获得了此时的功能,然后允许我继续开发的下一步。
我现在得到的代码:
const int ledPin1 = 11;
const int ledPin2 = 4;
String readString;
boolean BTconnected = false;
void setup() {
Serial.begin(9600);
pinMode (ledPin1, OUTPUT);
pinMode (ledPin2, INPUT);
}
void loop() {
while (!BTconnected)
{
if ( digitalRead(ledPin2)==HIGH) { BTconnected = true;};
}
digitalWrite(ledPin1, HIGH);
Serial.println("HC-05 is now connected");
Serial.println("");
while (BTconnected)
{
if ( digitalRead(ledPin2)==LOW) { BTconnected = false;
digitalWrite(ledPin1, LOW);
Serial.println("HC-05 is now disconnected");
Serial.println("");
};
while (Serial.available())
{
delay(3);
char c = Serial.read();
readString += c;
}
if (readString.length() >0) {
//Serial.println(readString);
//readString="";
String first = Serial.readStringUntil(',');
Serial.read(); //next character is comma, so skip it using this
Serial.println(first);
//readString="";
String second = Serial.readStringUntil(',');
Serial.read();
Serial.println(second);
Serial.println("");
//readString="";
}
}
}