您当前的位置: 首页 >  ar

风间琉璃•

暂无认证

  • 1浏览

    0关注

    337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Arduino库基础函数

风间琉璃• 发布时间:2021-11-21 16:33:07 ,浏览量:1

文章目录
  • 前言
  • 一、程序结构
    • 1.setup()
    • 2.loop()
  • 二、常量宏定义
  • 三、数字 I/O
    • 1.pinMode()
    • 2.digitalWrite()
    • 3.digitalRead()
  • 四、模拟 I/O
    • 1.analogRead()
    • 2.analogReference()
    • 3.analogWrite()
  • 五、高级 I/O
    • 1.shiftOut()
    • 2.pulseIn()
  • 六、时间函数
    • 1.millis()
    • 2.delay()
    • 3.delayMicroseconds()
  • 七、中断函数
    • 1.attachInterrupt()
    • 2.detachInterrupt()
    • 3.interrupts()
    • 4.noInterrupts()
  • 八、串口通讯
    • 1.begin()
    • 2.available()
    • 3.read()
    • 4.flush()
    • 5.print()
    • 6.println()
    • 7.write()
    • 8.peak()
    • 9.serialEvent()
  • 总结

提示:以下是本篇文章正文内容

一、程序结构

在 Arduino 中, 标准的程序入口 main 函数在内部被定义, 用户只需要关心以下两个函数: loop() 和setup()

1.setup()

当 Arduino 板起动时 setup()函数会被调用。用它来初始化变量,引脚模式,开始使用某个库。该函数在 Arduino 板的每次上电和复位时只运行一次

2.loop()

在创建 setup 函数,该函数初始化和设置初始值, loop()函数所做的事,连续循环,允许你的程序改变状态和响应事件。可以用它来实时控制 arduino 板

二、常量宏定义

#define HIGH 0x1 高电平 #define LOW 0x0 低电平 #define INPUT 0x0 输入 #define OUTPUT 0x1 输出 #define true 0x1 真 #define false 0x0 假 #define PI 3.14159265 PI. #define HALF_PI 1.57079 二分之一 PI #define TWO_PI 6.283185 二倍 PI #define DEG_TO_RAD 0.01745329 弧度转角度 #define RAD_TO_DEG 57.2957786 角度转弧度

三、数字 I/O 1.pinMode()

void pinMode (uint8_t pin, uint8_t mode) 设置引脚模式,配置引脚为输出或输出模式

pin:引脚编号 mode: INPUT, OUTPUT, 或 INPUT_PULLUP

点亮LED,连接到13引脚

int ledPin = 13; // LED connected to digital pin 13
void setup()
{
	pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop()
{
	digitalWrite(ledPin, HIGH); // sets the LED on
	delay(1000); // waits for a second
	digitalWrite(ledPin, LOW); // sets the LED off
	delay(1000); // waits for a second
}

注:模拟引脚也可以当作数字引脚使用, 编号为 14(对应模拟引脚 0)到 19(对应模拟引脚 5)

2.digitalWrite()

void digitalWrite (uint8_t pin, uint8_t value) 设置引脚的高低电平, 在写引脚之前, 需要将引脚设置为 OUTPUT模式 value :HIGH 或 LOW

3.digitalRead()

int digitalRead (uint8_t pin) 读取引脚的高低电平,在读引脚之前, 需要将引脚设置为INPUT模式

注:如果引脚没有链接到任何地方, 那么将随机返回 HIGH 或 LOW

通过7号引脚的高低电平控制LED的亮灭

int ledPin = 13; // LED connected to digital pin 13
int inPin = 7; // pushbutton connected to digital pin 7
int val = 0; // variable to store the read value
void setup()
{
	pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output
	pinMode(inPin, INPUT); // sets the digital pin 7 as input
}
void loop()
{
	val = digitalRead(inPin); // read the input pin
	digitalWrite(ledPin, val); // sets the LED to the button's value
}
四、模拟 I/O 1.analogRead()

int analogRead (uint8_t pin) 读模拟引脚, 返回[0-1023]之间的值. 每读一次需要花 1 微妙的时间

2.analogReference()

void analogReference (uint8_t type) 配置模式引脚的参考电压,可通过 AREF 引脚获取参考电压

函数 analogRead 在读取模拟值之后, 将根据参考电压将 模拟值转换到[0,1023]区间

type: 参考类型(DEFAULT/INTERNAL/EXTERNAL) DEFAULT : 默认 5V INTERNAL: 低功耗模式 ATmega168:1.1V ATmega8 :2.56V EXTERNAL: 扩展模式

3.analogWrite()

void analogWrite (uint8_t pin, int value) 设置模拟引脚的值 value 0 到 255 之间的值, 0 对应 off, 255 对应 on

用模拟中(PWM)写一个呼吸灯

int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value
void setup()
{
	pinMode(ledPin, OUTPUT); // sets the pin as output
}
void loop()
{
	val = analogRead(analogPin); // read the input pin
	analogWrite(ledPin, val / 4);
}
五、高级 I/O 1.shiftOut()

void shiftOut (uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte val) 位移输出函数

输入 value 数据后 Arduino 会自动把数据移动分配到 8 个并行输出端. 其中dataPin 为连接 DS 的引脚号, clockPin 为连接 SH_CP 的引脚号, bitOrder 为设置数据位移顺序, 分别为高位先入MSBFIRST或者低位先入LSBFIRST

dataPin :数据引脚 clockPin: 时钟引脚 bitOrder :移位顺序 ( MSBFIRST 或 LSBFIRST) val :数据

shiftOut函数主要作用于74HC595 通过十进制数字 0~255 对于与8位二进制的数,从而来控制各个引脚的高低电平,一次性向位移寄存器写入一个字节,若没有这个函数我们需要把一个字节8位拆开,一位一位的配置

一般到0-255 ,大于分两次

MSBFIRST serial

int data = 500;
// shift out highbyte 高8位
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));
// shift out lowbyte 低9位
shiftOut(dataPin, clock, MSBFIRST, data);
2.pulseIn()

unsigned long pulseIn (uint8_t pin, uint8_t state, unsigned long timeout) 读取高低电平持续的时间 state :脉冲状态 timeout :超时时间

读引脚的脉冲, 脉冲可以是 HIGH 或 LOW. 如果是 HIGH, 函数将先等引脚变为高电平, 然后开始计时, 一直到变为低电平为止. 返回脉冲持续的时间长短,单位为毫秒. 如果超时还没有读到的话, 将返回 0

六、时间函数 1.millis()

unsigned long millis (void) 获取机器运行的时间长度, 单位毫秒

注:系统最长的记录时间为 9 小时 22 分, 如果超出时间将从 0 开始; 时间为 unsigned long 类型, 如果用 int 保存时间将得到错误结果

2.delay()

void delay (unsigned long ms) 毫秒延时

3.delayMicroseconds()

void delayMicroseconds (unsigned int us) 微妙延时函数

七、中断函数 1.attachInterrupt()

void attachInterrupt (uint8_t interruptNum, void(*)(void)userFunc, int mode) 为中断发生时指定特定名称的中断服务程序. 外部中断有 0 和 1 两种, 一般对应 2 号和 3 号数字引脚

interrupt :中断类型, 0 或 1 fun :中断服务函数 mode :触发方式 ▪ LOW 低电平触发中断 ▪ CHANGE 变化时触发中断 ▪ RISING 低电平变为高电平触发中断 ▪ FALLING 高电平变为低电平触发中断

注: 1.在中断函数中 delay 函数不能使用, millis 始终返回进入中断前的值. 读串口数据的话, 可能会丢失

2.中断函数中使用的变量需要定义为 volatile 类型

通过外部引脚触发中断函数, 然后控制 LED 的闪烁

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;
}
2.detachInterrupt()

void detachInterrupt (uint8_t interruptNum) 取消指定类型的中断

3.interrupts()

#define interrupts() sei() 开中断

4.noInterrupts()

#define noInterrupts() cli() 关中断

这两个作用保护临界区代码和操作系统的临界区保护一样的原理

void setup() {}
void loop()
{
	noInterrupts();
	// critical, time-sensitive code here
	interrupts();
	// other code here
}
八、串口通讯 1.begin()

void HardwareSerial::begin (long speed) 打开串口 speed 波特率

2.available()

Serial.available() 获取串口上可读取的数据的字节数

该数据是指已经到达并存储在接收缓存(共有 64 字节)中。 available()继承自 Stream 实用类

两个串口通信

void setup() 
{
	Serial.begin(9600);
	Serial1.begin(9600);
}
void loop() 
{
	// read from port 0, send to port 1:
	if (Serial.available()) 
	{
		int inByte = Serial.read();
	Serial1.print(inByte, BYTE);
	}
	// read from port 1, send to port 0:
	if (Serial1.available()) 
	{
		int inByte = Serial1.read();
		Serial.print(inByte, BYTE);
	}
}
3.read()

Serial.read() 读串口数据, read()继承自 Stream 实用类

注:串口上第一个可读取的字节,如果没有可读取的数据则返回-1

4.flush()

刷新串口数据

5.print()

Serial.print(val, format) val: 要发送的数据 format:可选,相当于格式化数据 返回的是发送的字节数

往串口发数据,无换行

注:浮点数默认发送两位小数

可选的第二个参数用于指定数据的格式

Serial.print(78, BIN) gives "1001110"
Serial.print(78, OCT) gives "116"
Serial.print(78, DEC) gives "78"
Serial.print(78, HEX) gives "4E"
Serial.println(1.23456, 0) gives "1"
Serial.println(1.23456, 2) gives "1.23"
Serial.println(1.23456, 4) gives "1.2346"

用 F()把待发送的字符串包装到 flash 存储器

Serial.print(F(“Hello World” ))

要发送单个字节数据,使用 Serial.write()

6.println()

往串口发数据,类似 Serial.print(),但有换行

7.write()

Serial.write(buf, len) buf: 发送的数据 len:发送数据长度 返回值发送数据的长度

写二进制数据到串口,数据是一个字节一个字节地发送的,若以字符形式发送数字请使用 print()代替

void setup()
{
	Serial.begin(9600);
}
void loop()
{
	Serial.write(45); //以二进制形式发送数字 45
	int bytesSent = Serial.write(“hello” ); //发送字符串“hello” 并返回该字符串的长度。
}
8.peak()

返回收到的串口数据的下一个字节(字符),但是并不把该数据从串口数据缓存中清除。每次成功调用 peak()将返回相同的字符。与 read()一样语法

9.serialEvent()

当串口有数据到达时调用该函数,然后使用 Serial.read()捕获该数据

关注
打赏
1665385461
查看更多评论
立即登录/注册

微信扫码登录

0.1388s