关于这篇文章,我主要也是一个新手,今天中午看到一篇很好的文章,对我入门有着很大的帮助,让我对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()处理程序中调用。
Comments NOTHING