Arduino常用指令汇总+详解

数字GPIO

pinMode(pin,Mode);
//pin为数字引脚编号,Mode是输出状态
//一般有OUTPUT和INPUT和INPUT_PULLUP三种状态
//注意,INPUT_PULLUP相当于直接给这个叫接了一个上拉电阻(连VCC),所以此脚默认输出高电平

digitalWrite(pin,value);
//pin同上,value则是控制电平。HIGH高LOW低

Q: digitalWrite写入电平持续时间是一个循环的持续时间?
A: 是的,除非在一次循环中改变了它的值,否则将一直保持此值不变

digitalRead(pin);
//pin同上

Q: 返回值是常数且只有1和0?
A: 没错,就是HIGH和LOW

delay(time);
//time=1000时延迟1s
//更为精确的有microdelay()函数,里面time的单位为us

串口通信

普通串口通信可以使用计算机串口监视器检测到。软串口通信可以在arduino主控间通信

Serial.begin(9600);
//串口通信初始化,参数代表波特率

Serial.println(str);
//print并换行
//注意和Serial.write()的区别

Serial.begin(speed,config);
//初始化串口高级用法,其实没什么用,speed代表波特率
//如config=SERIAL_8E2,语句设置数据位为8,偶校验,停止位为2

Serial.end();
//停止串口通信

Q: 不论str是什么类型变量,println或print函数都会以字符形态输出其原样?
A: 没错,它读到的是什么,就会以什么形式原样输出,但是格式是字符格式。例如读取78,78为int,它将输出字符78,而不是78对应的ASCII码

Serial.print(val);
//print不换行,其余和上面一样

Serial.print(val,format);
//format分两种情况,见下图

在这里插入图片描述
在这里插入图片描述

Serial.read();
//返回值为串口读取输入的信息,此信息是从SRAM中取出1B的信息量
//如果程序继续运行,是否执行到此函数的一刹那才能使输入正确,否则输入失败?
//输入失败的字符将直接丢失,还是等待下一次循环读取?

Q: 每次只能取出一个字符?
A: 每次在SRAM中取出1B大小的内容,就是一个字符的大小。

Q: 能否直接存入一整个int,不加以任何处理?

Q: 当它读取时,程序将暂停等待读取,还是继续运行?
A: 程序不会暂停读取,此函数是一个无脑读取函数,只要执行到就会取出一个1B大小的空间。如果没有了,就会返回-1,而-1在char中是乱码

Serial.available();
//返回值为数字,单位为B?还是一个字符?

此函数问题可见如下代码

int count=0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void output(){
  while(count){
    Serial.println(Serial.read());  //注意read函数读取字符时,读取到的是ASCII码!
    count--;  
    delay(1000);
  }

   while(Serial.available()>0){
     char t=Serial.read(); 
   }
}

void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available()>0&&!count){
    Serial.println(Serial.available());  
    count=Serial.available()-1;  //输入五个字母显示占用6位,因为算上\n字符
    Serial.print("count is:  ");
    Serial.println(count);
  }
  if(count){
    output();  
  }
  delay(1000);
}

在这里插入图片描述
第一个输出的6,就是available()函数的返回值,显然它是输出字符的个数。
available()函数显示的值包含字符串的\n

Serial.find(target);
//target是指需要找到的字符
//注意,在寻找过程中会取走拦在目标字符前面的所有字符!
//示例程序如下
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  //pinMode(A0,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available()){
    if(Serial.find('a')){
      Serial.println("we have got a");
      while(Serial.available()){
        char t=Serial.read();
        Serial.print(t);  
      }
      Serial.println();
    }  
  }
  
  delay(1000);
}

上述程序是一个查找字符a的程序,如果找到a就会输出we have got a并且输出所有剩余字符串
当我们输入goodabced时
在这里插入图片描述

Serial.flush();
//Arduino 1.0版本之前用作清空缓冲区,其实就是等待缓冲区数据发送完成

parseFloat();
//返回缓冲区的第一个float型数据
//和find一样都会一路上读取掉无关数据
//示例程序如下 parseInt()的功能一样,不做赘述

注意,parseFloat函数自己就会消耗掉一个float,所以不可以用两次,用两次它就会在下一个函数parseFloat()中寻找新的float。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  //pinMode(A0,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  //bool flag=false;
  if(Serial.available()){
    float num=Serial.parseFloat();
    if(num){
      Serial.println(num);  
    }
    else{Serial.println("No such Number!");}
  }
  
  delay(1000);
}

当你输入 .33 时,会默认当成0.33
在这里插入图片描述
但是它还显示了一个no such number
这是因为第一次进入available()判断并输出时,虽然成功输出了0.33并退出判断,但是缓冲区中其实还有一个\n字符没有被读出来。因此available()依然>0,所以会再次进入判断读取。
另外,float仅支持两位小数,所以当你输入1.23.45时,他会首先读取1.23,然后读取0.45,\n就被第三个parseFloat()舍弃了,输出no such number
在这里插入图片描述

Serial.peek();
//从缓冲区头部读取一字节的数据,但是不会取走,和read()有本质区别!

Serial.readBytes(buffer,length);
//buffer一般是一个储存数据的数组,如char[]或byte[]
//length是指需要读取的长度
//如没有读到满足条件的数据,则返回0

Serial.readBytesUntil(character,buffer,length);
//character是停止符,如果读到超过length长度或者停止符,就会终止读取

Serial.setTimeout(time);
//time单位毫秒,用于设置上面两个函数等待串口数据读取的时间

serialEvent();
//串口事件函数,定义在loop()外部,当检测到串口缓冲区有数据时就会自行启动
//本质上是省去available()判断,示例代码如下

此函数没有形参表,返回值为void,相当于代替了available函数,仔细观察的话,你会发现本程序和上方parseFloat函数的程序是一模一样的

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  //pinMode(A0,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
}

void serialEvent(){
  float num=Serial.parseFloat();
    if(num){
      Serial.println(num);  
    }
    else{Serial.println("No such Number!");}  
}

模拟GPIO

analogRead(pin);
//读取pin引脚的电平值,且pin必须是模拟引脚
//可以将0~5V电压转化位0~1023的整数形式表示
//返回值相当于把5V电位由低到高做1024个细分

analogWrite(pin,value);
//pin同上,value范围在0~255
//value相当于把5V电位由低到高做255个细分

但是我们需要注意一些细节
A开头引脚只做模拟输入,而不做模拟输出。当你对下面程序的A0脚配置analogWrite()函数并进行读取时,你只能获得0或者1023两种值。
analogRead()读取只能用在PWM脚上,比如9脚

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  //pinMode(A0,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  analogWrite(A0,200);
  Serial.println(analogRead(A0));
  delay(1000);
}

时间函数

millis();
//返回系统运行时间的函数,单位ms

micros();
//同上,单位us

外部中断

attachInterrupt(interrupt,function,mode);
//interrupt为中断编号,有0和1两种。在UNO中,0代表2脚,1代表3脚
//function为函数名(不带形参表!)
//mode有四种状态,见下图

detachInterrupt(interrupt);
//禁用中断编号对应引脚的外部中断

在这里插入图片描述

其它函数

tone(pin,frequency,duration);
//指定pin引脚产生占空比为50%的频率为frequency的方波
//duration(单位ms)可以不填,不填声音就会持续到noTone()函数被执行

noTone(pin);
//指定停止pin引脚上的方波输出
//一般和tone配合,暂不知能不能停止analogWrite产生的波

pulseIn(pin,value,timeout);
//此函数用于测量pin引脚在value状态下的持续时间
//pin同上,value指定检测引脚值
//timeout单位为ms,为unsigned long型,超过此时间则退出函数并返回0
  • 14
    点赞
  • 121
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值