首页
Arduino
Arduino控制板介绍
Arduino编程
Arduino中断函数attachInterrupt()详解
为Arduino IDE安装添加库
Arduino相关硬件连接
Arduino Uno R3连接 ESP8266-01无线模块
Python3使用串口连接Arduino
Arduino开发板使用笔记
Arduino UNO 连接 LCD1602
VS1838B 解码红外遥控器
本文档由 内网文摘 发布,转载请注明出处
-
+
首页
Arduino编程
### Arduino编程基础 参考资料:http://jsrun.net/t/YdpKp #### 关键字 if、[if……else](http://jsrun.net/t/fdpKp "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(低电平)。 ```cpp //使用时需先在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;下载:[国内](https://www.arduino.cn/thread-5838-1-1.html "国内")、[官方](https://www.arduino.cc/en/software "官方")),通过usb线连接Arduino UNO开发板usb口。 #### 串口打印Hello World ```cpp void setup() { Serial.begin(9600);//打开串口,设置波特率为9600bps } void loop() { Serial.println("Hello world!"); delay(1000); } ``` #### 串口接收单字符数据 ```cpp 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] 在串口读取多个字符串,并且转换为数字数组](https://www.cnblogs.com/jqmtony/p/3764846.html "[Arduino] 在串口读取多个字符串,并且转换为数字数组") ```cpp 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小灯亮灭 ```cpp /* 重复开关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小灯 ```cpp 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号引脚(输出)控制舵机 ```cpp #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小灯 ```cpp 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的区间值 } ```
local
2021年10月20日 17:44
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
关于 LocalNetwork
LocalNetwork
是由mrdoc开源
LocalNetwork.cn
修改的在线文档系统,作为个人和小型团队的云笔记、文档和知识库管理工具。
如果此文档给你或你的团队带来了帮助,欢迎支持作者持续投入精力更新和维护!内网文摘 & LocalNetwork
>>>主页
logo
logo
下载Markdown文件
分享
链接
类型
密码
更新密码