Arduino应用技术 课件全 黄凌 第1-5讲 初识arduino - 物联网服务平台_第1页
Arduino应用技术 课件全 黄凌 第1-5讲 初识arduino - 物联网服务平台_第2页
Arduino应用技术 课件全 黄凌 第1-5讲 初识arduino - 物联网服务平台_第3页
Arduino应用技术 课件全 黄凌 第1-5讲 初识arduino - 物联网服务平台_第4页
Arduino应用技术 课件全 黄凌 第1-5讲 初识arduino - 物联网服务平台_第5页
已阅读5页,还剩292页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一讲初识ArduinoARDUINO简介Arduino是源自意大利的一个开源代码的硬件项目平台,该平台包括一块具有简单I/O功能的电路以及一套程序开发环境软件。Arduino可以用来开发交互产品,比如它可以读取大量的开关和传感器信号,并可以控制电灯、电机和其他各式各样的物理设备;Arduino也可以开发出与PC相连的周边装置,能在运行时与PC上的软件进行通信。Arduino的硬件电路板可以自行焊接组装,也可以购买已经组装好的模块,而程序开发环境的软件则可以从网上免费下载与使用。ARDUINO的历史讲述人口头介绍或略读《Arduino开发实战指南》,第一章,1.1小结Arduino的家族这是一款基本的Arduino产品,控制器采用Atmega168或Atmega328,支持直流电源供电和USB口供电,如图所示。后续很多产品都是这款产品的基础上发展而来的。1.ArduinoDuemilanoveArduinoNano在设计中去掉了直流电源接口,采用Mini-B标准的USB接口来连接电脑,除了外观变了,其他接口及功能保持不变,控制器同样采用Atmega168或Atmega328,是一款缩小版的ArduinoDuemilanove,如图所示。2.ArduinoNano考虑到存在一些空间要求十分严格的使用者,Arduinomini在设计中甚至去掉了USB接口和复位开关,这样能够减小Arduino的尺寸。唯一的问题是连接电脑或烧写程序时需要一个USB或RS232转换成TTL,Arduino官方也有相应的适配座——MiniUSBAdapter。3.ArduinominiArduinoBT本身包含了一个BluegigaWT11蓝牙模块,支持蓝牙无线串行通信,但不支持蓝牙音频设备。若没有USB接口,连接电脑或烧写程序可以通过蓝牙适配器与ArduinoBT连接实现无线程序下载与控制。4.ArduinoBT这是一款真正有艺术气质的产品,面向的主要使用者是从事服装设计之类工作的设计师,他可以使用导电线和或普通线缝在衣服或不料上,LilyPadArduino每个引脚上的小东大到足够缝纫针可以轻松穿过,如图。如果用导电线缝纫的话,即可以起到固定作用,又可以起到传导作用。比起普通的Arduino板,LilyPadArduino相对比较脆弱,比较容易损坏,但是他的基本功能都保留了下来,除了一点,它没有USB接口,所以LilyPadArduino连接电脑或烧写程序时需要一个USB或RS232转换成TTL的适配座。5.LilyPadArduino设计ArduinoPro的目的是为了那些便利性和低成本的高级用户。为了降低成本,它省去了USB接口、直流电源接口和引脚排针,连接电脑或烧写程序时需要一个USB或RS232转换成TTL的适配座。ArduinoPro更像是一个大号的Arduinomini,如图。需要注意的是,ArduinoPro有3.3V/8MHz和5V/16MHz两个版本,使用的时候要留意。另外ArduinoPro同样有一个ArduinoProMini的版本,如图。6.Arduinopro和ArduinoproMINI7.ArduinofioArduinoFio的工作电压是3.3V,控制器的工作频率是8MHz,采用Mini-B标准的USB接口,提供一个锂聚合物电池接口,底部预留一个Xbee模块插座,Xbee模块可使Arduino方便的应用于无线网络。8.ARDUINOUNOArduinoUno是最新的Arduino产品系列,如图所示,它与之前的Arduino板最大的区别在于它不是使用FTDIUSB-to-serial串行驱动器芯片,而是采用Atmega8U2芯片进行USB到串行数据转换。目前ArduinoUno已成为Arduino的主推产品。9.Arduinomega2560ArduinoMega2560的控制器采用ATMega2560,他的资源要比之前的Arduino产品丰富很多,用于满足需使用较多资源进行产品设计与开发的用户需求,同时ArduinoMega2560也兼容之前基于ArdinoDuemilanove第二章Arduino语言

2.1Arduino语言介绍及程序结构Arduino语言使用C/C++语言编写程序,其实也就是基础的C语言,只不过把AVR单片机(微控制器)相关的一些参数设置都函数化了,不用去了解它的底层硬件,让不了解AVR单片机(微控制器)的朋友也能轻松上手。2.1.1Arduino语言介绍Arduino基于AVR平台,对AVR库进行了二次编译封装,把端口都打包好了,寄存器啦、地址指针之类的基本不用管。大大降低了软件开发难度,适宜非专业爱好者使用。但优点和缺点并存,因为是二次编译封装,代码不如直接使用AVR代码编写精练,代码执行效率与代码体积都弱于AVR直接编译。在Arduino中,使用清楚明了的API替代复杂的寄存器配置过程,如以下代码:pinMode(13,OUTPUT);digitalWrite(13,HIGH);2.1.1Arduino语言介绍Arduino程序中没有main函数。其实并不是Arduino没有main函数,而是main函数的定义隐藏在了Arduino的核心库文件中。Arduino开发一般不直接操作main函数,而是使用setup和loop这两个函数。2.1.2Arduino程序结构----setup()

上电后setup()函数执行一次2.1.2Arduino程序结构--loop()loop()函数一直循环运行面包板橫向相通、中間不通面包板连接示意电阻是对电流起阻碍作用的元件。电阻的作用有控制某一部份电路的电压和电流比例。分配电路不同部份的电压比例。限制流经某一段电路的电流。释放热能。发热线便是根据电阻的这个特性而产生出来的。通过电阻自身的一些特性,采集环境信息。比如根据阻值随温度变化特性,来采集环境温度。电阻阻值读取二极管是单向传导电流的元件;发光二极管是可以发光的二极管;三极管是能够起放大、振荡或者开关等作用的元件;二极管、发光二极管(LED)、三极管导线、电缆和连接器导线的作用是为电流提供通路。电缆是由多根独立导线组成的。实验材料:ArduinoUNO、面包板、1个LED、1个按键、1个220Ω电阻、1个10kΩ电阻。连接示意图与电路原理图实验:按键控制LED实验开关簡介電路符號名称:按扭开关类型:模拟组件控制:改变电压电流之输出(on/off)极性:无正负之分,但有接脚之别(in/out)一定要记得使用开关时,在线路中一定要加上电阻,防止短路。开关使用下拉电阻『降低』输出到GND(0volts)按下开关输入5V按下为HIGH,放开为LOW上拉电阻连接到5V的输入按下开关输出到GND(0volts)按下为LOW,放开为HIGH上拉与下拉上(下)拉的目的的避免信号脚悬空,产生异常值。/∗通过2号引脚连接的按键来控制13号引脚连接的LED∗/constintbuttonPin=2;//连接按键的引脚constintledPin=13//连接LED的引脚intbuttonState=0;//存储按键状态的变量voidsetup(){//初始化LED引脚为输出状态pinMode(ledPin,OUTPUT);//初始化按键引脚为输入状态pinMode(buttonPin,INPUT);}程序代码voidloop(){//读取按键状态并存储在变量中buttonState

=digitalRead(buttonPin);//检查按键是否被按下//如果按键被按下,则buttonState应该为高电平if(buttonState

==HIGH){//点亮LEDdigitalWrite(ledPin,HIGH);}else{//熄灭LEDdigitalWrite(ledPin,LOW);}}使用内部上拉电阻修改实验电路如右同时将原来的程序setup()部分中的

pinMode(buttonPin,INPUT);修改为

pinMode(buttonPin,INPUTPULLUP);这样就可使能该引脚上的内部上拉电阻,等效于在该引脚与VCC之间连接了一个阻值为20kΩ~50kΩ的电阻。,实现一个新的控制效果,即按一下按键点亮LED,再按一下按键熄灭LED。修改控制效果#defineLED13//SetD13astheLEDpin#defineBUTTON2//SetD12asthebuttonpin//Let'ssayyouhaveyourpushbuttononpin12intswitchState=0;//actualreadvaluefrompin12intoldSwitchState=0;//lastreadvaluefrompin12intlightsOn=0;//istheswitchon=1oroff=0,实现一个新的控制效果,即按一下按键点亮LED,再按一下按键熄灭LED。修改控制效果voidsetup(){pinMode(BUTTON,INPUT);//setthepushbuttonasinputpinMode(LED,OUTPUT);//anythingyouwanttocontrolusingaswitche.g.aLed}voidloop(){switchState=digitalRead(BUTTON);//readthepushButtonStateif(switchState!=oldSwitchState)//catchchange{oldSwitchState=switchState;if(switchState==HIGH){//togglelightsOn=!lightsOn;}}},实现一个新的控制效果,即按一下按键点亮LED,再按一下按键熄灭LED。修改控制效果if(lightsOn){digitalWrite(LED,HIGH);//settheLEDon}else{digitalWrite(LED,LOW);//settheLEDoff}}}2.2Arduino语言基础

2.2.1数据类型类型存储空间占用(字节)取值范围byte10~255int2-32768~32767unsignedint20~65535word20~65535long4-2147483648~2147483647unsignedlong40~4294967295short2-32768~32767boolean1取值为false和truechar1-128~127unsignedchar10~255float4–3.4028235E+38~3.4028235E+38double4–3.4028235E+38~3.4028235E+38string-根据具体情况确定String-根据具体情况确定array-根据具体情况确定void0只是一个标识符,不占用存储空间2.2.2数据类型转换Arduino语言提供了一些函数可以将指定的值转换为特定的类型。函数作用char()将指定值转换为char类型byte()将指定值转换为byte类型int()将指定值转换为int类型word()将指定值转换为word类型long()将指定值转换为long类型float()将指定值转换为float类型2.2.3常量常量非常容易理解,它是一个字面量,它只可以表示一个特定的量。常量名说明false逻辑假true逻辑真HIGH高电平LOW低电平INPUT输入模式INPUT_PULLUP输入模式(激活上拉电阻)OUTPUT输出模式2.2.3常量1.数字引脚常量:INPUT和OUTPUT首先要记住这两个常量必须是大写的。通过pinMode()配置为INPUT的引脚即是将其配置在一个高阻抗的状态;配置为INPUT的引脚可以理解在引脚前串联一个100兆欧姆的电阻。pinMode()配置为OUTPUT即是将其配置在一个低阻抗的状态。这意味着它们可以为电路提供充足的电流。Atmega引脚可以向其他设备/电路提供或倒灌达40毫安(mA)的电流。这使得它们利于给LED供电,而不是读取传感器的数值。输出(OUTPUT)引脚被短路或接5V电压会受到损坏甚至烧毁;但是引脚在为继电器或电机供电时,由于电流不足,将需要一些外接电路来实现供电。2.2.3常量2.引脚电压常量:HIGH和LOW这两个常量也是必须大写的。当读取(read)或写入(write)数字引脚时只有两个可能的值:HIGH和LOW。3.逻辑常量(布尔常量):false和truefalse的值为零,true通常情况下被定义为1,但true具有更广泛的定义。在布尔含义里任何非零整数为true。所以在布尔含义中-1、2和-200都定义为true。2.2.3常量intledPin=13;intdelayTime=1000;voidsetup(){ pinMode(ledPin,OUTPUT);}voidloop(){ digitalWrite(ledPin,HIGH); delay(delayTime); //延时 digitalWrite(ledPin,LOW); delay(delayTime); delayTime=delayTime+100; //每次增加延时时间0.1s}2.3Arduino的一些扩展语法Arduino将分号(;)视为一条语句的结束符号。{}(花括号)也称为大括号,是C编程语言中的一个重要组成部分;它们被用来区分几个不同的结构。左大括号“{”必须与一个右大括号“}”形成闭合。这称为括号平衡的条件。在ArduinoIDE中有一个方便的功能来检查大括号是否平衡。只需选择一个括号,甚至单击紧接括号的插入点,就能知道这个括号的“伴侣括号”;养成一种很好的编程习惯可以避免错误:2.3Arduino的一些扩展语法注释用来对代码所实现的功能做一些描述,当然也可以用来做一些相关说明。Arduino语言提供了两种注释方法。“/**/”为多行注释,在“/*”和“*/”之间的内容就是注释内容:2.4运算符

2.4.1复合运算符复合操作运算符是部分数学运算符、位运算符与赋值运算的一种简写形式。运算符名称说明++递增对操作数进行加1运算--递减对操作数进行减1运算+=加等将左右操作数之和赋值给左操作数-=减等将左右操作数之差赋值给左操作数*=乘等将左右操作数之积赋值给左操作数/=除等将左右操作数之商赋值给左操作数&=与等将左右操作数按位与的结果赋值给左操作数|=或等将左右操作数按位或的结果赋值给左操作数2.4.2关系运算符关系运算符的结果是boolean类型的true或false。运算符名称作用>

大于判断左操作数是否大于右操作数<

小于判断左操作数是否大于右操作数==(双等号)等于判断左操作数是否等于右操作数>=大于等于判断左操作数是否大于或者等于右操作数<=小于等于判断左操作数是否小于或者等于右操作数!=不等于判断左操作数是否不等于右操作数2.4.3布尔运算符布尔运算符用来对两个布尔表达式进行运算,运算的结果仍然为布尔值。运算符名称作用&&逻辑与对两个操作数进行逻辑与运算||逻辑或对两个操作数进行逻辑或运算!逻辑非对两个操作数进行逻辑非运算符号为&(单符号)的位运算符就是布尔运算符的符号&&(双符号);他们是完全不同的符号。同样,不要混淆布尔运算符||(双竖)与位运算符“或”符号为|(单竖)。2.4运算符

2.4.4数学运算符数学运算符包括四则运算符以及取模运算符。运算符名称作用+加法对操作数执行加法运算-减法对操作数执行减法运算*乘法对操作数执行乘法运算/除法对操作数执行除法运算%求余对操作数进行取模运算=赋值将右操作数中的值赋给左操作数2.4.5位运算符位运算符用来按位操作数据。运算符名称作用&按位与按位进行逻辑与操作|按位或按位进行逻辑或操作^按位异或按位进行异或操作~按位非按位进行逻辑非操作<<

按位左移按位进行左移操作>>

按位右移按位进行右移操作2.4.6指针运算符指针运算符包括&(引用)和*(间接引用)。&运算符用来引用变量或者函数的地址,*则是通过地址间接地引用指定地址中的内容。2.5条件判断2.5.1ifif(someVariable>50){ //执行某些语句}2.5条件判断2.5.2if...elseif(pinFiveInput<500){ //执行A操作}else{ //执行B操作}2.5条件判断if(pinFiveInput<500){ //执行A操作}elseif(pinFiveInput>=1000){ //执行B操作}else{ //执行C操作}2.6循环2.6.1while循环while(表达){//语句}while循环会无限的循环,直到括号内的判断语句变为假。必须要有能改变判断语句的东西,要不然while循环将永远不会结束。这可以表现为一个递增的变量,或一个外部条件,如传感器的返回值。2.6循环2.6.2do...whiledo{//语句}while(测试条件);do…while循环与while循环运行的方式是相近的,不过它的条件判断是在每个循环的最后,所以这个语句至少会被运行一次,然后才结束。2.6循环2.6.3forfor循环开头有3个部分:(初始化;条件;增量计数){//语句}while循环会无限的循环,直到括号内的判断语句变为假。必须要有能改变判断语句的东西,要不然while循环将永远不会结束。这可以表现为一个递增的变量,或一个外部条件,如传感器的返回值。2.6循环break用于跳出switch、while、do…while和for结构;continue用于在while、do…while和for循环结构中结束当前循环;return用于立即结束当前程序执行;2.7

Arduino函数系统函数是Arduino语言默认提供的函数,这些函数可以直接拿来使用而不需要定义。系统函数类型作用数字I/O设置针脚属性和进行I/O操作模拟I/O设置针脚属性和进行I/O操作高级I/O操作波形和比特数据等时间输出时间和暂停程序等数学数学操作函数,如求绝对值等三角进行sin、cos和tan运算随机数产生随机数位和比特操作位和比特的函数外部中断响应或者关闭外部中断内部中断响应或者关闭内部中断通信主机与Arduino设备之间进行通信USB(只有Leonardo和Due具备)使用USB键盘和鼠标1)pinMode(pin,mode)描述:将指定的针脚配置成输出或输入。语法:pinMode(pin,mode);参数:pin,要设置模式的针脚;

mode,INPUT或OUTPUT(必须是大写的)2)digitalWrite(pin,value)语法:digitalWrite(pin,value);参数:pin,针脚编号(如1,5,10,A0,A3);

value,HIGH或LOW。(必须是大写3)intdigitalRead(pin)描述:读取指定针脚的值,HIGH或LOW。语法:digitalRead(PIN);参数:pin,你想读取的针脚号(int)。返回:HIGH或LOW。voidsetup(){

//初始化I/O口for(inti=2;i<=9;i++)pinMode(i,OUTPUT);}

voidloop(){

//从引脚2到引脚9,逐个点亮LED,等待1秒再熄灭LEDfor(inti=2;i<=9;i++){digitalWrite(i,HIGH);delay(1000);digitalWrite(i,LOW);}//从引脚9到引脚2,逐个点亮LED,等待1秒再熄灭LEDfor(inti=9;i>=2;i--){digitalWrite(i,HIGH);delay(1000);digitalWrite(i,LOW);}}//从引脚9到引脚2,逐个点亮LED,等待1秒再熄灭LEDfor(inti=9;i>=2;i--){digitalWrite(i,HIGH);delay(1000);digitalWrite(i,LOW);}}生活中接触到的大多数信号都是模拟信号,如声音和温度的变化等。Arduino中,常用0~5V的电压来表示模拟信号。Arduino控制器中,编号前带有“A”的引脚是模拟输入引脚。Arduino可以读取这些引脚上输入的模拟值,即读取引脚上输入的电压大小。2.7.2模拟I/O模拟输入引脚是带有ADC(Analog⁃to⁃DigitalConverter,模/数转换器)功能的引脚。它可以将外部输入的模拟信号转换为芯片运算时可以识别的数字信号,从而实现读入模拟值的功能。使用AVR芯片作主控器的Arduino模拟输入功能有10位精度,即可以将0~5V的电压转换为0~1023的整数形式表示。模拟输入功能需要使用

analogRead(pin);其中参数pin是要读取模拟值的引脚,被指定的引脚必须是模拟输入引脚,如analogRead(A0)即是读取A0引脚上的模拟值。模拟输入引脚模拟输出功能使用analogWrite()函数来实现,但该函数并不是输出真正意义上的模拟值,而是以脉冲宽度调制(PulseWidthModulation,PWM)这种特殊的方式来达到输出模拟值的效果,这种方式叫做PWM——脉冲宽度调制(PulseWidthModulation)。analogWrite(pin,value)参数value是PWM的脉冲宽度,范围为0~255。模拟输出功能大多数Arduino控制器的PWM引脚都会用“~”标识;PWM引脚实验所需材料:ArduinoUNO、面包板、1个LED、1个220Ω电阻。实验:呼吸灯电路原理图voidsetup(){pinMode(3,OUTPUT);//声明3脚为输出}voidloop(){for(inta=0;a<=255;a++)//循环从0-255,增加亮度{analogWrite(3,a);//pwm输出3脚delay(8);//等待8ms}

for(inta=255;a>=0;a--)//循环从255-0,减少亮度{analogWrite(3,a);//pwm输出3脚delay(8);//等待8ms}delay(800);//等待800ms}实验材料:ArduinoUNO、面包板、1个LED、1个220Ω电阻、1个10kΩ电位器。实验:电位器调节呼吸灯电位器是一个可调电阻,通过旋转旋钮改变2号引脚的位置,从而改变2号引脚到两端的阻值。实验中需要将电位器的1、3号引脚分别接到5V和GND上,再通过模拟输入引脚读取电位器2号引脚输出的电压(0~5V)。电位器电路原理图程序代码intpotPin=A0;//selecttheinputpinforthepotentiometerintledPin=9;//selectthepinfortheLEDintval=0;//variabletostorethevaluecomingfromthesensorvoidsetup(){pinMode(ledPin,OUTPUT);//declaretheledPinasanOUTPUT}voidloop(){val=analogRead(potPin);//readthevaluefromthesensordigitalWrite(ledPin,HIGH);//turntheledPinondelay(val);//stoptheprogramforsometimedigitalWrite(ledPin,LOW);//turntheledPinoffdelay(val);//stoptheprogramforsometime}程序代码constintanalogPin=A0;//theanaloginputpinattachtoconstintledPin=9;//theledattachtointinputValue=0;//variabletostorethevaluecomingfromsensorintoutputValue=0;//variabletostoretheoutputvaluevoidsetup(){}voidloop(){inputValue=analogRead(analogPin);//readthevaluefromthesensoroutputValue=map(inputValue,0,1023,0,255);//Convertfrom0-1023proportionaltothenumberofanumberoffrom0to255analogWrite(ledPin,outputValue);//turntheledondependontheoutputvalue}实验所需材料:ArduinoUNO、面包板、1个光敏电阻、1个10kΩ电阻。一个220Ω电阻。连接示意图:实验:光敏电阻检测环境光亮度光敏电阻是一种能让你探测光线的传感器。它们体积小,价格便宜,功率低,使用方便,不会磨损。因此,它们经常出现在玩具、小工具和电器中。光电管基本上是一个电阻,它的电阻值(单位为欧姆Ω)取决于光线照射在表面上的程度。当光线暗时,光电管的电阻可能高达几兆欧。然而,当它很亮时,光敏电阻的电阻可能低到几百欧姆。因为成本低,有许多尺寸和规格,但比较不准确。出于这个原因,不应该用它们来测定精确的光度,单位是勒克斯或毫坎德拉。光敏电阻光敏电阻是一种电阻值随照射光强度增加而下降的电阻。光敏电阻的使用方法很简单,只需将其作为一个电阻接入电路中,然后使用analogRead()函数读取电压即可。由于光敏电阻的阻值一般较大,直接接入电路后观察到的电压变化并不明显,所以这里将光敏电阻与一个普通电阻串联(图2-42),再根据串联分压的方法来读取光敏电阻上的电压。光敏电阻电路原理图程序代码intphotocellPin=A0;//selecttheinputpinforthephotoresistorintledPin=9;//selectthepinfortheLEDintval=0;//variabletostorethevaluecomingfromthesensorvoidsetup(){Serial.begin(9600);//Setthebaudrateto9600,makesureit'ssameasyoursoftwaresettingspinMode(ledPin,OUTPUT);//declaretheledPinasanOUTPUTpinMode(photocellPin,INPUT);//declaretheledPinasanOUTPUT}程序代码voidloop(){val=analogRead(photocellPin);//readthevaluefromthesensorSerial.println(val);//Theserialwillprintthelightvalueif(val<=512)//thepointatwhichthestateofLEDschange{digitalWrite(ledPin,HIGH);//setLEDon}else{digitalWrite(ledPin,LOW);//setLEDoff}}1)tone()在一个针脚上产生一个特定频率的方波(50%占空比)。持续时间可以设定,波形会一直产生直到调用noTone()函数。该针脚可以连接压电蜂鸣器或其他喇叭播放声音。在同一时刻只能产生一个声音。如果一个针脚已经在播放音乐,那么呼叫tone()将不会有任何效果。如果音乐在同一个针脚上播放,那么它会自动调整频率。使用tone()函数会与3脚和11脚的PWM产生干扰(Mega板除外)。2.7.3高级I/OTone()和analogWrite()函数都可以输出方波,所不同的是:tone()函数输出方波的占空比固定(50%),所调节的是方波的频率;而analogWrite()函数输出的频率固定(约490HZ),所调节的是方波的占空比。2)noTone()描述:停止由tone()产生的方波。如果没有使用,tone()将不会有变化。3)ShiftOut()描述:将数据的一个字节一位一位地移出。从最高有效位(最左边)或最低有效位(最右边)4)shiftIn()描述:将数据的一个字节一位一位地移入。从最高有效位(最左边)或最低有效位(最右边)5)pulseIn()描述:读取一个针脚的脉冲(HIGH或LOW)。例如,如果value是HIGH,则pulseIn()会等待引脚变为HIGH,开始计时,再等待引脚变为LOW并停止计时。返回脉冲的长度,单位为微秒。如果在指定的时间内无脉冲,函数返回0。此函数的计时功能由经验决定,长时间的脉冲计时可能会出错。计时范围为10μs~3min。(1s=103ms=106μs)。Q0--Q7:八位并行输出端。Q7':级联输出端。将它接下一个595的DS端。DS:串行数据输入端,级联的话接上一级的Q7'。74595的控制端说明:/MR(10脚):低电平时将移位寄存器的数据清零。通常我将它接Vcc。SH_CP(11脚):上升沿时数据寄存器的数据移位。Q0->Q1->Q2-->Q3-->...-->Q7;下降沿移位寄存器数据不变。ST_CP(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将ST_CP置为低电平,当移位结束后,在ST_CP端产生一个正脉冲(5V时,大于几十纳秒就行了。我们通常都选微秒级),更新显示数据。/OE(13脚):高电平时禁止输出(高阻态)。74595的第14管脚接Arduino的第4脚,74595的第12管脚接Arduino的第5脚,74595的第11管脚接Arduino的第6脚.74595的第10脚接高电平,第13脚接低电平。intlatchPin=5;intclockPin=6;intdataPin=4;

byteleds=0;

voidsetup(){pinMode(latchPin,OUTPUT);pinMode(dataPin,OUTPUT);pinMode(clockPin,OUTPUT);}

voidloop(){leds=0;updateShiftRegister();delay(500);for(inti=0;i<8;i++){bitSet(leds,i);updateShiftRegister();delay(500);}}

voidupdateShiftRegister(){digitalWrite(latchPin,LOW);shiftOut(dataPin,clockPin,LSBFIRST,leds);digitalWrite(latchPin,HIGH);}2.7.4时间函数1)millis()描述:返回Arduino开发板运行当前程序开始的毫秒数,这个数字将在约50天后溢出(归零)。2)micros()描述:返回Arduino开发板从运行当前程序开始的微秒数,这个数字将在约70分钟后溢出(归零)2.7.4时间函数unsignedlongtime;

voidsetup(){Serial.begin(9600);}voidloop(){serial.print("Time:");time=millis();//打印从程序开始到现在的时间serial.println(time);//等待一秒钟,以免发送大量的数据delay(1000);}2.7.4时间函数3)delay()描述:是程序设定的暂停时间(单位毫秒)。虽然创建一个使用delay()的闪烁LED很简单,并且许多例子将很短的delay用于消除开关抖动,delay()也拥有很多显著的缺点。在delay函数使用的过程中,读取传感器值、计算、引脚操作均无法执行,因此,它所带来的后果就是使其他大多数活动暂停。其他操作定时的方法读者可自行研究。大多数熟练的程序员通常避免超过10毫秒的delay(),除非arduino程序非常简单。2.7.5数学函数1)min(x,y)描述:计算两个数字中的最小值。参数:X,第一个数字,任何数据类型;Y,第二个数字,任何数据类型。返回:两个数字中的较小者。2)max(x,y)描述:计算两个数字中的最大值。参数:X,第一个数字,任何数据类型;Y,第二个数字,任何数据类型。返回:

两个数字中的较大者。2.7.5数学函数3)abs(x)描述:计算一个数的绝对值。参数:x,一个数值。返回:如果x大于或等于0,则返回它本身;如果x小于0,则返回它的相反数。2.7.5数学函数4)constrain(x,a,b)描述:将一个数值约束在一个范围内。参数:x,要被约束的数值,适用于所有的数据类型;a,该范围的最小值,适用于所有的数据类型;b,该范围的最大值,适用于所有的数据类型。返回值:x,如果x是介于a和b之间;

a,如果x小于a;

b,如果x大于b。。2.7.5数学函数5)map(value,fromLow,fromHigh,toLow,toHigh)描述:将一个数值从一个范围映像到另外一个范围,也就是说,会将fromLow到fromHigh之间的值映射至toLow到toHigh之间。不限制值的范围,因为范围外的值有时是刻意的和有用的。如果需要限制的范围,constrain()函数可以用于此函数之前或之后。2.7.5数学函数6)pow(base,exponent)描述:计算一个数的幂次方。pow()可以用来计算一个数的分数幂,其用来产生指数幂的数或曲线非常方便。参数:base,底数(float);exponent,幂(float)。返回:一个数的幂次方值(double)。2.7.6随机数1. randomSeed()使用randomSeed()初始化伪随机数生成器,使生成器在随机序列中的任意点开始。这个序列,虽然很长,并且是随机的,但始终是同一序列。如需要在一个random()序列上生成真正意义的随机数,在执行其子序列时使用randomSeed()函数预设一个绝对的随机输入,例如在一个断开引脚上的analogRead()函数的返回值。2.7.6随机数2.random()random()使用random()函数将生成伪随机数。random(max)random(min,max)参数:min-随机数的最小值,随机数将包含此值。(此参数可选)max-随机数的最大值,随机数不包含此值。返回:min和max-1之间的随机数(数据类型为long)2.7.6随机数longrandNumber;

voidsetup(){Serial.begin(9600);

//如果模拟输入引脚0为断开,随机的模拟噪声//将会调用randomSeed()函数在每次代码运行时生成不同的种子数值//randomSeed()将随机打乱random函数randomSeed(analogRead(0));}}2.7.6随机数voidloop(){//打印一个0到299之间的随机数randNumber=random(300);Serial.println(randNumber);//打印一个10到19之间的随机数randNumber=random(10,20);Serial.println(randNumber);delay(50);}2.7.7外部中断1)attachInterrupt(interrupt,function,mode)描述:当发生外部中断时,调用一个指定的函数。这会用新的函数取代之前指定给中断的函数。大多数的Arduino板有两个外部中断:0号中断(引脚2)和1号中断(引脚3),部分不同类型Arduino板的中断及引脚关系不同。ArduinoDue有更强大的中断能力,其允许在所有的引脚上触发中断程序,可以直接使用attachInterrrupt指定引脚号码。2.7.7外部中断2)detachInterrupt(interrupt)描述:关闭给定的中断。参数:interrupt,中断禁用的数(0或者1)。2.7.8开关中断1)interrupts()(中断)描述:重新启用中断(使用noInterrupts()命令后将被禁用)。中断允许一些重要任务在后台运行。禁用中断后一些函数可能无法工作,传入信息可能会被忽略。中断会稍微打乱代码的时间,可以在程序关键部分禁用中断。2.7.8开关中断2)noInterrupts()描述:禁止中断。中断允许在后台运行一些重要任务,默认使能中断。禁止中断时部分函数会无法工作,通信中接收到的信息也可能会丢失。中断会影响计时代码,在某些特定的代码中也会失效。并行通信2.7.9通信函数CPU和外部通信有两种并行通信:数据的各位同时传送串行通信:数据一位一位顺序传送串口通信并行通信串行通信串口通信优点串行通信并行通信通信距离远近抗干扰能力高低传输速度慢快成本低高在Arduino控制器上,串口都是位于0(RX)和1(TX)的两个引脚;Arduino的USB口通过一个转换芯片(通常为ATmega16u2)与这两个串口引脚连接。串口通信是Arduino最常用的方式初始化Serial.begin(speed);

其中参数speed指串口通信波特率,如300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200。发送信息Serial.print(val);其中参数val是要输出的数据。Serial.println(val);在输出完指定数据后,再输出一组回车换行符。接收信息Serial.available()函数检测是否有信息Serial.read()函数读取信息串口函数实验:串口输出实验intcounter=0;//计数器voidsetup(){Serial.begin(9600);}voidloop(){counter=counter+1;Serial.print(counter);Serial.print(":");Serial.println("HelloWorld");delay(1000);}实验:串口输入voidsetup(){

Serial.begin(9600);//初始化串口}voidloop(){if(Serial.available()>0){charch=Serial.read();Serial.print(ch);}}注意:Serial.available()>0条件必不可少,当缓冲区中没有可读数据时,Serial.read()函数会返回int型值-1,从而形成乱码。实验所需材料:ArduinoUNO实验现象:程序中使用Serial.read()语句接收数据并进行判断,当接收到的数据为“a”时,便点亮LED,并输出提示;当为“b”时,便关闭LED,并输出提示。实验:串口控制开关灯voidsetup(){Serial.begin(9600);pinMode(13,OUTPUT);}voidloop(){if(Serial.available()>0){charch=Serial.read();Serial.print(ch);if(ch==“a”){//开灯digitalWrite(13,HIGH);Serial.println("turnon");}elseif(ch==ˈbˈ){//关灯digitalWrite(13,LOW);Serial.println("turnoff");}}}2.8Arduino库函数Arduino开发的一个优势就是可以通过添加第三方库来增加对硬件的支持。目前已经有很多库,开发者可以根据需求选择安装,它们只会在你需要的时候载入。程序经常会依赖一些库,可以在代码的顶端看到它需要什么样的库。如果看#include<FatReader.h>,那意味着需要一个叫作FatReader的库或者一个包含FatReader文件的库。库是一个包含一些文件在里面的文件夹,这些文件以.cpp(C++codefile)和.h(C++headerfile)为扩展名。2.8.1库函数概述库名说明EEPROM读写EEPROMEthernetArduino网络扩展所使用的函数Firmata与主机之间通过串口协议进行通讯GSM连接GSM扩展板LiquidCrystal控制LCDSD读写SD卡Servo控制舵机SPI使用SPI总线通讯SoftwareSerial在数字引脚上使用串口通讯Stepper控制步进电机TFT在TFT屏幕输出WiFi控制WiFi扩展板Wire使用Wire接口通过网络或者传感器接受或发送数据Robot_ControlArduino机器人控制Robot_MotorArduino机器人马达控制2.8.2常用库函数2.8.3如何添加额外的Arduino库函数1.使用管理库要在ArduinoIDE中安装新库,可以使用库管理器。打开IDE并单击“项目”菜单,然后单击“加载库”→“管理库”。如图所示。2.8.3如何添加额外的Arduino库函数然后库管理器将打开,读者将找到已安装或可以安装的库列表。在此示例中,我们将安装ArduinoCloud库。滚动列表以找到它,然后选择要安装的库的版本。如图所示。2.8.3如何添加额外的Arduino库函数最后单击安装并等待IDE安装新库。根据您的连接速度,下载可能需要一些时间。完成后,ArduinoCloud库旁边会出现一个安装的标签;您可以关闭库管理器。如图所示。这时,你可以在加载库中看到安装完成的库。2.8.3如何添加额外的Arduino库函数2.输入.ZIP的库库通常作为ZIP文件或文件夹发布;文件夹的名称就是库的名称。文件夹内部有一个.cpp文件,一个.h文件,还有一个keywords.txt文件,examples文件夹和库所需的其他文件。从版本1.0.5开始,您可以在IDE中直接安装第三方库;不要解压缩下载的库。在ArduinoIDE中,到“项目”菜单中选择“加载库”子菜单,在下拉列表的顶部,选择“添加一个.ZIP库”选项。如图所示。2.8.3如何添加额外的Arduino库函数2.8.3如何添加额外的Arduino库函数2.手动安装如果要手动添加库,则需要将其作为ZIP文件下载,解压后放入正确的目录中;ZIP文件包含您需要的所有内容,包括提供的example示例。库管理器可以自动安装此ZIP文件,如前所述,但有些情况下您可能需要手动执行安装过程并将库自行放入sketchbook的libraries文件夹中。Arduino库在三个不同的位置进行管理:在IDE安装文件夹内,核心文件夹内和sketchbook中的libraries文件夹中。您的sketchbook的位置默认为Windows机器上的“..\\DOCUMENTS\Arduino”。路径显示在“首选项”面板中。如果要查看sketchbook默认打开“文件”菜单栏下的“首选项”子菜单。解压ZIP文件,拷贝到首选项所指示的路径下;重新启动IDE,你就能看到这个库了。2.8.3如何添加额外的Arduino库函数第三章Arduino基本示例

本章将继续利用Arduino做更多有趣的实验;从中掌握Arduino对各类传感器、显示器、测距模块、电动机、数码管的控制使用,更深入的学习Arduino编程语言和技巧。

温湿度传感器的使用运动传感器液晶显示器的使用超声波测距简易电子琴驱动电机数码管的驱动如何使用矩阵键盘数字骰子DHT11是一款有已校准数字信号输出的温湿度传感器。量程湿度20-90%RH,温度0~50℃。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中最佳选择。产品为4针单排引脚封装,连接方便。第三脚为空脚,不接;第一,四脚分别接电源和地;在VCC和数据脚之间连接一个10k的电阻,作为数据线的上拉电阻,再把数据脚接到Arduino的D3脚。#include<dht.h>dhtDHT;#defineDHT11_PIN3voidsetup(){Serial.begin(9600);Serial.println("TherealtimeTemperatureandHumidityis:");}voidloop(){//读入数据,intchk=DHT.read11(DHT11_PIN);Serial.print("Humidity:");Serial.print(DHT.humidity,1);Serial.println('%');Serial.print("Temparature");Serial.print(DHT.temperature,1);Serial.println('C');delay(2000);}在上传完成后几秒钟,打开串行监视器,你现在应该看到湿度和温度读数以秒为单位显示出来。请确保你选择正确的端口和波特率。3.2Arduino和运动传感器的连接3.2.1运动传感器的介绍运动传感器,顾名思义就是能够探测人或物体运动的装置。在大多数应用中,这些传感器用于在特定区域内探测人的活动。作为一种能够将其感应到的运动转换为电信号的装置,该传感器要么发射辐射并监控其反射回来的任何变化,要么获取运动物体本身发出的信号。某些运动传感器会在人或其他物体入侵而打破正常状态(即静止)时报警,而其他的还会在入侵之后恢复正常状态时报警。运动传感器分为主动式红外线(AIR)传感器或被动式红外线(PIR)传感器。对于这两种传感器,被动式红外线传感器是到目前为止最常用的传感器,其被认为是被动的原因是,与主动式红外线传感器不同,它们并不发射辐射束来测量其是否被打断,而只是接收体温形式的红外线。

在电子防盗、人体探测器领域中,被动式热释电红外探测器的应用非常广泛,因其价格低廉、技术性能稳定而受到广大用户和专业人士的欢迎。被动式热释电红外探头的工作原理及特性为:

人体都有恒定的体温,一般在37度,所以会发出特定波长10μm左右的红外线,被动式红外探头就是靠探测人体发射的10μm左右的红外线而进行工作的。人体发射的10μm左右的红外线通过菲涅尔滤光片增强后聚集到红外感应源上。红外感应源通常采用热释电元件,这种元件在接收到人体红外辐射温度发生变化时就会失去电荷平衡,向外释放电荷,后续电路经检测处理后就能产生报警信号。PIR工作参数:工作电压:4.5V至20V输出电压:高:3.3V低:0v探测角度:约120度范围:可调,最大到7米触发方式:低电平:不可重复触发/高电平:重复触发(默认)高电平停留时间:5秒-5分钟可调工作温度:-20-+80摄氏度。重量:6gPIR基本上由热释电传感器(圆形金属中心具有矩形晶体),可以检测红外辐射水平。如下图所示。一切物体都发出一些辐射,或多或少,而更热的物体辐射越多。然后将该传感器放置在多面透镜(菲涅耳透镜)的后面,该透镜将世界的视野“切割”成较小的可见度,从而显著扩大了有用的观察/检测角度。一旦检测到人的存在,传感器就会输出一个5V信号,持续一分钟。它提供了约5-7米的暂定检测范围,并且非常灵敏。检测原理如图所示。逆时针调节或者往左,增加敏感度,最左边距离大概是7米,顺时针调节或者往右,减少敏感度,最右边距离大概是3米,如图所示。逆时针调节或者往左,减少延时时间,最左边大概5秒;顺时针调节或者往右增加延时时间,最右边大概5分钟,如图所示。触发方式选择部分触发方式选择跳线允许您在单次触发和可重复触发之间进行选择。此跳线设置的影响是确定延迟开始的时间。单次触发→首次检测到运动时,时间延迟立即开始。可重复触发→每次检测到的动作都会重置时间延迟。因此,时间延迟从检测到的最后一个动作开始。默认为可重复触发。延时完成后3秒关闭-重要延时完成后,此设备的输出将变为低电平(或关闭)约3秒钟。换句话说,在这3秒时间内阻止所有运动检测。PIR将检测运动并将其设置为高达5秒钟。五秒钟后,PIR将其输出设置为低电平约3秒钟。在3秒钟内,PIR将不会检测到运动。3秒钟后,PIR将再次检测到运动,检测到的运动再次将输出设置为高电平,输出将保持开启,具体取决于延迟时间调整和触发模式选择。GND-将该引脚连接到0V。SIG-控制此继电器,低电平有效!当此输入低于约2.0V时,继电器将打开VCC-将此引脚连接到5V。Com-公共端NC-常闭开关NO-常开开关3.2.2电路设计PIR输出端连接到Arduino的D2,继电器的输出端连接到Arduino的D3.3.2.2电路设计intledPin=13;//选择led输出为13脚intrelayInput=3;//选择的继电器输出为3脚intinputPin=2;//PIR输入为2脚intpirState=LOW;//开始并没有侦测到动作,初始值为低intval=0;//设定变量读入管脚状态

voidsetup(){pinMode(ledPin,OUTPUT);//LED为输出pinMode(inputPin,INPUT);//PIR为输入pinMode(relayInput,OUTPUT);//继电器为输出digitalWrite(relayInput,HIGH);//继电器开始并没有工作,设定为高Serial.begin(9600);}voidloop(){val=digitalRead(inputPin);//读输入的值if(val==HIGH){//看看输入是否为高电平digitalWrite(ledPin,HIGH);//打开LEDif(pirState==LOW){Serial.println("Motiondetected!");//侦测到输入pirState=HIGH;digitalWrite(relayInput,LOW);//继电器输出为低,继电器动作Serial.println("TurnontheLamp!");Serial.println("Waitfor30000seconds");delay(30000);//等待30秒digitalWrite(relayInput,HIGH);//继电器输入为高Serial.println("TurnofftheLamp!");}}else{digitalWrite(ledPin,LOW);//关闭LEDif(pirState==HIGH){Serial.println("Motionended!");//输入停止pirState=LOW;}}拓展实验编写程序使两个继电器轮流打开,关闭。3.3Arduino和液晶显示器的连接3.3.1液晶显示器在Arduino很多项目中,您需要直接从LCD显示屏输出数据。在本例中,我们将展示如何使用I2C通信在Arduino上驱动LCD显示屏。最后,您将看到如何在显示器上显示文本。LCD显示器的集成大大方便了项目的设计,允许用户读取一些输出参数;这些值可以是传感器数据,例如温度或压力,甚至Arduino正在执行的循环次数。然而,这些显示器有一个小问题。当它们连接到Arduino时,这些显示器几乎占用所有可用IO口,只把极少的输出留给其他设备和传感器。如果使用I2C总线上的通信,这个问题已经解决了。LCD1602显示器具有集成芯片,用于管理I2C通信,所有输入和输出信息仅限于两个PIN(不包括电源)。I2C是由飞利浦开发的一种串行总线,它使用两条双向线路,称为SDA(串行数据线)和SCL(串行时钟线)。两者都必须通过上拉电阻连接。使用电压标准为5V和3.3V。I2CLCD1602上背面的蓝色电位器(用于调整对比度以获得更好的显示效果。如果您拿走了Backlightjumper跳线,背光将被关闭。3.3.3寻找I2C地址每个I2C设备都有一个I2C地址,用于接收命令或发送消息。这个地址通常是0x27。但有时地址可能会改变0x37,0x24的…,让我们去寻找你的设备上的那一个。加载scanI2Caddress文件到ArduinoIDE并运行,通过右上角的串口监视可以看到地址,大多数Arduino电路板将显示0x27,但也有可能是其他的地址。#include<Wire.h>voidsetup(){Wire.begin();

Serial.begin(9600);Serial.println("\nI2CScanner");}

voidloop(){byteerror,address;intnDevices;

Serial.println("Scanning...");

nDevices=0;for(address=1;address<127;address++){Wire.beginTransmission(address);error=Wire.endTransmission();

if(error==0){Serial.print("I2Cdevicefoundataddress0x");if(address<16)Serial.print("0");Serial.print(address,HEX);Serial.println("!");

nDevices++;}

elseif(error==4){Serial.print("Unknowerrorataddress0x");if(address<16)Serial.print("0");Serial.println(address,HEX);}}if(nDevices==0)Serial.println("NoI2Cdevicesfound\n");elseSerial.println("done\n");

delay(5000);}3.3.4安装库文件使用I2C协议的LCD液晶显示,有一个特殊的库被下载并包含在程序里。这个库的名字是LiquidCrystalI2C。下载库ZIP文件,并解压安装在ArduinoIDE中。你可以从ArduinoIDE中安装ZIP文件,从菜单中选择“Sketch”→“includeLibrary”→“Add.ZIPlibrary”等菜单,操作如图3-16所示。拓展问题:如何删除已经安装的库文件?LiquidCrystal_I2C()//设置16个字符和2行显示的LCD地址init()//LCD的初始化clear()//清除显示,将光标位置设置为零行零列home()//将光标位置设置为零createChar()//使用自定义字符填充前8个CGRAM位置setCursor()//设置光标的位置cursor()//打开下划线光标noCursor()//关闭下划线光标blink()//打开闪烁的光标noBlink()//关闭闪烁的光标display()//打开显

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论