<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);
}