如何解决如何在arduino中存储和调用多个字母?
我是编程的新手,我正在尝试制作一个可根据串行输入调整LED的程序。
#define Bathroom 13 //LED connected to pin13 named bathroom
#define Livingroom 9 //LED connected to pin9 named livingroom
char *myStrings[] = {"bathdim","bathbright","livingdim","livingbright","beddim","bedbright"};
void setup(){
pinMode(Bathroom,OUTPUT);
pinMode(Livingroom,OUTPUT);
Serial.begin(9600);
}
void loop() {
if(Serial.read() == *myStrings[0]){
Serial.println(*myStrings[0]); // prints "bathdim" on the serial monitor
digitalWrite(Bathroom,0); // turns lights off
delay(100);
}
if(Serial.read() == *myStrings[1]){ // prints "bathbright" on the serial monitor
Serial.println(*myStrings[1]); // turns lights on
digitalWrite(Bathroom,1);
delay(100);
}
if(Serial.read() == *myStrings[2]){
Serial.println(*myStrings[2]);
digitalWrite(Livingroom,0);
delay(100);
}
if(Serial.read() == *myStrings[3]){
Serial.println(*myStrings[3]);
digitalWrite(Livingroom,1);
delay(100);
}
}
在运行代码时,我键入了“ bathbright”,应该已经打开了灯,但是我没有用,Serial.println(* myStrings [1])只打印字母“ b”,而不打印浴袍”
有人可以帮忙吗?
编辑
#define Bathroom 13 //LED connected to pin13 named bathroom
#define Livingroom 9 //LED connected to pin9 named livingroom
char *myStrings[] = {"bathdim",OUTPUT);
Serial.begin(9600);
}
void loop() {
if(Serial.read() == *myStrings[0]){
Serial.println(myStrings[0]);
digitalWrite(Bathroom,0);
delay(100);
}
if(Serial.read() == *myStrings[1]){
Serial.println(myStrings[1]);
digitalWrite(Bathroom,1);
delay(100);
}
if(Serial.read() == *myStrings[2]){
Serial.println(myStrings[2]);
digitalWrite(Livingroom,0);
delay(100);
}
if(Serial.read() == *myStrings[3]){
Serial.println(myStrings[3]);
digitalWrite(Livingroom,1);
delay(100);
}
}
该代码最初运行良好,但是在几次输入bathbright和bathdim之后,他的串行打印无法打印正确的单词,并且LED并不总是响应...
最终代码:
#define Bathroom 13 //LED connected to pin13 named bathroom
#define Livingroom 9 //LED connected to pin9 named livingroom
void setup(){
Serial.begin(9600);
pinMode(Bathroom,OUTPUT);
}
void loop(){
String str = Serial.readString();
if(str.indexOf("bathdim") > -1){
Serial.println("dimming bathroom");
digitalWrite(Bathroom,0);
}
if(str.indexOf("bathbright") > -1){
Serial.println("lighting up bathroom");
digitalWrite(Bathroom,1);
}
if(str.indexOf("livingdim") > -1){
Serial.println("dimming Livingroom");
digitalWrite(Livingroom,0);
}
if(str.indexOf("livingbright") > -1){
Serial.println("lighting up Livingroom");
digitalWrite(Livingroom,1);
}
}
解决方法
只需删除*!因为* string指的是字符串中的第一种情况!因此* string [0]指的是字符串数组中第一种情况下的第一个字母!
,*(myStrings [0])将获得数组中的第一个字符(char *),该字符指向包含bathdim的起始内存位置,然后使用打印第一个字符的*取消引用,因此得到字母b
只需删除该取消引用,就删除该*
编辑-看到了您更新的问题,星星没有消失,但是无论如何尝试使用Serial.readString()读取字符串,您一次只能读取1个字节
, Serial.read()
将仅读取第一个字节。您必须循环读取整个字符串(以及足够大的缓冲区),然后使用compare函数比较字符串。
作为测试的替代方法,您可以使用单字节代码-例如'a'
,'b'
,'c'
和'd'
。
要打印行进中的第二个字符串,可以使用Serial.println(myStrings[1])
。
以下是使用单个字符的示例:
void loop() {
if (Serial.available()) {
int value = Serial.read();
switch (value) {
case 'a':
digitalWrite(Bathroom,0);
break;
case 'b':
digitalWrite(Bathroom,1);
break;
case 'c':
digitalWrite(Livingroom,0);
break;
case 'd':
digitalWrite(Livingroom,1);
break;
default :
break;
}
if (value >= 'a') { // avoid delaying on newlines
delay(100);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。