Arduino编程


Arduino编程基础

参考资料:http://jsrun.net/t/YdpKp

关键字

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(低电平)。

  1. //使用时需先在void setup()中初始化
  2. pinMode(pin,INPUT);// 引脚用作输入
  3. 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

  1. void setup() {
  2. Serial.begin(9600);//打开串口,设置波特率为9600bps
  3. }
  4. void loop() {
  5. Serial.println("Hello world!");
  6. delay(1000);
  7. }

串口接收单字符数据

  1. int ledPin = 13;
  2. int val;
  3. void setup() {
  4. pinMode(ledPin,OUTPUT);
  5. Serial.begin(9600);//打开串口,设置波特率为9600bps
  6. }
  7. void loop() {
  8. val = Serial.read();
  9. if(-1 != val){
  10. Serial.println(val);
  11. if('H' == val){
  12. digitalWrite(ledPin, HIGH);
  13. delay(1000);
  14. digitalWrite(ledPin, LOW);
  15. }
  16. }
  17. }

串口接收多个字符数据

参考:[Arduino] 在串口读取多个字符串,并且转换为数字数组

  1. int sensor = A0;
  2. int led = 9;
  3. int ledPin = 13;
  4. int val;
  5. //定义一个comdata字符串变量,赋初值为空值
  6. String comdata = "";
  7. int mark = 0;
  8. void setup() {
  9. pinMode(ledPin,OUTPUT);
  10. Serial.begin(9600);
  11. }
  12. void loop() {
  13. //不断循环检测串口缓存,一个个读入字符串,
  14. while (Serial.available() > 0)
  15. {
  16. //读入之后将字符串,串接到comdata上面。
  17. comdata += char(Serial.read());
  18. //延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
  19. delay(2);
  20. //标记串口读过数据,如果没有数据的话,直接不执行这个while了。
  21. mark = 1;
  22. }
  23. if(mark == 1) //如果接收到数据则执行comdata分析操作,否则什么都不做。
  24. {
  25. //显示刚才输入的字符串(可选语句)
  26. Serial.println(comdata);
  27. //显示刚才输入的字符串长度(可选语句)
  28. Serial.println(comdata.length());
  29. Serial.println(comdata[0]); ////接收的第1位字符
  30. Serial.println(comdata[1]); //接收的第2位字符
  31. //Serial.println(comdata);
  32. if('H' == comdata[0] && 'A' == comdata[1]) {
  33. digitalWrite(ledPin, HIGH);
  34. Serial.println("LED H on");
  35. delay(3 * 1000);
  36. digitalWrite(ledPin, LOW);
  37. Serial.println("LED H off");
  38. }
  39. if('A' == comdata[0]){
  40. digitalWrite(ledPin, HIGH);
  41. Serial.println("LED H5 on");
  42. delay(1000);
  43. digitalWrite(ledPin, LOW);
  44. Serial.println("LED H5 off");
  45. delay(1000);
  46. digitalWrite(ledPin, HIGH);
  47. Serial.println("LED H5 on");
  48. delay(1000);
  49. digitalWrite(ledPin, LOW);
  50. Serial.println("LED H5 off");
  51. }
  52. if ('g' == comdata[0] && 'a' == comdata[1]) {
  53. get_a();
  54. }
  55. comdata = "";
  56. mark = 0;
  57. } //if(mark == 1)
  58. }
  59. void get_a()
  60. {
  61. int v;
  62. v = analogRead(sensor);
  63. Serial.println(v,DEC);//观察读取的模拟量
  64. analogWrite(led,v/4);//读取值范围是0~1023,除以4才能得到0~255的区间值
  65. }

控制13号引脚LED小灯亮灭

  1. /*
  2. 重复开关LED间隔1000ms=1s
  3. */
  4. //多数Arduino开发板的13引脚都有LED
  5. //定义引脚名称
  6. int led = 13;
  7. //setup()程序通电时执行一次
  8. void setup() {
  9. // put your setup code here, to run once:
  10. pinMode(led, OUTPUT);
  11. }
  12. //loop()程序不断重复执行
  13. void loop() {
  14. // put your main code here, to run repeatedly:
  15. digitalWrite(led, HIGH);
  16. delay(1000);
  17. digitalWrite(led, LOW);
  18. delay(1000);
  19. }

用按钮(数字引脚)控制LED小灯

  1. int button = 9;
  2. int ledPin = 13;
  3. void setup() {
  4. pinMode(button,INPUT);// 9号口用作输入
  5. digitalWrite(button, HIGH);// 9号口通过一个开关连接到接地,这个口其实只会有两个状态:HIGH,LOW,这里预设它默认值是HIGH
  6. pinMode(ledPin,OUTPUT);
  7. }
  8. void loop() {
  9. if(digitalRead(button) == LOW)
  10. digitalWrite(ledPin,HIGH);
  11. else
  12. digitalWrite(ledPin,LOW);
  13. }

用9号引脚(输出)控制舵机

  1. #include <Servo.h>
  2. Servo myservo;
  3. int pos = 0;
  4. void setup(){
  5. myservo.attach(9);
  6. }
  7. void loop(){
  8. //左转
  9. for(pos = 0; pos <= 180; pos += 1)
  10. {
  11. myservo.write(pos);
  12. delay(0);
  13. }
  14. //右转
  15. for(pos = 180; pos >= 0; pos -= 1)
  16. {
  17. myservo.write(pos);
  18. delay(30);//控制速度
  19. }
  20. }

模拟输入控制输出

A0引脚连电位器信号输出脚;D9连LED小灯

  1. int sensor = A0;
  2. int led = 9;
  3. void setup() {
  4. Serial.begin(9600);
  5. }
  6. void loop() {
  7. int v;
  8. v = analogRead(sensor);
  9. Serial.println(v,DEC);//观察读取的模拟量
  10. analogWrite(led,v/4);//读取值范围是0~1023,除以4才能得到0~255的区间值
  11. }

local 2021年10月20日 17:44 收藏文档