找回密码
 立即注册

QQ登录

求助LED顺输入数据亮灯

来源: 已解决 玛朵布莎辞 2016-7-15 15:02 显示全部楼层 |阅读模式
在串口中输入一串字符ryg三种颜色,怎么编写程序按照指定输入顺序依次亮灯,我想用数组取出每一位输入字符,但是事例程序给的判断是带有ASCII码的,不知道ARDUINO是不是能自动把字母转化为ASCII码,希望有大神能给出简单的事例程序,望不吝赐教
回复

使用道具 举报

大神点评6

玛朵布莎辞 发表于 2016-7-21 09:01
C语言中使用scanf("%s",&a[10])来接收输入的字符型数据并存入数组,我不太了解Arduino是如何用数组接住从串 ...

String comdata = "";
void setup()
{
  Serial.begin(9600);
  for(int i = 2; i <= 13; i++) pinMode(i, OUTPUT);
}

void loop()
{
  while (Serial.available() > 0)
  {
    comdata += int(Serial.read()) - '0';
    delay(2);
  }
  if(comdata.length() > 0)
  {
    for(int i = 0; i < comdata.length(); i++)
    {
      if(comdata=='0'||comdata=='1')
      {
        digitalWrite(i + 2, comdata - '0');
        Serial.print("Pin ");
        Serial.print(i + 2);
        Serial.print(" is ");
        Serial.println(comdata);
      }
    }
    comdata = "";
  }
}
你说这种字符方式,还没有调试出来,这个是通过输入 01 来控制引脚输出高低电平,关于字符串的操作可以参考一下这个例程
回复 支持 1 反对 0

使用道具 举报

#define R_LED 2
#define Y_LED 3                //定义三个led灯控制引脚为2、3、4,
#define G_LED 4                //分别连接红色、黄色和绿色发光二极管

int temp = 0;                //定义一个存储串口输入数值的变量

void setup()
{
  Serial.begin(9600);          //设置串口波特率为9600

  pinMode(R_LED,OUTPUT);  
  pinMode(Y_LED,OUTPUT);  
  pinMode(G_LED,OUTPUT);  //设定led灯控制引脚为输出状态
}

void loop()
{  cha a[10]={0},m=0,n=0;
  if(Serial.available()>0)        //如果串口缓冲区有数据
  {
    temp=Serial.read();        //读取串口数据
    a[10]=temp;
    for(n=0;n<10;)
   { switch (a[n]){

    case (114) :                           //在串口监视器中输入“r”时
      {
      digitalWrite(R_LED, HIGH);
      digitalWrite(Y_LED, LOW);       
      digitalWrite(G_LED, LOW);                //设定只点亮红灯
      Serial.println("red");
      break;
      }
    case (121) :                           //在串口监视器中输入“y”时
      {
      digitalWrite(R_LED, LOW);       
      digitalWrite(Y_LED, HIGH);
      digitalWrite(G_LED, LOW);                //设定只点亮黄灯
      Serial.println("yellow");
      break;
      }
    case (103) :                           //在串口监视器中输入“g”时
      {
      digitalWrite(R_LED, LOW);
      digitalWrite(Y_LED, LOW);
      digitalWrite(G_LED, HIGH);        //设定只点亮绿灯
      Serial.println("green");
      break;
      }
    case (97) :                           //在串口监视器中输入“a”时
      {
      digitalWrite(R_LED, HIGH);
      digitalWrite(Y_LED, HIGH);
      digitalWrite(G_LED, HIGH);        //三个小灯全部点亮
      Serial.println("all");
      break;
      }
    case (110) :                           //在串口监视器中输入“n”时
      {
      digitalWrite(R_LED, LOW);
      digitalWrite(Y_LED, LOW);
      digitalWrite(G_LED, LOW);                //三个小灯全部熄灭
      Serial.println("none");
      break;
      }
    }
  }
  n++;
}
}
以上是我按照C语言语法写的算法,和ARduino好像不太融合 红色部分为我在原始程序上加以修饰的代码
回复 支持 反对

使用道具 举报

cha a[10]={0},m=0,n=0;  这条错了吧?  计算机数据存储及计算通用的都是以ASCII码的形式,这个不需要转换,比如说上面的程序 case (114) 和case(‘r’)是一样的,因为字符r 在计算机里面存储时,它的ASCII码值就是114
回复 支持 反对

使用道具 举报

char a[10]={0}这句我是定义并初始化一个数组,现在我的想法是用一个字符型数组接收从串口得到的字符型数据,每一个字符占据数组的一个位置,再依次判断数组中每一个位置的储存值,然后依次亮灯
回复 支持 反对

使用道具 举报

C语言中使用scanf("%s",&a[10])来接收输入的字符型数据并存入数组,我不太了解Arduino是如何用数组接住从串口输入的数据?
回复 支持 反对

使用道具 举报

玛朵布莎辞 发表于 2016-7-21 09:01
C语言中使用scanf("%s",&a[10])来接收输入的字符型数据并存入数组,我不太了解Arduino是如何用数组接住从串 ...

串口字符控制彩灯程序,可以参考这个来修改
char buffer[18];
int red, green, blue;
int RedPin = 11;
int GreenPin = 10;
int BluePin = 9;
void setup()
{
Serial.begin(9600);
Serial.flush();
pinMode(RedPin, OUTPUT);
pinMode(GreenPin, OUTPUT);
pinMode(BluePin, OUTPUT);
}
void loop()
{
if (Serial.available() > 0) {
int index=0;
delay(100); // let the buffer fill up
int numChar = Serial.available();
if (numChar>15) {
numChar=15;
}
while (numChar--) {
buffer[index++] = Serial.read();
}
splitString(buffer);
}
}
void splitString(char* data) {
Serial.print("Data entered: ");
Serial.println(data);
char* parameter;
parameter = strtok (data, " ,");
while (parameter != NULL) {
  setLED(parameter);
parameter = strtok (NULL, " ,");
}
// Clear the text and serial buffers
for (int x=0; x<16; x++) {
buffer[x]='\0';
}
Serial.flush();
}
void setLED(char* data) {
if ((data[0] == 'r') || (data[0] == 'R')) {
int Ans = strtol(data+1, NULL, 10);
Ans = constrain(Ans,0,255);
analogWrite(RedPin, Ans);
Serial.print("Red is set to: ");
Serial.println(Ans);
}
if ((data[0] == 'g') || (data[0] == 'G')) {
int Ans = strtol(data+1, NULL, 10);
Ans = constrain(Ans,0,255);
analogWrite(GreenPin, Ans);
Serial.print("Green is set to: ");
Serial.println(Ans);
}
if ((data[0] == 'b') || (data[0] == 'B')) {
int Ans = strtol(data+1, NULL, 10);
Ans = constrain(Ans,0,255);
analogWrite(BluePin, Ans);
Serial.print("Blue is set to: ");
Serial.println(Ans);
}
}
回复 支持 反对

使用道具 举报

您可能感兴趣的文章

您需要登录后才可以回帖 登录 | 立即注册

关注0

粉丝2

帖子1

发布主题
社区热门 MORE+
    社区热帖 MORE+