Arduino学习笔记

程序运行结构

setup()

Arduino整体程序结构主要由 setup() 和loop()两个函数以及其他子函数构成。在Arduino中程序运行时将首先调用 setup() 函数。用于初始化变量设置针脚的输出\输入类型配置串口引入类库文件等等。每次 Arduino 上电或重启后,setup 函数只运行一次。
例如:

int buttonPin = 3;
 
void setup()
{
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
}
 
void loop()
{
  // ...
}

loop()

在 setup() 函数中初始化和定义了变量,然后执行 loop() 函数。顾名思义,该函数在程序运行过程中不断的循环,根据一些反馈,相应改变执行情况。通过该函数动态控制 Arduino 主控板。
示例如下:

int buttonPin = 3;
 
// setup 中初始化串口和按键针脚. 
void setup()
{
  beginSerial(9600);
  pinMode(buttonPin, INPUT);
}
 
// loop 中每次都检查按钮,如果按钮被按下,就发送信息到串口
 
void loop()
{
  if (digitalRead(buttonPin) == HIGH)
    serialWrite('H');
  else
    serialWrite('L');
 
  delay(1000);
}

函数部分

pinMode()

该函数主要用于配置指定引脚的输入输出,语法结构为pinMode(pin,mode),其中pin:要设置模式的引脚;mode:INPUT或OUTPUT,在Arduino中模拟输入脚也能当做数字脚使用,,使用示例如下:
ledPin = 13 // LED连接到数字脚13

void setup()
{
pinMode(ledPin,OUTPUT); //设置数字脚为输出
}
 
void loop()
{
digitalWrite(ledPin,HIGH); //点亮LED
  delay(1000);                  // 等待一秒
  digitalWrite(ledPin, LOW);    // 灭掉LED
延迟(1000); //等待第二个
}

digitalWrite()

该函数用于给一个数字引脚写入HIGH或者LOW。
如果一个引脚已经使用pinMode()配置为OUTPUT模式,其电压将被设置为相应的值,HIGH为5V(3.3V控制板上为3.3V),LOW为0V。如果引脚配置为INPUT模式,使用digitalWrite()写入HIGH值,将使内部20K上拉电阻(详见数字引脚教程)。写入LOW将会禁用上拉。上拉电阻可以点亮一个LED让其微微亮,如果LED工作,但是亮度很低,可能是因为这个原因引起的。补救的办法是 使用pinMode()函数设置为输出引脚。

注意:数字13号引脚难以作为数字输入使用,因为大部分的控制板上使用了一颗LED与一个电阻连接到他。如果启动了内部的20K上拉电阻,他的电压将在1.7V左右,而不是正常的5V,因为板载LED串联的电阻把他使他降了下来,这意味着他返回的值总是LOW。如果必须使用数字13号引脚的输入模式,需要使用外部上拉下拉电阻。

digitalWrite()语法规则:digitalWrite(pin, value) ,其中pin: 引脚编号(如1,5,10,A0,A3),value: HIGH or LOW ;

程序代码示例如下:

int ledPin = 13;                 // LED连接到数字13号端口
 
void setup()
{
  pinMode(ledPin, OUTPUT);      // 设置数字端口为输入模式
}
 
void loop()
{
  digitalWrite(ledPin, HIGH);   // 使LED亮
  delay(1000);                  // 延迟一秒
  digitalWrite(ledPin, LOW);    // 使LED灭
  delay(1000);                  // 延迟一秒
}

digitalRead()

该函数用于读取指定引脚的值,HIGH或LOW。语法规则:digitalRead(PIN) ,pin:你想读取的引脚号(int),数据读取之后,将返回HIGH 或 LOW 。程序示例如下:

ledPin = 13 // LED连接到13脚
int inPin = 7;   // 按钮连接到数字引脚7
int val = 0;  //定义变量存以储读值
 
void setup()
{
  pinMode(ledPin, OUTPUT);      // 将13脚设置为输出
  pinMode(inPin, INPUT);      // 将7脚设置为输入
}
 
void loop()
{
  val = digitalRead(inPin);   // 读取输入脚
  digitalWrite(ledPin, val);    //将LED值设置为按钮的值
}

模拟IO analogReference(type)

配置用于模拟输入的基准电压(即输入范围的最大值)。选项​​有:
DEFAULT:默认5V(Arduino板为5V)或3.3伏特(Arduino板为3.3V)为基准电压。
INTERNAL:在ATmega168和ATmega328上以1.1V为基准电压,以及在ATmega8上以2.56V为基准电压(Arduino
Mega无此选项) INTERNAL1V1:以1.1V为基准电压(此选项仅针对Arduino Mega)
INTERNAL2V56:以2.56V为基准电压(此选项仅针对Arduino Mega)
EXTERNAL:以AREF引脚(0至5V)的电压作为基准电压。

type:使用哪种参考类型(DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, 或者 EXTERNAL)。

注意事项

改变基准电压后,之前从anal​​ogRead()读取的数据可能不准确。 警告

不要在AREF引脚上使用使用任何小于0V或超过5V的外部电压。如果你使用AREF引脚上的电压作为基准电压,你在调用analogRead()前必须设置参考类型为EXTERNAL。否则,你将会削短有效的基准电压(内部产生)和AREF引脚,这可能会损坏您Arduino板上的单片机。

另外,您可以在外部基准电压和AREF引脚之间连接一个5K电阻,使你可以在外部和内部基准电压之间切换。请注意,总阻值将会发生改变,因为AREF引脚内部有一个32K电阻。这两个电阻都有分压作用。所以,例如,如果输入2.5V的电压,最终在在AREF引脚上的电压将为2.5

  • 32 /(32 + 5)= 2.2V。

analogRead()

从指定的模拟引脚读取数据值。 Arduino板包含一个6通道(Mini和Nano有8个通道,Mega有16个通道),10位模拟数字转换器。这意味着它将0至5伏特之间的输入电压映射到0至1023之间的整数值。这将产生读数之间的关系:5伏特/ 1024单位,或0.0049伏特(4.9 mV)每单位。输入范围和精度可以使用analogReference()改变。 它需要大约100微秒(0.0001)来读取模拟输入,所以最大的阅读速度是每秒10000次。
语法规则:analogRead(PIN) ,PIN:从输入引脚(大部分板子从0到5,Mini和Nano从0到7,Mega从0到15)读取数值,讲返回0~1023的整数值。

如果模拟输入引脚没有连入电路,由analogRead()返回的值将根据多项因素(例如其他模拟输入引脚,你的手靠近板子等)产生波动。

例子

int analogPin = 3;    //电位器(中间的引脚)连接到模拟输入引脚3
                      //另外两个引脚分别接地和+5 V
int val = 0;  //定义变量来存储读取的数值
 
void setup()
 
{
serial.begin(9600); //设置波特率(9600)
}
 
void loop()
{
val = analogRead(analogPin); //从输入引脚读取数值
serial.println(val); //显示读取的数值
}

analogWrite() - PWM

该函数用于从一个引脚输出模拟值(PWM)。可用于让LED以不同的亮度点亮或驱动电机以不同的速度旋转。analogWrite()输出结束后,该引脚将产生一个稳定的特殊占空比方波,直到下次调用analogWrite()(或在同一引脚调用digitalRead()或digitalWrite())。PWM信号的频率大约是490赫兹。
在大多数arduino板(ATmega168或ATmega328),只有引脚3,5,6,9,10和11可以实现该功能。在aduino Mega上,引脚2到13可以实现该功能。老的Arduino板(ATmega8)的只有引脚9、10、11可以使用analogWrite()。在使用analogWrite()前,你不需要调用pinMode()来设置引脚为输出引脚。

analogWrite函数与模拟引脚、analogRead函数没有直接关系。

语法:analogWrite(pin,value)
参数
pin:用于输入数值的引脚。
value:占空比:0(完全关闭)到255(完全打开)之间。

说明和已知问题

引脚5和6的PWM输出将高于预期的占空比(输出的数值偏高)。这是因为millis()和delay()功能,和PWM输出共享相同的内部定时器。这将导致大多时候处于低占空比状态(如:0 - 10),并可能导致在数值为0时,没有完全关闭引脚5和6。

例子

通过读取电位器的阻值控制LED的亮度

int ledPin = 9;  // LED连接到数字引脚9
int analogPin = 3;  //电位器连接到模拟引脚3
int val = 0;  //定义变量存以储读值
 
void setup()
 
{
pinMode(ledPin,OUTPUT);  //设置引脚为输出引脚
}
 
void loop()
{
val = analogRead(analogPin);  //从输入引脚读取数值
analogWrite(ledPin,val / 4);  // 以val / 4的数值点亮LED(因为analogRead读取的数值从0到1023,而analogWrite输出的数值从0到255)
}

通信-Serial

用于Arduino控制板和一台计算机或其他设备之间的通信。所有的Arduino控制板有至少一个串口(又称作为UART或USART)。它通过0(RX)和1(TX)数字引脚经过串口转换芯片连接计算机USB端口与计算机进行通信。因此,如果你使用这些功能的同时你不能使用引脚0和1作为输入或输出。

您可以使用Arduino IDE内置的串口监视器与Arduino板通信。点击工具栏上的串口监视器按钮,调用begin()函数(选择相同的波特率)。

Arduino Mega 有三个额外的串口:Serial 1使用19(RX)和18(TX),Serial 2使用17(RX)和16(TX),Serial3使用15(RX)和14(TX)。 若要使用这三个引脚与您的个人电脑通信,你需要一个额外的USB转串口适配器,因为这三个引脚没有连接到Mega上的USB转串口适配器。若要用它们来与外部的TTL串口设备进行通信,将TX引脚连接到您的设备的RX引脚,将RX引脚连接到您的设备的TX引脚,将GND连接到您的设备的GND。(不要直接将这些引脚直接连接到RS232串口;他们的工作电压在+/- 12V,可能会损坏您的Arduino控制板。)

Arduino Leonardo板使用Serial 1通过0(RX)和1(TX)与viaRS-232通信,。Serial预留给使用Mouse and Keyboard libarariies的USB CDC通信 。更多信息,请参考Leonardo 开始使用页和硬件页。
函数

if (Serial)
available()
begin()
end()
find()
findUntil()
flush()
parseFloat()
parseInt()
peek()
print()
println()
read()
readBytes()
readBytesUntil()
setTimeout()
write()
SerialEvent()

Examples

ReadASCIIString
ASCII Table
Dimmer
Graph
Physical Pixel
Virtual Color Mixer
Serial Call Response
Serial Call Response ASCII

中断attachInterrupt(interrupt, function, mode)

当发生外部中断时,调用一个指定函数。当中断发生时,该函数会取代正在执行的程序。大多数的Arduino板有两个外部中断:0(数字引脚2)和1(数字引脚3)。
arduino Mege有四个外部中断:数字2(引脚21),3(20针),4(引脚19),5(引脚18)。

语法:
interrupt:中断引脚数
function:中断发生时调用的函数,此函数必须不带参数和不返回任何值。该函数有时被称为中断服务程序。
mode:定义何时发生中断以下四个contstants预定有效值:
LOW 当引脚为低电平时,触发中断
CHANGE 当引脚电平发生改变时,触发中断
RISING 当引脚由低电平变为高电平时,触发中断
FALLING 当引脚由高电平变为低电平时,触发中断.

注意事项

当中断函数发生时,delay()和millis()的数值将不会继续变化。当中断发生时,串口收到的数据可能会丢失。你应该声明一个变量来在未发生中断时储存变量。

使用中断

在单片机自动化程序中当突发事件发生时,中断是非常有用的,它可以帮助解决时序问题。一个使用中断的任务可能会读一个旋转编码器,监视用户的输入。

如果你想以确保程序始终抓住一个旋转编码器的脉冲,从来不缺少一个脉冲,它将使写一个程序做任何事情都要非常棘手,因为该计划将需要不断轮询的传感器线编码器,为了赶上脉冲发生时。其他传感器也是如此,如试图读取一个声音传感器正试图赶上一按,或红外线槽传感器(照片灭弧室),试图抓住一个硬币下降。在所有这些情况下,使用一个中断可以释放的微控制器来完成其他一些工作。
程序示例

int pin = 13;
volatile int state = LOW;
 
void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}
 
void loop()
{
  digitalWrite(pin, state);
}
void blink()
{
  state = !state;
}

详情参考:[https://wiki.nxez.com/arduino:language]

  • 40
    点赞
  • 180
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古月长青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值