ARDUINO 入门学习第三课

<1>匹配一个字符串并且输出相应的内容

(1)我的第一想法是用serial.read() 函数,但是我们知道,串口通讯函数serial.read() 的功能是从串口缓存区读取一个字符并将之删除,此时我的想法是构建一个 Str类,用+=语法将每次读取的一个字符存入一个变量为str的字符串中,那么代码如下

void loop(){
    String str="";
    while(Serial.available()>0){
        char ch=Serial.read();
        str +=ch;
    }
    Serial.print("input the str:");
    Serial.println(str);
}

当我们向串口发送"hello"时,可以看到结果如下:
在这里插入图片描述
好像已经成功了一半,我们再加一个判断语句

if (str=="hello"){
    Serial.println("hello,world!");
}

可是当我们把程序烧录到ARDUINO上再向串口发送"hello"时,结果还是一样这是怎么回事呢?
其实"==“判断语句比较字符串时只会比较第一个字符,如果是比较字符当然没问题,可却是不能判断字符串。
(2)这个时候我又想到了用strcmp(str1,str2)函数,它的功能是对两个字符串进行比较,如果相等则返回"0”。好,我们用函数来试一下,把上面的if语句改为:

if (strcmp(str,"hello")==0){
    Serial.println("hello,world!");
}

但是当我们验证程序时报错了,错误信息如下:
在这里插入图片描述
我去网上查了一下,我的理解是这样的:传入strcmp()函数的两个参数一个是string 类型,而另外一个是char 类型,所以报错了。好吧我们换一种方法,让两个参数都变成char类型,可以创建一个char类型的数组,把读取到的字符存在里面,我的代码如下:

char trystring[6];
char serialdata[6];
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  strcpy(trystring,"hello");
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available()>0){
    
    for (int i=0;i<=4;i++){
      char str = Serial.read();
      serialdata[i]=str;
    }
  }
    
  if (strcmp(trystring,serialdata)==0){
      Serial.print("data is: ");
      Serial.println(serialdata);
      Serial.println("hello,world!");
      
    }
    delay(500);
  
}

当我们再次向串口发送"hello"时,来看看运行结果:
在这里插入图片描述
结果达到了我们的目的,perfect!

<2>实现目的:呼吸灯

(1)呼吸灯?那是啥?呃…就是从亮到暗从再从暗到亮,我们知道数字输出要么输出5V要么输出0V,那我们如果让输出的电压从0~5V一点一点的增加再一点一点的减少不就可以了吗?
(2)要实现这个目的,我们就要用到PWM波模拟值函数analogWrite(pin,value)函数了,他和digiralWrite(pin,value)用法一样,只是value值变成了0~255,映射到了0–5V,代码如下:

int LED=9;
void setup(){
    pinMode(LED,OUTPUT);
}

void loop(){
    for (int i=0;i<=255;i++){
        digital.Write(LED,i);
        delay(5);
    }
    for (int i=255;i>=0;i--){
        digital.Write(LED,i);
        delay(5);
    }
}

<3>通过光敏电阻与程序实现对LED灯的控制

话不多说,上代码:

void setup() {
  // put your setup code here, to run once:
  pinMode(2,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  Serial.begin(9600);
  digitalWrite(2,HIGH);
  delay(500);
  digitalWrite(4,HIGH);
  delay(500);
}

void loop() {
  // put your main code here, to run repeatedly:
  int a =analogRead(A0);
  int b= analogRead(A1);
  if (a>b){
    digitalWrite(2,LOW);
    digitalWrite(4,HIGH);
    delay(300);
  }
  else if(a<b){
    digitalWrite(4,LOW);
    digitalWrite(2,HIGH);
    delay(300);
  }
  delay(500);
  Serial.print("a: ");
  Serial.println(a);
  Serial.print("b: ");
  Serial.println(b);

}

我们在这里用到了analogRead(pin)函数,它的功能是模拟输入,用于模拟输入引脚读取数值,可以将0–5V的电压映射到数值0–1023,也就是0V等于0,5V等于1023,
线的连接如下:
在这里插入图片描述

只需要测量两个光敏电阻上的电压大小,再进行比较就可以实现了,当左边电阻减小时,让右边亮起来,当右边电阻减小时,让左边亮起来,当我们挡住任意一边时,另一边永远都不会亮。还可以打开串口看看程序具体实现过程哟!

<4>光敏呼吸灯

这个实验就是结合<2>和<3>稍稍改动就可以了,来看代码:

 void setup() {
  // put your setup code here, to run once:
  pinMode(3,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  Serial.begin(9600);
  analogWrite(3,127);
  analogWrite(5,127);
  for (int i=127;i<=255;i++){
    analogWrite(3,i);
    analogWrite(5,255-i);
    delay(10);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  int a =analogRead(A0);
  int b= analogRead(A1);
  if (a>b){
    for (int i=0;i<=255;i++){
      analogWrite(3,255-i);
      analogWrite(5,i);
      delay(5);
    }
  }
  else if(a<b){
    for (int i=0;i<=255;i++){
      analogWrite(5,255-i);
      analogWrite(3,i);
      delay(5);
    }
  }
  delay(100);
  Serial.print("a: ");
  Serial.println(a);
  Serial.print("b: ");
  Serial.println(b);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值