Arduino编程基础
关键字
if、if……else、for、switch、case、while、do……while、break、coninue、return、goto 。
语法符号
每条语句以“;”结尾,每段程序以“{}”括起来。
数据类型
boolean、char、int、unsigned int、long、unsigned long、float、double、string、array、void。
常量
- HIGH或者LOW,表示数字I/O引脚的电平(1、0);
- INPUT或者OUTPUT,表示数字I/O引脚的方向,INPUT表示输入(高阻态),OUTPUT表示输出(AVR能提供5V电压,40mA电流);
- TRUE或者FALSE,表示真假(1、0);
程序结构
主要包括两部分,即void setup()和void loop() 。
void setup():
声明变量(int val
)及引脚名称(ledPin = 13
)、初始化变量和引脚模式(pinMode(ledPin,OUTPUT)
)、调用库函数等。
void loop():
编程主体,不断地循环执行。
运算符
算数运算符
加 + ,减 - ,乘 * ,除 / ,取余 %
关系运算符
相等: ==
不等: !=
小于<,大于>,小于等于<=,大于等于>=
逻辑运算符
或: ||
与: &&
非: !
递增递减运算符
加1: ++
将运算符左边的值自增1,例如: x++ ,表示在使用x之后,再使x值加1。
减1: --
将运算符左边的值自减1,例如: x-- ,表示在使用x之后,再使x值减1。
函数
数字I/O引脚
pinMode(pin,mode)
一般在setup()里,先设置再使用
pin 参数表示要配置的引脚;mode设置模式为INPUT(输入)或OUTPUT(输出)。
digitalWrite(pin, value)
设置引脚的输出电压电压为高电平或低电平。value参数HIGH(高电平)或LOW(低电平)。
digitalRead(pin)
设置引脚为输入时,可以获取引脚的电压情况:HIGH(高电平)或LOW(低电平)。
//使用时需先在void setup()中初始化
pinMode(pin,INPUT);// 引脚用作输入
digitalWrite(pin, HIGH);// 引脚通过一个开关连接到接地,这里预设它默认值是HIGH
模拟I/O引脚
analogReference(type)
一般不使用
用于配置模拟引脚的参考电压,type类型参数3个,分别为:
- DEFAULT 默认模式,参考电压是5V;
- INTERNAL 低电压模式,使用片内基准电压2.56V;
- EXTERNAL 扩展模式,通过AREF引脚获取参考电压。
注意:若不使用该函数,默认参考电压是5V。若使用AREF作为参考电压,需接一个5k欧的上拉电阻。
analogRead(pin)
模拟量输入
读取引脚的模拟量电压值,每读取一次需要用100微秒。参数pin为要取值的引脚,返回类型是int 。(返回值:0~1023)
analogWrite(pin,value)
模拟量输出
通过PWM(脉冲宽度调制)的方式在引脚(带“~”号的)上输出模拟量。主要应用于LED亮度、直流电机转速等控制。
value参数范围:0 ~ 255
高级I/O引脚
pulseIn(pin,state,timeout)
用于读取引脚脉冲的时间长度
state参数HIGH或LOW。如果是HIGH,该函数先将引脚变为高电平,然后开始计时,直到变为低电平停止计时。返回脉冲持续时间(单位ms),超时则返回0 (timeout参数也可以不填)。
时间函数
delay()
延时函数,单位毫秒 ms
参数是延时时长 。延时1秒示例:delay(1000);
delayMicroseconds()
延时函数,单位微秒 μs
1ms = 1000μs
millis()
计时函数,单位是ms
单片机通电到现在运行的时间长度,单位是ms,最长记录到9小时22分钟(超出从0开始)。返回值j = millis();
,是unsigned long型。
micros()
计时函数,单位微秒 μs
单片机通电到现在运行的时间长度,70min(分钟)溢出。
中断函数
attachInterrupt(interrupt,function,mode)
用于设置中断
interrupt 中断源,可选0或1,对应数字引脚2或3号。
function 中断处理函数,是一段子程序,当中断发生时执行。
mode 触发模式,有4种:
- LOW(低电平触发)
- CHANGE(变化时触发)
- RISING(低电平变为高电平触发)
- FALLING(高电平变为低电平触发)
detachInterrupt(interrupt)
取消中断
interrupt参数是要取消的中断源。
串口通信函数
Serial.begin()
用于设置串口的波特率 例如:Serial.begin(9600);
Serial.available()
判断串口是否收到数据,返回值为int型,不带参数。
Serial.read()
该函数不带参数,只将串口数据读入。返回值为串口数据,int型。
Serial.print()
该函数向串口发送数据,可以发送变量或字符串
- Serial.print(“Hello”); //发送字符串
- Serial.print(x, DEC); //以十进制发送变量x
- Serial.print(x, HEX); //以十六进制发送变量x
Serial.println()
与Serial.print()类似,只是多了换行功能
Arduino的库函数
与C、C++一样,也有相关的库函数,与C语言的头文件使用类似,需要#include 语句,如#include <Servo.h>
程序实例
环境:win10电脑安装Arduino IDE 1.8.16软件(113MB;下载:国内、官方),通过usb线连接Arduino UNO开发板usb口。
串口打印Hello World
void setup() {
Serial.begin(9600);//打开串口,设置波特率为9600bps
}
void loop() {
Serial.println("Hello world!");
delay(1000);
}
串口接收单字符数据
int ledPin = 13;
int val;
void setup() {
pinMode(ledPin,OUTPUT);
Serial.begin(9600);//打开串口,设置波特率为9600bps
}
void loop() {
val = Serial.read();
if(-1 != val){
Serial.println(val);
if('H' == val){
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
}
}
}
串口接收多个字符数据
参考:[Arduino] 在串口读取多个字符串,并且转换为数字数组
int sensor = A0;
int led = 9;
int ledPin = 13;
int val;
//定义一个comdata字符串变量,赋初值为空值
String comdata = "";
int mark = 0;
void setup() {
pinMode(ledPin,OUTPUT);
Serial.begin(9600);
}
void loop() {
//不断循环检测串口缓存,一个个读入字符串,
while (Serial.available() > 0)
{
//读入之后将字符串,串接到comdata上面。
comdata += char(Serial.read());
//延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
delay(2);
//标记串口读过数据,如果没有数据的话,直接不执行这个while了。
mark = 1;
}
if(mark == 1) //如果接收到数据则执行comdata分析操作,否则什么都不做。
{
//显示刚才输入的字符串(可选语句)
Serial.println(comdata);
//显示刚才输入的字符串长度(可选语句)
Serial.println(comdata.length());
Serial.println(comdata[0]); ////接收的第1位字符
Serial.println(comdata[1]); //接收的第2位字符
//Serial.println(comdata);
if('H' == comdata[0] && 'A' == comdata[1]) {
digitalWrite(ledPin, HIGH);
Serial.println("LED H on");
delay(3 * 1000);
digitalWrite(ledPin, LOW);
Serial.println("LED H off");
}
if('A' == comdata[0]){
digitalWrite(ledPin, HIGH);
Serial.println("LED H5 on");
delay(1000);
digitalWrite(ledPin, LOW);
Serial.println("LED H5 off");
delay(1000);
digitalWrite(ledPin, HIGH);
Serial.println("LED H5 on");
delay(1000);
digitalWrite(ledPin, LOW);
Serial.println("LED H5 off");
}
if ('g' == comdata[0] && 'a' == comdata[1]) {
get_a();
}
comdata = "";
mark = 0;
} //if(mark == 1)
}
void get_a()
{
int v;
v = analogRead(sensor);
Serial.println(v,DEC);//观察读取的模拟量
analogWrite(led,v/4);//读取值范围是0~1023,除以4才能得到0~255的区间值
}
控制13号引脚LED小灯亮灭
/*
重复开关LED间隔1000ms=1s
*/
//多数Arduino开发板的13引脚都有LED
//定义引脚名称
int led = 13;
//setup()程序通电时执行一次
void setup() {
// put your setup code here, to run once:
pinMode(led, OUTPUT);
}
//loop()程序不断重复执行
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
用按钮(数字引脚)控制LED小灯
int button = 9;
int ledPin = 13;
void setup() {
pinMode(button,INPUT);// 9号口用作输入
digitalWrite(button, HIGH);// 9号口通过一个开关连接到接地,这个口其实只会有两个状态:HIGH,LOW,这里预设它默认值是HIGH
pinMode(ledPin,OUTPUT);
}
void loop() {
if(digitalRead(button) == LOW)
digitalWrite(ledPin,HIGH);
else
digitalWrite(ledPin,LOW);
}
用9号引脚(输出)控制舵机
#include <Servo.h>
Servo myservo;
int pos = 0;
void setup(){
myservo.attach(9);
}
void loop(){
//左转
for(pos = 0; pos <= 180; pos += 1)
{
myservo.write(pos);
delay(0);
}
//右转
for(pos = 180; pos >= 0; pos -= 1)
{
myservo.write(pos);
delay(30);//控制速度
}
}
模拟输入控制输出
A0引脚连电位器信号输出脚;D9连LED小灯
int sensor = A0;
int led = 9;
void setup() {
Serial.begin(9600);
}
void loop() {
int v;
v = analogRead(sensor);
Serial.println(v,DEC);//观察读取的模拟量
analogWrite(led,v/4);//读取值范围是0~1023,除以4才能得到0~255的区间值
}