Arduino 常用函数参考文档
封装好的API,使得程序中的语句更容易被理解,我们不用理会单片机中繁杂的寄存器配置,就能直观的控制Arduino,增强程序可读性的同时,也提高了开发效率。
本篇主要介绍:
一,项目结构
1.setup
2.loop
3.main
二,数字输入输出
1.pinMode ( pin , mode )
2.digitalWrite ( pin , value )
3.digitalRead ( pin )
三,模拟输入输出
1.analogRead
2.analogWrite
四,模拟输入输出
1.tone
2.pulisein
3.外部中断
-----------------------------------------------------------------------------------------------------------
一,项目结构
1.setup
2.loop
3.main
1.setup():
- Arduino控制器通电或复位后,即会开始执行setup() 函数中的程序,该部分只会执行一次。
- 通常我们会在setup() 函数中完成Arduino的初始化设置,如配置I/O口状态,初始化串口等操作。
eg.示例程序
- // 给13号引脚连接的设备设置一个别名“led”
- ;
- // 在板子启动或者复位重启后, setup部分的程序只会运行一次
- void setup(){
- // 将“led”引脚设置为输出状态
- pinMode(led, OUTPUT);
- }
- // setup部分程序运行完后,loop部分的程序会不断重复运行
- void loop()
- {
- digitalWrite(led, HIGH); // 点亮LED
- delay(); // 等待一秒钟
- digitalWrite(led, LOW); // 通过将引脚电平拉低,关闭LED
- delay(); // 等待一秒钟
- }
2.loop():
- 在setup() 函数中的程序执行完后,Arduino会接着执行loop() 函数中的程序。而loop()函数是一个死循环,其中的程序会不断的重复运行。
- 通常我们会在loop() 函数中完成程序的主要功能,如驱动各种模块,采集数据等。
eg.示例程序
- // 给13号引脚连接的设备设置一个别名“led”
- ;
- // 在板子启动或者复位重启后, setup部分的程序只会运行一次
- void setup(){
- // 将“led”引脚设置为输出状态
- pinMode(led, OUTPUT);
- }
- // setup部分程序运行完后,loop部分的程序会不断重复运行
- void loop()
- {
- digitalWrite(led, HIGH); // 点亮LED
- delay(); // 等待一秒钟
- digitalWrite(led, LOW); // 通过将引脚电平拉低,关闭LED
- delay(); // 等待一秒钟
- }
3.main():
- 在进行Arduino开发时,没有像传统C/C++程序使用入口函数main。实际上main函数存在于Arduino核心库中,且仍然是程序的入口。
- 在Arduino核心库中可见main.cpp文件,其内容如下:
- #include <Arduino.h>
- // Declared weak in Arduino.h to allow user redefinitions.
- ; }
- // Weak empty variant initialization function.
- // May be redefined by variant files.
- void initVariant() __attribute__((weak));
- void initVariant() { }
- void setupUSB() __attribute__((weak));
- void setupUSB() { }
- int main(void)
- {
- init();
- initVariant();
- #if defined(USBCON)
- USBDevice.attach();
- #endif
- setup();
- for (;;) {
- loop();
- if (serialEventRun) serialEventRun();
- }
- ;
- }
- 通过以上程序可见,Arduino程序中编写的setup和loop函数,都在main函数中调用了。
- loop的循环执行,是通过for循环实现的,且每次loop结束后,都会进行串口事件判断,也正是因为这种设计,串口事件不能实时响应。
二,数字输入输出
1.pinMode ( pin , mode )
2.digitalWrite ( pin , value )
3.digitalRead ( pin )
1.pinMode ( pin , mode ) :
- 在使用输入或输出功能前,你需要先通过pinMode() 函数配置引脚的模式为输入模式或输出模式。
参数:
- 参数pin为指定配置的引脚编号
- 参数mode为指定的配置模式
- 通常可用模式有三种:
- INPUT 输入模式
- OUTPUT 输出模式
- INPUT_PULLUP 输入上拉模式
eg.示例程序
- /*
- Blink
- 等待一秒钟,点亮LED,再等待一秒钟,熄灭LED,如此循环
- */
- // 在大多数Arduino控制板上 13号引脚都连接了一个标有“L”的LED灯
- // 给13号引脚连接的设备设置一个别名“led”
- int led = 13;
- // 在板子启动或者复位重启后, setup部分的程序只会运行一次
- void setup(){
- // 将“led”引脚设置为输出状态
- pinMode(led, OUTPUT);
- }
- // setup部分程序运行完后,loop部分的程序会不断重复运行
- void loop()
- {
- digitalWrite(led, HIGH); // 点亮LED
- delay(1000); // 等待一秒钟
- digitalWrite(led, LOW); // 通过将引脚电平拉低,关闭LED
- delay(1000); // 等待一秒钟
- }
2.digitalWrite ( pin , value ) :
- 之前我们在Blink程序中使用到了pinMode(, OUTPUT),即是把13号引脚配置为输出模式。
- 配置成输出模式后,你还需要使用digitalWrite() 让其输出高电平或者是低电平。
参数:
- 参数pin为指定输出的引脚编号;
- 参数value为你要指定输出的电平
- 使用HIGH指定输出高电平,或是使用LOW指定输出低电平。
eg.示例程序
- /*
- Blink
- 等待一秒钟,点亮LED,再等待一秒钟,熄灭LED,如此循环
- */
- // 在大多数Arduino控制板上 13号引脚都连接了一个标有“L”的LED灯
- // 给13号引脚连接的设备设置一个别名“led”
- int led = 13;
- // 在板子启动或者复位重启后, setup部分的程序只会运行一次
- void setup(){
- // 将“led”引脚设置为输出状态
- pinMode(led, OUTPUT);
- }
- // setup部分程序运行完后,loop部分的程序会不断重复运行
- void loop()
- {
- digitalWrite(led, HIGH); // 点亮LED
- delay(1000); // 等待一秒钟
- digitalWrite(led, LOW); // 通过将引脚电平拉低,关闭LED
- delay(1000); // 等待一秒钟
- }
- Arduino中输出的低电平为0V,输出的高电平为当前Arduino的工作电压。
- 例如Arduino UNO的工作电压为5V,其高电平输出也是5V;Arduino Uno工作电压为3.3V,所以高电平输出也就是3.3V。
3.digitalRead ( pin ) :
- 在使用输入或输出功能前,你需要先通过pinMode() 函数配置引脚的模式为输入模式或输出模式。
参数:
- 参数pin为指定读取状态的引脚编号。
返回值:
- 返回值为获取到的信号状态,1为高电平,0为低电平。
eg.示例程序
- /*
- 通过2号引脚连接的按键,控制13号引脚连接的LED
- */
- // 设置各引脚别名
- ; // 连接按键的引脚
- ; // 连接LED的引脚
- // 变量定义
- ; // 存储按键状态的变量
- void setup() {
- // 初始化LED引脚为输出状态
- pinMode(ledPin, OUTPUT);
- // 初始化按键引脚为输入状态
- pinMode(buttonPin, INPUT);
- }
- void loop(){
- // 读取按键状态并存储在变量中
- buttonState = digitalRead(buttonPin);
- // 检查按键是否被按下
- // 如果按键按下,那buttonState应该为高电平
- if (buttonState == HIGH) {
- // 点亮LED
- digitalWrite(ledPin, HIGH);
- }
- else {
- // 熄灭LED
- digitalWrite(ledPin, LOW);
- }
- }
三,模拟输入输出
1.analogRead
2.analogWrite
1.analogRead ( pin ) :
- 模拟输入引脚是带有ADC(Analog-to-Digital Converter,模数转换器)功能的引脚。
- 它可以将外部输入的模拟信号转换为芯片运算时可以识别的数字信号,从而实现读入模拟值的功能。
- 模拟输入功能需要使用analogRead() 函数。
参数:
- 参数pin是指定要读取模拟值的引脚,被指定的引脚必须是模拟输入引脚。如analogRead(A0),即是读取A0引脚上的模拟值。
返回值:
- Arduino Uno模拟输入功能有10位精度,即可以将0~5V的电压信号转换为0~1023的整数形式表示。
eg.示例程序
- /*
- 光敏电阻检测环境光
- http://www.arduino.cn/
- */
- void setup()
- {
- // 初始化串口
- Serial.begin();
- }
- void loop()
- {
- // 读出当前光线强度,并输出到串口显示
- int sensorValue = analogRead(A0);
- Serial.println(sensorValue);
- delay();
- }
2.analogWrite ( pin , value ) :
使用analogWrite() 函数实现PWM输出功能。
在Arduino Uno中,提供PWM功能的引脚为3、5、6、9、10、11。
在analogWrite() 和analogRead() 函数内部,已经完成了引脚的初始化,因此不用在Setup() 函数中进行初始化操作。
参数:
- 参数pin是指定要输出PWM波的引脚;参数value指定是PWM的脉冲宽度,范围为0~255。
返回值:
- Arduino Uno模拟输入功能有10位精度,即可以将0~5V的电压信号转换为0~1023的整数形式表示。
eg.示例程序
- /*
- Fading
- 通过analogWrite() 函数实现呼吸灯效果
- */
- ; // LED连接在9号引脚上
- void setup() {
- // Setup部分不进行任何处理
- }
- void loop() {
- // 从暗到亮,以每次加5的形式逐渐亮起来
- ; fadeValue <= ; fadeValue +=) {
- // 输出PWM
- analogWrite(ledPin, fadeValue);
- // 等待30ms,以便观察到渐变效果
- delay();
- }
- // 从亮到暗,以每次减5的形式逐渐暗下来
- ; fadeValue >= ; fadeValue -=) {
- // 输出PWM
- analogWrite(ledPin, fadeValue);
- // 等待30ms,以便观察到渐变效果
- delay();
- }
- }
四,模拟输入输出
1.tone
2.pulisein
3.外部中断
1.调声函数
1)tone ( ) :
可以让指定引脚产生一个占空比为50%的指定频率的方波。
语法:
tone(pin, frequency) tone(pin, frequency, duration)
返回值:
Arduino Uno模拟输入功能有10位精度,即可以将0~5V的电压信号转换为0~1023的整数形式表示。
2)no Tone ( pin ):
停止指定引脚上的方波输出。
语法:
noTone(pin)
参数:
pin : 余姚停止方波输出的引脚
eg.示例程序
- /*
- Melody
- Plays a melody
- This example code is in the public domain.
- http://arduino.cc/en/Tutorial/Tone
- */
- #include "pitches.h"
- // 记录曲子的音符
- int melody[] = {
- NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,, NOTE_B3, NOTE_C4};
- // 音符持续时间 4为四分音符, 8为八分音符
- int noteDurations[] = {
- , , , ,,,, };
- void setup() {
- // 遍历整个曲子的音符
- ; thisNote < ; thisNote++) {
- // noteDurations[]数组中存储的是音符的类型
- // 我们需要将其换算为音符持续时间,方法如下:
- // 音符持续时间=1000ms / 音符类型
- // 例如,四分音符=1000 / 4,8分音符 = 1000/8
- /noteDurations[thisNote];
- tone(, melody[thisNote],noteDuration);
- // 为了能辨别出不同的音调,你需要在两个音调间设置一定的延时
- // 增加30%延时时间是比较合适的
- int pauseBetweenNotes = noteDuration * 1.30;
- delay(pauseBetweenNotes);
- // 停止发声
- noTone();
- }
- }
- void loop() {
- // 程序并不重复,因此这里为空
- }
2.pulisein() :
检测指定引脚上的脉冲信号宽度。
例如当要检查高电平脉冲时,pulseln()会等待指定引脚输入的电平变高,当变高后开始记时,知道输入电平变低,停止计时。
pulseln()函数会返回这个脉冲信号的持续时间,即这个脉冲的宽度。
函数还可以设定超时时间,如果超时设定时间,仍未检测到脉冲,则会退出pulseln()函数并返回0.
当没有设定超时时间时,pulseln()会默认1秒钟的超时时间。
语法:
1)pulseln ( pin , value )
2)pulsein ( pin , value , timeout )
参数:
pin : 需要读取脉冲的引脚
value :需要读取的脉冲类型, HIGH OR LOW
timeout :超时时间 ,单位微秒 ,数据类型为无符号长整型。
返回值:
返回脉冲宽度 , 单位微秒 ,数据类型为无符号长整型 。 如果在指定时间内没有检测到脉冲,则返回0 .
eg.示例程序
- /*
- SR04超声波传感器驱动
- 串口显示检测距离
- */
- // 设定SR04连接的Arduino引脚
- ;
- ;
- float distance;
- void setup()
- { // 初始化串口通信及连接SR04的引脚
- Serial.begin();
- pinMode(TrigPin, OUTPUT);
- // 要检测引脚上输入的脉冲宽度,需要先设置为输入状态
- pinMode(EchoPin, INPUT);
- Serial.println("Ultrasonic sensor:");
- }
- void loop()
- {
- // 产生一个10us的高脉冲去触发TrigPin
- digitalWrite(TrigPin, LOW);
- delayMicroseconds();
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds();
- digitalWrite(TrigPin, LOW);
- // 检测脉冲宽度,并计算出距离
- distance = pulseIn(EchoPin, HIGH)/ 58.00;
- Serial.print(distance);
- Serial.print("cm");
- Serial.println();
- delay();
- }
3.外部中断
影响中断的处理程序——中断函数,当中断触发后,Arduino便会进行这个函数。
该函数不能带任何参数,且返回类型为空。如:
- void Hello () {
- flag = ture ;
- }
1)attachlneterrupt ( pin , ISR , mode )
对中断引脚进行初始化设置,以开启Arduino的外部中断功能
示例:
attachinterrupt ( 2 , Hello , LOW ) ;该语句会开启Arduino Uno 的 2 号引脚(中断编号0)的外部中断功能,并指定下降沿时触发该中断。
当2号引脚上电平由高变低后,该中断会被触发,Arduino即会运行Hello ()函数中的语句。
2) detachlnterrupt ( pin )
如果你不需要使用外部中断了,你可以用中断分离函数detachlnterrupt()来关闭中断功能。
参数:
pin : 需要禁用中断的引脚。
示例:
detachlnterrupt( 2 )
eg.示例程序
- /*
- Arduino外部中断的使用
- 外部中断触发警报声
- */
- // 默认无遮挡,蜂鸣器发声
- volatile boolean RunBuzzer = true;
- void setup()
- {
- Serial.begin();
- // 初始化外部中断
- // 当2号引脚输入的电平由高变低时,触发中断函数warning
- attachInterrupt(, warning, CHANGE);
- }
- void loop()
- {
- if(RunBuzzer)
- {
- tone(,);
- }
- else
- {
- noTone();
- }
- }
- // 中断函数
- void warning ()
- {
- RunBuzzer=!RunBuzzer;
- }
Arduino 常用函数参考文档的更多相关文章
- redis参考文档
本文为之前整理的关于redis的文档,放到博客上一份,也方便我以后查阅. redis简介 Redis是一个开源的.高性能的.基于键值对的缓存与存储系统, 通过提供多种键值数据类型来适应不同场景下的缓存 ...
- 微信小程序 不在以下合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html
微信小程序 不在以下合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html 友情提示: 大家 ...
- Web Api 在线参考文档
参考文档: https://developer.mozilla.org/zh-CN/docs/Web/API
- 让IE8兼容问题,参考文档bootstrap
问题:制作的页面基本没啥问题,只有IE8不好使 参考文档:bootstrap官网 方案一 方案二
- 教您怎么从spring 官网下载参考文档
假如您使用spring,那么本经验可能帮助到您. 假如您使用spring的过程中,需要查询一些文档,那么本经验可能帮助到您. 假如您对下载spring的文档有疑惑,那么本经验可能帮助到您. 教您怎么从 ...
- nexus 参考文档
参考文档: http://books.sonatype.com/nexus-book/reference/index.html E:\e\nexus\nexus-2.12.0-01\conf\nexu ...
- Oracle官网下载参考文档
最近有人问我有没有Oracle11g数据库官方参考文档,我就想,这不是在官网可以下载到的吗,疑惑,问了之后才知道,他官网找过,但时没有找到.不要笑,其实有很多人一样是找不到的,下面就一步一步操作下: ...
- Qt5.11参考文档
Qt5.11参考文档: http://www.bim-times.com/qt/Qt-5.11.1/qtdoc/index.html (来源于Qt官网)
- RxJava 参考文档
/*************************************************************** * RxJava 参考文档 * 说明: * 最近无意中发现RxJava ...
随机推荐
- Vmware centos7无法联网的问题解决
VMware三种网络连接方式的区别 : 1) bridge : 默认使用VMnet0,不提供DHCP服务 在桥接模式下,虚拟机和宿主计算机处于同等地位,虚拟机就像是一台真实主机一样存在于局域网中.因此 ...
- Java map笔记
Map 是一个键值对的集合 花和尚 豹子头 鲁智深 林冲 如果想要从map中获得值,可以根据键 Map<Key,velue> Map虽然是集合,但是和collection的接口无关 我们可 ...
- C#3.0新增功能09 LINQ 基础03 LINQ 和泛型类型
连载目录 [已更新最新开发文章,点击查看详细] LINQ 查询基于 .NET Framework 版本 2.0 中引入的泛型类型. 无需深入了解泛型即可开始编写查询. 但是,可能需要了解 2 个 ...
- 关于python3与python2同时存在情况下导入pyqt失败解决记录
最近感觉tkinter功能还是比较不适合新手做出高大上的界面,故开始使用pyqt,通过pip安装好了之后,利用qt设计师设计好界面之后,cmd运行之,报错提示没有找到pyqt5模块,IDE运行能正常加 ...
- python List交集、并集、差集
工作中遇到了求两个集合的差集,但是集合集合中包含字典,所以使用difference方法会报错,看了一些别人的博客,整理了一下. 1. 获取两个list 的交集print list(set(a).int ...
- 数据结构与算法基础之malloc()动态分配内存概述
动态内存分配和释放: 动态构造一维数组: 假设动态构造一个Int型数组: int *p = (int *)malloc(int len); //还可以写作: int *p = (int *)mallo ...
- Spring源码分析之环境搭建
写在最前面 最近突然心血来潮,想看看源码,看看大牛都怎么码代码,膜拜下.首选肯定是spring大法,于是说干就干,从GitHub上下载spring-framework源码编译拜读. 环境搭建 安装JD ...
- (技能篇)双机热备之Oracle切换故障处理
背景: 以前做的的一个项目中使用了某国产双机热备产品,但是在数据库做双机热备时出现了一些问题,没办法.不得不研究一番了!经过两天的研究终于问题得以解决.将问题处理步骤记录下来以备后用,也希望能帮助到需 ...
- html5教程 《实用技巧》—让你的网站变成响应式的3个简单步骤
如今,一个网站只在桌面屏幕上好看是远远不够的,同时也要在平板电脑和智能手机中能够良好呈现.响应式的网站是指它能够适应客户端的屏幕尺寸,自动响应客户端尺寸变化.在这篇文章中,我将向您展示如何通过3个简单 ...
- springBoot的过滤器,监听器,拦截器
概述 在开发中,我们经常要考虑一些问题,对敏感词进行过滤,用户是否已经登录,是否需要对他的请求进行拦截,或者领导问现在在线人数有多少人?我们如何实现这些功能哪 @WebFilter package c ...