Arduino语法快速入门

发布于 2022-05-05  299 次阅读


关于这篇文章,我主要也是一个新手,今天中午看到一篇很好的文章,对我入门有着很大的帮助,让我对Arduino开发有了一定的认识,花了两个小时消化了一遍,已经迫不及待的想去练练手了,所以决定把他转载过来,也方便我日后作为参考。
原文章地址:https://blog.csdn.net/as480133937/article/details/105322822

Arduino结构

Arduino软件结构包括两个主要函数:

Setup()函数 初始化变量,管脚模式,调用库函数等

Loop()函数 连续循环执行loop函数内的程序bash

void setup()
{
  // 在这里加入你的setup代码,它只会运行一次:
}
 
void loop() 
{
  // 在这里加入你的loop代码,它会不断重复运行:
}

在程序开始时使用,Arduino控制器通电或复位后,,程序启动时会调用 **setup()**函数。使用它来初始化变量,引脚模式,启用库等。setup函数只能在Arduino板的每次上电或复位后运行一次。

在setup()函数之后,即初始化之后,loop() 让你的程序循环地被执行。使用它来运转Arduino。连续执行函数内的语句,这部份的程式会一直重复的被执行,直到Arduino 板子被关闭。

Arduino I/O函数

数字 I/O

pinMode()函数

bash

pinMode(pin,mode);  //定义引脚的模式

数字IO口输入输出模式定义函数,将接口定义为输入或输出接口
pinMode()函数用于将特定引脚配置为输入或输出。可以使用INPUT_PULLUP模式启用内部上拉电阻。此外,INPUT模式显式禁止内部上拉。

pin - 你希望设置模式的引脚的编号 0~13

mode - INPUT(输入模式),OUTPUT(输出模式)或INPUT_PULLUP(内部上拉输入)。
范例:bash

 pinMode(7,INPUT); // 将脚位 7 设定为输入模式
 pinMode(1,INPUT);//将脚位1设定为输入模式
 pinMode(2,INPUT);//将脚位2设定为输入模式
 pinMode(3,INPUT);//将脚位3设定为输入模式
引脚配置为INPUT

Arduino引脚默认配置为输入 ,输入模式下,由外部器件向Arduino对于引脚输入电平,和数据,Arduino识别电平及数据,进行相应的处理。

引脚配置为OUTPUT

引脚配置为输出模式,Arduino引脚向其他电路提供大量的电流。Arduino引脚可以向其他器件/电路提供(提供正电流)或吸收(提供负电流)高达40mA(毫安)的电流。这是足以点亮LED或者运行许多传感器的电流(不要忘记串联电阻),但不足以运行继电器,螺线管或电机。

上拉电阻

上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用,增强输出引脚的驱动能力,提高芯片输入信号的噪声容限,增强抗干扰能力。

也就是默认状态下io为高电平 ,下拉电阻与此同理。

digitalWrite()函数

bash

digitalWrite(pin,value);  //定义引脚的电平

pin:你希望设置模式的引脚的编号 0~13
value :表示为HIGH(高电平)或LOW(低电平)
HIGH为5V(或3.3V在3.3V板上),LOW为0V(接地)

数字IO口输出电平定义函数,将数字接口值至高或低、开或关,即digitalWrite(接口名称, HIGH或LOW)。但脚位必须先透过pinMode明示为输入或输出模式digitalWrite才能生效。比如定义HIGH可以驱动LED。

范例:bash

digitalWrite(8,HIGH); //将脚位 8设定输出高电位

digitalRead函数

引脚电平读取函数bash

int digitalRead(pin)

数字IO口读输入电平函数,读出数字接口的值 比如可以读数字传感器。当感测到脚位处于高电位时时回传HIGH,否则回传LOW。

范例:bash

val = digitalRead(7); // 读出脚位 7 的值并指定给 val

模拟 I/O

analogRead()函数

bash

 int analogRead(pin)

pin 要读取的模拟输入引脚的编号(Arduino Diecimila为0~5,Arduino nano为0~7 Mega上为0至15)

模拟IO口读函数,从指定的模拟接口读取值,Arduino对该模拟值进行10-bit的数字转换。 此函数返回0到1023之间的数字,表示0到5伏特之间的电压。例如,如果施加到编号0的引脚的电压为2.5V,则analogRead(0)返回512。

通过使用**analogRead()**函数,我们可以读取施加到其中一个引脚的电压。比如可以读模拟传感器(10位AD,0~5V表示为0~1023)。

范例:bash

val = analogRead(2); //读出类比脚位 2 的值并赋值给 val

analogWrite函数

bash

analogWrite(pin, value);

数字IO口PWM输出函数,给一个接口写入模拟值(PWM波)改变PWM脚位的输出电压值可用于电机PWM调速或音乐播放。

pin:对于 ATmega168芯片的Arduino(包括Mini或BT),该函数可以工作于 3, 5, 6, 9, 10和 11号接口

value表示为0~255

例如:输出电压2.5伏特(V),该值大约是128。

范例 :bash

 analogWrite(9,128); // 输出电压约2.5伏特(V);

扩展 I/O

shiftOut函数

bash

shiftOut(dataPin, clockPin, bitOrder, value)

SPI外部IO扩展函数,通常使用带SPI接口的74HC595做8个IO扩展,把资料传给用来延伸数位输出的暂存器,此函式通常使用在延伸数位的输出。函式使用一个脚位表示资料、一个脚位表示时脉。dataPin为数据口,clockPin为时钟口,bitOrder用来表示位元间移动的方式,为数据传输方向(MSBFIRST高位在前,LSBFIRST低位在前),value会以byte形式输出,表示所要传送的数据(0~255),另外还需要一个IO口做74HC595的使能控制。

范例 :bash

shiftOut(dataPin, clockPin, LSBFIRST, 255);

pulseIn()函数

bash

unsigned long pulseIn(pin, value);

脉冲长度记录函数,设定读取脚位状态的持续时间,返回时间参数(us),例如使用红外线、加速度感测器测得某一项数值时,在时间单位内不会改变状态。pin表示为0~13,value为HIGH或LOW。比如value为HIGH,那么当pin输入为高电平时,开始计时,当pin输入为低电平时,停止计时,然后返回该时间。

范例:bash

time = pulsein(7,HIGH); // 设定脚位7的状态在时间单位内保持为HIGH

Arduino 时间函数

delay(ms) 延时函数

delay(ms) 延时函数bash

delay (ms) ;

delay(ms) 延时函数(单位ms),延时一段时间,暂停晶片执行多少毫秒。

delay(1000)为一秒。

范例:bash

//LED闪烁实验
void loop() {
   digitalWrite(ledPin, HIGH); // 打开LED灯
   delay(1000); // 延时1秒钟
   digitalWrite(ledPin, LOW); // 关闭LED灯
   delay(1000); // 延时1秒钟
}

delayMicroseconds()函数

bash

delayMicroseconds (us) ;

us 是要暂停的微秒数(无符号整型)。
延时函数(单位us)暂停晶片执行多少微秒

delayMicroseconds()函数接受单个整数(或数字)参数。此数字表示时间,以微秒为单位。一毫秒内有一千微秒,一秒内有一百万微秒

目前,可以产生精确延迟的最大值是16383

范例:bash

delayMicroseconds(1000); //暂停1豪秒

millis()函数

bash

unsigned long millis()

返回时间函数(单位ms), 回传晶片开始执行到目前的毫秒,此函数用于返回Arduino板开始运行当前程序时的毫秒数,该参数溢出大概需要50天时间。

范例:bash

void loop() { 
   Serial.print("Time:");  //延时1S计算运行时间
   time = millis();  
   delay(1000); 
}

micros()函数

bash

micros () ;

micros()函数返回Arduino板开始运行当前程序时的微秒数。该数字在大约70分钟后溢出,即回到零。在16 MHz Arduino板(例如Duemilanove和Nano)上,此函数的分辨率为4微秒(即返回值总是4的倍数)。在8 MHz Arduino板(例如LilyPad)上,此函数的分辨率为8微秒。

范例:bash

void loop() { 
   Serial.print("Time:");  //延时1S计算运行时间
   time = micros();  
   delay(1000); 
}

Arduino数学函数

Arduino数学库(math.h)包含了许多用于操作浮点数的有用的数学函数。

min(x, y)

求最小值 ,回传两数之间较小者

范例:bash

val = min(10,20); // val=10

max(x, y)

求最大值 ,回传两数之间较大者

范例:bash

val = max(10,20); // val=20

abs(x)

计算绝对值 ,回传该数的绝对值

范例:bash

val = abs(-5); // val=5

constrain(x, a, b)

约束函数,下限a,上限b,判断x变数位于a与b之间的状态。

x若小于a回传a;

介于a与b之间回传x本身;

大于b回传b

范例:bash

val = constrain(i, 0, 255); // 将i的值赋值给val 并且i的取值为0~255

map(value, fromLow, fromHigh, toLow, toHigh)

约束函数,value必须在fromLow与toLow之间和fromHigh与toHigh之间。将value变数依照fromLow与fromHigh范围,对等转换至toLow与toHigh范围。时常使用于读取类比讯号,转换至程式所需要的范围值。

范例:bash

val = map(analogRead(0),0,1023,100, 200); // 将analog0 所读取到的讯号0~1023对等转换至100,200之间的数值。

pow(base, exponent)

开方函数,base的exponent次方。回传一个数(base)的指数(exponent)值。

范例:bash

double x = pow(y, 32); // 设定x为y的32次方

sq(x) 平方

平方函数,返回x的平方值

范例:bash

val=sq(2);  //val等于2的平方

sqrt(x) 开根号

回传double型态的取平方根值。
范例:bash

double val = sqrt(1138); // 回传1138平方根的近似值 33.73425674438

double log (double __x)

log()函数返回参数x的自然对数。
范例:bash

double val = log(2);

double round (double __x)

round()函数将x四舍五入到最近的整数,但中间情况不舍入到0(不是到最近的偶数整数)。不可能会溢出。

范例:bash

double val = round(5.6); //val=6

Arduino三角函数

Arduino提供了传统的三角函数(sin,cos,tan,asin,acos,atan)

bash

double sin(double x); //返回x弧度的正弦
double cos(double y); //返回y弧度的余弦
double tan(double x); //返回x弧度的正切
double acos(double x); //返回A,对应于cos(A)=x的角度
double asin(double x); //返回A,与sin(A)=x相对应的角度
double atan(double x); //返回A,与tan(A)=x相对应的角度

范例:bash

double sine = sin(2); // 近似值 0.90929737091
double cosine = cos(2); //近似值-0.41614685058
double tangent = tan(2); //近似值-2.18503975868

Arduino 随机数函数

randomSeed()函数

randomSeed(seed)

随机数端口定义函数,seed表示读模拟口analogRead(pin)函数

randomSeed(seed)函数重置Arduino的伪随机数生成器

虽然random()返回的数字的分布本质上是随机的,但是顺序是可预测的。所以如果需要一个真正的乱数,可以呼叫此函式重新设定产生乱数种子。你可以使用乱数当作乱数的种子,以确保数字以随机的方式出现,通常会使用类比输入当作乱数种子,藉此可以产生与环境有关的乱数(例如:无线电波、宇宙雷射线、电话和萤光灯发出的电磁波等)。
范例:bash

randomSeed(analogRead(5)); //使用来自模拟管脚5的噪声随机化

random()函数

long random(min, max)

随机数函数,返回数据大于等于min,小于max。

long random(max)

返回数据大于等于0,小于max。

范例:bash

long randnum = random(11); // 回传 0 -10之间的数字
long randnum = random(0, 100); // 回传0 – 99 之间的数字

Arduino外部中断函数

中断:**

中断(interrupt)停止Arduino的当前工作,以便可以完成一些其他工作。

什么是中断

CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);
CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。

通俗点说:你正在家里做家务,突然有人来找你,打断了你的进程,在你们交谈完之后,你就又回去继续进行你的家务活,这其中被打断的过程,就叫做中断,而在中断结束之后,你则会继续进行本来应该做的事情

中断是一种使CPU中止正在执行的程序而转去处理特殊事件的操作,这些引起中断的事件称为中断源,它们可能是来自外设的输入输出请求,也可能是计算机的一些异常事故或其它内部原因。

中断可以来自各种来源。在这种情况下,我们使用的是由数字引脚上的状态改变触发的硬件中断

大多数Arduino设计有两个硬件中断(称为“interrupt0”和“interrupt1”)分别硬连接到数字I/O引脚2和3。

Arduino Mega有六个硬件中断,包括引脚21,20,19和18上的附加中断(“interrupt2”到“interrupt5”)。

你可以定义该程序并指定上升沿,下降沿或两者的条件。在这些特定条件下,将处理中断。

中断类型

硬件中断 - 它们响应外部事件而发生,例如外部中断引脚变为高电平或低电平。

软件中断 - 它们响应于在软件中发送的指令而发生。“Arduino语言”支持的唯一类型的中断是attachInterrupt()函数。

attachInterrupt()函数

attachInterrupt(interrupt,function,mode)

interrupt:中断源(在Arduino中,中断源可选值为0或1,一般分别对应2号和3号引脚)

function:需要中断的函数名bash

mode:
LOW(低电平触发)
CHANGE(在引脚电平变化时触发)
RISING(低电平变为高电平触发)
FALLING(高电平变为低电平触发)

外部中断只能用到数字IO口2和3,interrupt表示中断口初始0或1,表示一个功能函数,mode:LOW低电平中断,CHANGE有变化就中断,RISING上升沿中断,FALLING 下降沿中断。

detachInterrupt()函数

detachInterrupt(interrupt)

中断开关函数,interrupt=1 开,interrupt=0 关。

范例:bash

detachInterrupt(1)//打开中断

中断使能函数

interrupts()// 使能中断

noInterrupts() //禁止中断

Arduino串口收发函数

Arduino Uno R3开发板上,硬件串口位于Rx(0)和Tx(1)引脚上,Arduino的USB口通过转换芯片与这两个引脚连接。该转换芯片会通过USB接口在PC机上虚拟出一个用于Arduino通讯的串口,我们下载程序也是通过串口进行的。

Serial.begin(speed)

串口定义波特率函数,设置串行每秒传输数据的速率(波特率),可以指定Arduino从电脑交换讯息的速率,通常置于setup()函数中。

原型:

Serial.begin(speed)

Serial.begin(speed, config)
参数:
speed:波特率,一般取值9600,115200等。在同计算机通讯时,使用下面这些值:300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600或 115200 bps(每秒位元组)

config:设置数据位、校验位和停止位。默认SERIAL_8N1表示8个数据位,无校验位,1个停止位。

返回值:无。
范例:bash

Serial.begin(9600)

Serial.end()

描述:禁止串口传输。此时串口Rx和Tx可以作为数字IO引脚使用。

原型:Serial.end()

参数:无。

返回值:无。

Serial.print()

描述:串口输出数据,写入字符数据到串口。

原型:

Serial.print(val)

Serial.print(val, format)

参数:

val:打印的值,任意数据类型。

config:输出的数据格式。BIN(二进制)、OCT(八进制)、DEC(十进制)、HEX(十六进制)。对于浮点数,此参数指定要使用的小数位数。

范例:bash

Serial.print(75); // 列印出 “75”
Serial.print(75, DEC); //列印出 “75”
Serial.print(75, HEX); // “4B” (75 的十六进位)
Serial.print(75, OCT); // “113” (75 in的八进位)
Serial.print(75, BIN); // “1001011” (75的二进位)
Serial.print(75, BYTE); // “K” (以byte进行传送,显示以ASCII编码方式)
Serial.print(1.23456, 0) 得到 “1”
Serial.print(1.23456, 2) 得到 “1.23”
Serial.print(1.23456, 4) 得到 “1.2346”
Serial.print(‘N’) 得到 “N”
Serial.print(“Hello world.”) 得到 “Hello world.”
返回值:返回写入的字节数。

Serial.println()

描述:串口输出数据并换行。

原型:

Serial.println(val)

Serial.println(val, format)

参数:

val:打印的值,任意数据类型。

config:输出的数据格式。

返回值:返回写入的字节数。

Serial.available()

描述:判断串口缓冲区的状态,返回从串口缓冲区读取的字节数。

原型:Serial.available()

参数:无。

返回值:可读取的字节数, 如果回传值是0代表所有序列埠上资料都已经被read()函式读取。
范例:bash

int count = Serial.available();

Serial.read()

描述:读取串口数据,一次读一个字符,读完后删除已读数据。

原型:Serial.read()

参数:无。

返回值:返回串口缓存中第一个可读字节,当没有可读数据时返回-1,整数类型。
范例:bash

int data = Serial.read();

Serial.readBytes()

描述:从串口读取指定长度的字符到缓存数组。

原型:Serial.readBytes(buffer, length)

参数:

buffer:缓存变量。

length:设定的读取长度。

返回值:返回存入缓存的字符数。

Serial.flush()

描述:清空缓冲器。 有时候因为资料速度太快,超过程式处理资料的速度,你可以使用此函式清除缓冲区内的资料。经过此函式可以确保缓冲区(buffer)内的资料都是最新的。

原型:Serial.flush();

参数: 无

返回值: 无
范例:bash

Serial.flush();

Arduino语言库文件

官方库文件

· EEPROM - EEPROM读写程序库

· Ethernet - 以太网控制器程序库

· LiquidCrystal - LCD控制程序库

· Servo - 舵机控制程序库

· SoftwareSerial - 任何数字IO口模拟串口程序库

· Stepper - 步进电机控制程序库

· Wire - TWI/I2C总线程序库

· Matrix - LED矩阵控制程序库

· Sprite - LED矩阵图象处理控制程序库

Arduino 内部集成电路I2C

内部集成电路(I2C)是用于微控制器和新一代专用集成电路之间的串行数据交换系统。当它们之间的距离很短(接收器和发射器通常在同一个印刷电路板上)时使用。通过两根导线建立连接。一个用于数据传输,另一个用于同步(时钟信号)。

Arduino板的I2C引脚

I2C总线由两个信号组成 - SCL和SDA。SCL是时钟信号,SDA是数据信号。当前总线主机总是产生时钟信号。一些从设备可能迫使时钟低电平以延迟主设备发送更多数据(或者在主设备尝试将数据写出之前请求更多的时间来准备数据)。这被称为“时钟伸展”。

以下是不同Arduino板的引脚:

Uno, Pro Mini A4 (SDA), A5 (SCL)

Mega, Due 20 (SDA), 21 (SCL)

Leonardo, Yun 2 (SDA), 3 (SCL)

Arduino I2C

我们有两种模式 - 主代码和从代码 - 使用I2C连接两个Arduino板。它们是:

Master Transmitter / Slave Receiver 主发射器/从接收器

Master Receiver / Slave Transmitter 主接收器/从发射器

主发射器/从接收器

让我们现在看看什么是主发送器和从接收器。

主发射器

以下函数用于初始化Wire库,并将I2C总线作为主器件或从器件加入。这通常只被调用一次。

Wire.begin(地址) - 在我们的例子中,地址是7位从地址,因为未指定主机,它将作为主机加入总线。

Wire.beginTransmission(地址) - 开始向给定地址的I2C从设备发送数据。

Wire.write(值) - 用于从主设备传输到从设备的队列字节(在beginTransmission()和endTransmission()之间的调用)。

Wire.endTransmission() - 结束由beginTransmission()开始的对从设备的传输,并传输由wire.write()排队的字节。

从接收器

使用以下函数:

Wire.begin(地址) - 地址是7位从地址。

Wire.onReceive(收到的数据处理程序) - 当从设备从主设备接收数据时调用的函数。

Wire.available() - 返回Wire.read()可用于检索的字节数,应在Wire.onReceive()处理程序中调用。

  • alipay_img
  • wechat_img
想法不去做终究就只是想法
最后更新于 2022-05-05