目录
一、如何匹配一个字符串并输出相应的结果
上一篇有讲到输入单个字符并输出相应结果,现在就来介绍输入字符串并输出相应结果。
相关函数:
函数名 | 描述 |
strcmp() | int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较: 如果返回值小于 0,则表示 str1 小于 str2。 如果返回值大于 0,则表示 str1 大于 str2。 如果返回值等于 0,则表示 str1 等于 str2。 |
strcpy() | char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。 |
为什么按照上一篇的方法输入“True”也能输出呢?因为判断语句“==”只会读取第一个字符,第一个字符判断对了就直接执行{}内的语句。而现在要匹配的是字符串,我们可以用到strcmp()来比较。
char input[6];
char target[6];
void setup(){
Serial.begin(9600); //设置波特率
strcpy(target,"hello"); //把hello赋值给字符数组target
}
void loop(){
int i;
char str;
if(Serial.available()>0){
for(i=0;i<5;i++){
str = Serial.read();
input[i] = str; //把输入的字符串依次输入到一个数组中
}
}
if(strcmp(target,input)==0){ //是两个字符型数组的比较
Serial.println("Hello World!");
}
delay(500);
}
二、呼吸灯实现
analogWrite()函数
将一个模拟数值写进Arduino引脚,可以用来控制LED的亮度。Arduino每一次对引脚执行analogWrite()指令,都会给该引脚一个固定频率的PWM信号。用了这个函数前面可以不用pinMode()函数。
Q:什么是PWM?
A:PWM的全称是脉冲宽度调制(Pulse-width modulation),是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式。假设高电平为5V,低电平则为0V。我们要输出不同的模拟电压,就要用到PWM,通过改变I/O口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号。
Q:什么是占空比?
A:是一个脉冲周期内,高电平的时间与整个周期时间的比例。LED灯的明亮程度就取决于占空比,占空比越大平均电平就大。
当周期的时间极短时,我们看不到LED灯闪烁的效果,而会看到LED变暗的效果。
代码:
void setup(){
//因为后面用到analogWrite函数所以可以不用pinMode,注意要接有PWM波的引脚
}
void loop(){
int i;
for(i=0;i<=255;i+=5){ //逐渐变亮,这里也可以是i++,这样就要缩短for循环里延迟的时长,按自己喜欢的来,都OK
analogWrite(9,i);
delay(15); //注意循环里面也要延迟,否则只是亮灭
}
delay(800);
for(i=255;i>=0;i-=5){ //逐渐变暗,注意255是因为LED的最大亮度是255
analogWrite(9,i);
delay(15);
}
delay(1000);
}
三、运用光敏电阻控制LED灯的亮灭
analogRead()函数
从模拟引脚读取值。
电路(图源 会参考的猴子):
模拟引脚2处相当于小电阻的电压
代码:
void setup(){
Serial.begin(9600);
pinMode(9,OUTPUT);
}
void loop(){
int val = analogRead(A0); //读取模拟引脚的输入值
Serial.println(val);
if(val>=1020){ //这个1020我是根据在串口监视器输出的值来定的
analogWrite(9,HIGH); //相当于暗的环境亮灯,亮的环境灭灯
}
else{
analogWrite(9,LOW);
}
}
扩展:运用光敏电阻控制两个LED灯的亮灭
电路:
代码:
void setup(){
Serial.begin(9600);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
}
void loop(){
int val1 = analogRead(A0);
int val2 = analogRead(A1); //读取模拟引脚输入值
Serial.print("val1是:");
Serial.println(val1);
Serial.print("val2是:");
Serial.println(val2);
if(val1<val2){ //比较,一个亮一个灭,交替进行;遮住一个光敏电阻与其挨得近的灯亮
analogWrite(9,255);
analogWrite(10,0);
delay(500);
}
if(val1>val2){
analogWrite(9,0);
analogWrite(10,255);
delay(500);
}
四、光敏呼吸灯
电路跟上一个一样,知识点二、三结合,代码如下:
void setup(){
Serial.begin(9600);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
}
void loop(){
int i,j;
int val1 = analogRead(A0);
int val2 = analogRead(A1);
Serial.print("val1是:");
Serial.println(val1);
Serial.print("val2是:");
Serial.println(val2);
if(val1<val2){
for(i=0;i<=255;i+=5){
analogWrite(9,i);
analogWrite(10,255-i);
delay(20);
}
}
if(val1>val2){
for(j=0;j<=255;j+=5){
analogWrite(9,255-j);
analogWrite(10,j);
delay(20);
}
}
}