电气设备网站源码分享(电气网址)

大家好,感谢邀请,今天来为大家分享一下电气设备网站源码分享的问题,以及和电气网址的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

arduino学习笔记

arduino学习笔记1-什么是arduino?

要了解arduino就先要了解什么是单片机,arduino平台的基础就是AVR指令集的单片机。1、什么是单片机?它与个人计算机有什么不同?一台能够工作的计算机要有这样几个部份构成:中央处理单元CPU(进行运算、控制)、随机存储器RAM(数据存储)、存储器ROM(程序存储)、输入/输出设备I/O(串行口、并行输出口等)。在个人计算机(PC)上这些部份被分成若干块芯片,安装在一个被称之为主板的印刷线路板上。而在单片机中,这些部份全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如模拟量/数字量转换(A/D)和数字量/模拟量转换(D/A)等。2、单片机有什么用?实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用酷睿处理器吗?应用的关键是看是否够用,是否有很好的性能价格比。如果一台冰箱都需要用酷睿处理器来进行温度控制,那价格就是天价了。单片机通常用于工业生产的控制、生活中与程序和控制有关(如:电子琴、冰箱、智能空调等)的场合。下图就是一个Atmega328P-PU单片机,基于AVR指令集的8位处理器,频率20MHz,存储器空间32KB。

什么是Arduino?Arduino是一个能够用来感应和控制现实物理世界的一套工具。它由一个基于单片机并且开放源码的硬件平台,和一套为Arduino板编写程序的开发环境组成。Arduino可以用来开发交互产品,比如它可以读取大量的开关和传感器信号,并且可以控制各式各样的电灯、电机和其他物理设备。Arduino项目可以是单独的,也可以在运行时和你电脑中运行的程序(例如:Flash,Processing,MaxMSP)进行通讯。Arduino板你可以选择自己去手动组装或是购买已经组装好的;Arduino开源的IDE可以免费下载得到。Arduino的编程语言就像似在对一个类似于物理的计算平台进行相应的连线,它基于处理多媒体的编程环境。为什么要使用Arduino?有很多的单片机和单片机平台都适合用做交互式系统的设计。例如:ParallaxBasicStamp,Netmedia’sBX-24,Phidgets,MIT’sHandyboard和其它能提供类似功能的。所有这些工具,你都不需要去关心单片机编程繁琐的细节,提供给你的是一套容易使用的工具包。Arduino同样也简化了同单片机工作的流程,但同其它系统相比Arduino在很多地方更具有优越性,特别适合老师,学生和一些业余爱好者们使用:

便宜-和其它平台相比,Arduino板算是相当便宜了。最便宜的Arduino版本可以自己动手制作,即使是组装好的成品,其价格也不会超过200元。跨平台-Arduino软件可以运行在Windows,MacintoshOSX,和Linux操作系统。大部分其它的单片机系统都只能运行在Windows上。简易的编程环境-初学者很容易就能学会使用Arduino编程环境,同时它又能为高级用户提供足够多的高级应用。对于老师们来说,一般都能很方便的使用Processing编程环境,所以如果学生学习过使用Processing编程环境的话,那他们在使用Arduino开发环境的时候就会觉得很相似很熟悉。软件开源并可扩展-Arduino软件是开源的,对于有经验的程序员可以对其进行扩展。Arduino编程语言可以通过C++库进行扩展,如果有人想去了解技术上的细节,可以跳过Arduino语言而直接使用AVRC编程语言(因为Arduino语言实际上是基于AVRC的)。类似的,如果你需要的话,你也可以直接往你的Arduino程序中添加AVR-C代码。硬件开源并可扩展-Arduino板基于Atmel的ATMEGA8和ATMEGA168/328单片机。Arduino基于CreativeCommons许可协议,所以有经验的电路设计师能够根据需求设计自己的模块,可以对其扩展或改进。甚至是对于一些相对没有什么经验的用户,也可以通过制作试验板来理解Arduino是怎么工作的,省钱又省事。

Arduino基于AVR平台,对AVR库进行了二次编译封装,把端口都打包好了,寄存器啦、地址指针之类的基本不用管。大大降低了软件开发难度,适宜非专业爱好者使用。优点和缺点并存,因为是二次编译封装,代码不如直接使用AVR代码编写精练,代码执行效率与代码体积都弱于AVR直接编译。性能:DigitalI/O数字输入/输出端口0—13。AnalogI/O模拟输入/输出端口0-5。支持ICSP下载,支持TX/RX。输入电压:USB接口供电或者5V-12V外部电源供电。输出电压:支持3.3V级5VDC输出。处理器:使用AtmelAtmega168328处理器,因其支持者众多,已有公司开发出来32位的MCU平台支持arduino。目前arduino的控制板最新的为ArduinoUno,如下图:国内使用比较多的为ArduinoDuemilanove2009,主要原因是Uno的usb控制芯片封装方式改变,制造成本上升,其他变化不大,性价比还是ArduinoDuemilanove2009比较好。因其开源特性,生产arduino控制板的厂商众多,同样的Duemilanove2009就有很多种颜色。对于一些对电路板大小要求比较严格的地方,arduino团队提供了arduinoNano,此板体积做的非常小。如下图:arduino板子上基本端口如图描述,对几个比较特殊的端口下面详细说明下:VIN端口:VIN是inputvoltage的缩写,表示有外部电源时的输入端口。AREF:Referencevoltagefortheanaloginputs(模拟输入的基准电压)。使用analogReference()命令调用。ICSP:也有称为ISP(InSystemProgrammer),就是一种线上即时烧录,目前比较新的芯片都支持这种烧录模式,包括大家常听说的8051系列的芯片,也都慢慢采用这种简便的烧录方式。我们都知道传统的烧录方式,都是将被烧录的芯片,从线路板上拔起,有的焊死在线路板上的芯片,还得先把芯片焊接下来才能烧录。为了解决这种问题,发明了ICSP线上即时烧录方式。只需要准备一条R232线(连接烧录器),以及一条连接烧录器与烧录芯片针脚的连接线就可以。电源的+5V,GND,两条负责传输烧录信息的针脚,再加上一个烧录电压针脚,这样就可以烧录了。

arduino学习笔记2

通过Arduino编译器查看串口数据

最简单的例子:voidsetup(){Serial.begin(9600);//打开串口,设置波特率为9600bps}voidloop(){intval;val=analogRead(5);//传感器接到模拟口5,数值根据自己的需要可变Serial.println(val,DEC);//从串口发送字符串并换行delay(100);}如果电路安装正确,按照示例代码运行、上传,然后点击编译器的SerialMonitor按钮,就可以看到从代码定义的输入口(这儿是模拟口5)获取的数据了。

arduino学习笔记3arduino语言

Arduino语言是建立在C/C++基础上的,其实也就是基础的C语言,Arduino语言只不过把AVR单片机(微控制器)相关的一些参数设置都函数化,不用我们去了解他的底层,让我们不了解AVR单片机(微控制器)的朋友也能轻松上手。

在与ArduinoDIYER接触的这段时间里,发现有些朋友对Arduino语言还是比较难入手,那么这里我就简单的注释一下Arduino语言(本人也是半罐子水,有错的地方还请各位指正)。

/*************基础C语言*************/

关键字:

ifif…elseforswitchcasewhiledo…whilebreakcontinuereturngoto

语法符号:

;{}///**/

运算符:

=+-*/%==!=<><=>=&&||!+++=-=*=/=

数据类型:

boolean布尔类型charbyte字节类型intunsignedintlongunsignedlongfloatdoublestringarrayvoid

数据类型转换:

char()byte()int()long()float()

常量:

HIGH|LOW表示数字IO口的电平,HIGH表示高电平(1),LOW表示低电平(0)。INPUT|OUTPUT表示数字IO口的方向,INPUT表示输入(高阻态),OUTPUT表示输出(AVR能提供5V电压40mA电流)。true|falsetrue表示真(1),false表示假(0)。

/******************************************/

以上为基础c语言的关键字和符号,有c语言基础的都应该了解其含义,这里也不作过多的解释。

/*************Arduino语言*************/

结构

voidsetup()初始化变量,管脚模式,调用库函数等voidloop()连续执行函数内的语句

功能

数字I/O

pinMode(pin,mode)数字IO口输入输出模式定义函数,pin表示为0~13,mode表示为INPUT或OUTPUT。digitalWrite(pin,value)数字IO口输出电平定义函数,pin表示为0~13,value表示为HIGH或LOW。比如定义HIGH可以驱动LED。intdigitalRead(pin)数字IO口读输入电平函数,pin表示为0~13,value表示为HIGH或LOW。比如可以读数字传感器。

模拟I/O

intanalogRead(pin)模拟IO口读函数,pin表示为0~5(ArduinoDiecimila为0~5,Arduinonano为0~7)。比如可以读模拟传感器(10位AD,0~5V表示为0~1023)。analogWrite(pin,value)-PWM数字IO口PWM输出函数,Arduino数字IO口标注了PWM的IO口可使用该函数,pin表示3,5,6,9,10,11,value表示为0~255。比如可用于电机PWM调速或音乐播放。

扩展I/O

shiftOut(dataPin,clockPin,bitOrder,value)SPI外部IO扩展函数,通常使用带SPI接口的74HC595做8个IO扩展,dataPin为数据口,clockPin为时钟口,bitOrder为数据传输方向(MSBFIRST高位在前,LSBFIRST低位在前),value表示所要传送的数据(0~255),另外还需要一个IO口做74HC595的使能控制。unsignedlongpulseIn(pin,value)脉冲长度记录函数,返回时间参数(us),pin表示为0~13,value为HIGH或LOW。比如value为HIGH,那么当pin输入为高电平时,开始计时,当pin输入为低电平时,停止计时,然后返回该时间。

时间函数

unsignedlongmillis()返回时间函数(单位ms),该函数是指,当程序运行就开始计时并返回记录的参数,该参数溢出大概需要50天时间。delay(ms)延时函数(单位ms)。delayMicroseconds(us)延时函数(单位us)。

数学函数

min(x,y)求最小值max(x,y)求最大值abs(x)计算绝对值constrain(x,a,b)约束函数,下限a,上限b,x必须在ab之间才能返回。map(value,fromLow,fromHigh,toLow,toHigh)约束函数,value必须在fromLow与toLow之间和fromHigh与toHigh之间。pow(base,exponent)开方函数,base的exponent次方。sq(x)平方sqrt(x)开根号

三角函数

sin(rad)cos(rad)tan(rad)

随机数函数

randomSeed(seed)随机数端口定义函数,seed表示读模拟口analogRead(pin)函数。longrandom(max)随机数函数,返回数据大于等于0,小于max。longrandom(min,max)随机数函数,返回数据大于等于min,小于max。

外部中断函数

attachInterrupt(interrupt,,mode)外部中断只能用到数字IO口2和3,interrupt表示中断口初始0或1,表示一个功能函数,mode:LOW低电平中断,CHANGE有变化就中断,RISING上升沿中断,FALLING下降沿中断。detachInterrupt(interrupt)中断开关,interrupt=1开,interrupt=0关。

中断使能函数

interrupts()使能中断noInterrupts()禁止中断

串口收发函数

Serial.begin(speed)串口定义波特率函数,speed表示波特率,如9600,19200等。intSerial.available()判断缓冲器状态。intSerial.read()读串口并返回收到参数。Serial.flush()清空缓冲器。Serial.print(data)串口输出数据。Serial.println(data)串口输出数据并带回车符。

/**********************************/

/************Arduino语言库文件*************/

官方库文件

EEPROM-EEPROM读写程序库Ethernet-以太网控制器程序库LiquidCrystal-LCD控制程序库Servo-舵机控制程序库SoftwareSerial-任何数字IO口模拟串口程序库Stepper-步进电机控制程序库Wire-TWI/I2C总线程序库Matrix-LED矩阵控制程序库Sprite-LED矩阵图象处理控制程序库

非官方库文件

DateTime-alibraryforkeepingtrackofthecurrentdateandtimeinsoftware.Debounce-forreadingnoisydigitalinputs(e.g.frombuttons)Firmata-forcommunicatingwithapplicationsonthecomputerusingastandardserialprotocol.GLCD-graphicsroutinesforLCDbasedontheKS0108orequivalentchipset.LCD-controlLCDs(using8datalines)LCD4Bit-controlLCDs(using4datalines)LedControl-forcontrollingLEDmatricesorseven-segmentdisplayswithaMAX7221orMAX7219.LedControl-analternativetotheMatrixlibraryfordrivingmultipleLEDswithMaximchips.Messenger-forprocessingtext-basedmessagesfromthecomputerMetro-helpyoutimeactionsatregularintervalsMsTimer2-usesthetimer2interrupttotriggeranactioneveryNmilliseconds.OneWire-controldevices(fromDallasSemiconductor)thatusetheOneWireprotocol.PS2Keyboard-readcharactersfromaPS2keyboard.Servo-providessoftwaresupportforServomotorsonanypins.Servotimer1-provideshardwaresupportforServomotorsonpins9and10SimpleMessageSystem-sendmessagesbetweenArduinoandthecomputerSSerial2Mobile-sendtextmessagesoremailsusingacellphone(viaATcommandsoversoftwareserial)TextString-handlestringsTLC5940-16channel12bitPWMcontroller.X10-SendingX10signalsoverACpowerlines

/****************************************/

arduino学习笔记4数据类型

有多种类型的变量,如下所述

boolean布尔char字符byte字节int整数unsignedint无符号整数long长整数unsignedlong无符号长整数float浮点double双字节浮点string字符串array数组

arduino学习笔记5Arduuino复合运算符

+=,-=,*=,/=Description描述Performamathematicaloperationonavariablewithanotherconstantorvariable.The+=(etal)operatorsarejustaconvenientshorthandfortheexpandedsyntax,listedbelow.对一个变量和另一个参数或变量完成一个数学运算。+=(以及其他)可以缩短语法长度。

Syntax语法x+=y;//equivalenttotheexpressionx=x+y;//等价于x=x+y;x-=y;//equivalenttotheexpressionx=x-y;//等价于x=x-y;x*=y;//equivalenttotheexpressionx=x*y;//等价于x=x*y;x/=y;//equivalenttotheexpressionx=x/y;//等价于x=x/y;

Parameters参数x:anyvariabletypex:任何变量类型

y:anyvariabletypeorconstanty:任何变量类型或常数

Examples范例x=2;x+=4;//xnowcontains6//x现在为6x-=3;//xnowcontains3//x现在为3x*=10;//xnowcontains30//x现在为30x/=2;//xnowcontains15//x现在为15

Syntax语法x++;//incrementxbyoneandreturnstheoldvalueofx//将x的值加1并返回原来的x的值。++x;//incrementxbyoneandreturnsthenewvalueofx//将x的值加1并返回现在的x的值。x–;//decrementxbyoneandreturnstheoldvalueofx//将x的值减1并返回原来的x的值。–x;//decrementxbyoneandreturnsthenewvalueofx//将x的值减1并返回现在的x的值。

Parameters参数x:anintegerorlong(possiblyunsigned)x:一个整数或长整数(可以无符号)

Returns返回Theoriginalornewlyincremented/decrementedvalueofthevariable.返回变量原始值或增加/消耗后的新值。

Examples范例x=2;y=++x;//xnowcontains3,ycontains3//x现在为3,y为3y=x–;//xcontains2again,ystillcontains3//x现在仍然为2,y将为3

arduino学习笔记6Arduino基础

在学语言之间,还要做的一个功课就是要明白程序的构架,这个也同样简单,大体可分为几个部分。

1、声明变量及接口名称(intval;intledPin=13;)。

2、setup()——函数在程序开始时使用,可以初始化变量、接口模式、启用库等(例如:pinMode(ledPin,OUTUPT);)。

3、loop()——在setup()函数之后,即初始化之后,loop()让你的程序循环地被执行。使用它来运转Arduino。

接下来就开始学习一下几个基本函数。

1、pinMode(接口名称,OUTPUT或INPUT)将——接口定义为输入或输出接口,用在setup()函数里。

2、digitalWrite(接口名称,HIGH或LOW)——将数字接口值至高或低。

3、digitalRead(接口名称)——读出数字接口的值。

4、analogWrite(接口名称,数值)——给一个接口写入模拟值(PWM波)。对于ATmega168芯片的Arduino(包括Mini或BT),该函数可以工作于3,5,6,9,10和11号接口。老的ATmega8芯片的USB和serialArduino仅仅支持9,10和11号接口。

5、analogRead(接口名称)——从指定的模拟接口读取值,Arduino对该模拟值进行10-bit的数字转换,这个方法将输入的0-5电压值转换为0到1023间的整数值。

6、delay()——延时一段时间,delay(1000)为一秒。

7、Serial.begin(波特率)——设置串行每秒传输数据的速率(波特率)。在同计算机通讯时,使用下面这些值:300,1200,2400,4800,9600,14400,19200,28800,38400,57600或115200。你也可以在任何时候使用其它的值,比如,与0号或1号插口通信就要求特殊的波特率。用在setup()函数里

8、Serial.read()——读取持续输入的数据。

9、Serial.print(数据,数据的进制)——从串行端口输出数据。Serial.print(数据)默认为十进制等于Serial.print(数据,DEC)。

10、Serial.println(数据,数据的进制)——从串行端口输出数据,跟随一个回车和一个换行符。这个函数所取得的值与Serial.print()一样。

以上几个函数是常用基本函数,还有很多以后会慢慢学习

arduino学习笔记7函数

输入输出函数

Arduino内含了一些处理输出与输入的切换功能,相信已经从书中程式范例略知一二。

pinMode(pin,mode)

将数位脚位(digitalpin)指定为输入或输出。

范例:

pinMode(7,INPUT);//将脚位7设定为输入模式

digitalWrite(pin,value)

将数位脚位指定为开或关。脚位必须先透过pinMode明示为输入或输出模式digitalWrite才能生效。

范例:

digitalWrite(8,HIGH);//将脚位8设定输出高电位

intdigitalRead(pin)

将输入脚位的值读出,当感测到脚位处于高电位时时回传HIGH,否则回传LOW。

范例:

val=digitalRead(7);//读出脚位7的值并指定给val

intanalogRead(pin)

读出类比脚位的电压并回传一个0到1023的数值表示相对应的0到5的电压值。

范例:

val=analogRead(0);//读出类比脚位0的值并指定给val变数

analogWrite(pin,value)

改变PWM脚位的输出电压值,脚位通常会在3、5、6、9、10与11。Value变数范围0-255,例如:输出电压2.5伏特(V),该值大约是128。

范例:

analogWrite(9,128);//输出电压约2.5伏特(V)

unsignedlongpulseIn(pin,value)

设定读取脚位状态的持续时间,例如使用红外线、加速度感测器测得某一项数值时,在时间单位内不会改变状态。

范例:

time=pulsein(7,HIGH);//设定脚位7的状态在时间单位内保持为HIGH

shiftOut(dataPin,clockPin,bitOrder,value)

把资料传给用来延伸数位输出的暂存器,函式使用一个脚位表示资料、一个脚位表示时脉。bitOrder用来表示位元间移动的方式(LSBFIRST最低有效位元或是MSBFIRST最高有效位元),最后value会以byte形式输出。此函式通常使用在延伸数位的输出。

范例:

shiftOut(dataPin,clockPin,LSBFIRST,255);

时间函数

控制与计算晶片执行期间的时间

unsignedlongmillis()

回传晶片开始执行到目前的毫秒

范例:

duration=millis()-lastTime;//表示自&34;至当下的时间

delay(ms)

暂停晶片执行多少毫秒

范例:

delay(500);//暂停半秒(500毫秒)

delayMicroseconds(us)

暂停晶片执行多少微秒

范例:

delayMicroseconds(1000);//暂停1豪秒

数学函式

三角函数以及基本的数学运算

min(x,y)

回传两数之间较小者

范例:

val=min(10,20);//回传10

max(x,y)

回传两数之间较大者

范例:

val=max(10,20);//回传20

abs(x)

回传该数的绝对值,可以将负数转正数。

范例:

val=abs(-5);//回传5

constrain(x,a,b)

判断x变数位于a与b之间的状态。x若小于a回传a;介于a与b之间回传x本身;大于b回传b

范例:

val=constrain(analogRead(0),0,255);//忽略大于255的数

map(value,fromLow,fromHigh,toLow,toHigh)

将value变数依照fromLow与fromHigh范围,对等转换至toLow与toHigh范围。时常使用于读取类比讯号,转换至程式所需要的范围值。

例如:

val=map(analogRead(0),0,1023,100,200);//将analog0所读取到的讯号对等转换至100–200之间的数值。

doublepow(base,exponent)

回传一个数(base)的指数(exponent)值。

范例:

doublex=pow(y,32);//设定x为y的32次方

doublesqrt(x)

回传double型态的取平方根值。

范例:

doublea=sqrt(1138);//回传1138平方根的近似值33.73425674438

doublesin(rad)

回传角度(radians)的三角函数sine值。

范例:

doublesine=sin(2);//近似值0.90929737091

doublecos(rad)

回传角度(radians)的三角函数cosine值。

范例:

doublecosine=cos(2);//近似值-0.41614685058

doubletan(rad)

回传角度(radians)的三角函数tangent值。

范例:

doubletangent=tan(2);//近似值-2.18503975868

乱数函式

产生乱数

randomSeed(seed)

事实上在Arduino里的乱数是可以被预知的。所以如果需要一个真正的乱数,可以呼叫此函式重新设定产生乱数种子。你可以使用乱数当作乱数的种子,以确保数字以随机的方式出现,通常会使用类比输入当作乱数种子,藉此可以产生与环境有关的乱数(例如:无线电波、宇宙雷射线、电话和萤光灯发出的电磁波等)。

范例:

randomSeed(analogRead(5));//使用类比输入当作乱数种子

longrandom(max)

longrandom(min,max)

回传指定区间的乱数,型态为long。如果没有指定最小值,预设为0。

范例:

longrandnum=random(0,100);//回传0–99之间的数字

longrandnum=random(11);//回传0-10之间的数字

序列通讯

你可以在第五章看见一些使用序列埠与电脑交换讯息的范例,以下是函式解释。

Serial.begin(speed)

你可以指定Arduino从电脑交换讯息的速率,通常我们使用9600bps。当然也可以使用其他的速度,但是通常不会超过115,200bps(每秒位元组)。

范例:

Serial.begin(9600);

Serial.print(data)

Serial.print(data,encoding)

经序列埠传送资料,提供编码方式的选项。如果没有指定,预设以一般文字传送。

范例:

Serial.print(75);//列印出&34;

Serial.print(75,DEC);//列印出&34;

Serial.print(75,HEX);//&34;(75的十六进位)

Serial.print(75,OCT);//&34;(75in的八进位)

Serial.print(75,BIN);//&34;(75的二进位)

Serial.print(75,BYTE);//&34;(以byte进行传送,显示以ASCII编码方式)

Serial.println(data)

Serial.println(data,encoding)

与Serial.print()相同,但会在资料尾端加上换行字元()。意思如同你在键盘上打了一些资料后按下Enter。

范例:

Serial.println(75);//列印出&34;

Serial.println(75,DEC);//列印出&34;

Serial.println(75,HEX);//&34;

Serial.println(75,OCT);//&34;

Serial.println(75,BIN);//&34;

Serial.println(75,BYTE);//&34;

intSerial.available()

回传有多少位元组(bytes)的资料尚未被read()函式读取,如果回传值是0代表所有序列埠上资料都已经被read()函式读取。

范例:

intcount=Serial.available();

intSerial.read()

读取1byte的序列资料

范例:

intdata=Serial.read();

Serial.flush()

有时候因为资料速度太快,超过程式处理资料的速度,你可以使用此函式清除缓冲区内的资料。经过此函式可以确保缓冲区(buffer)内的资料都是最新的。

范例:

Serial.flush();

arduino学习笔记8数字输入

在数字电路中开关(switch)是一种基本的输入形式,它的作用是保持电路的连接或者断开。Arduino从数字I/O管脚上只能读出高电平(5V)或者低电平(0V),因此我们首先面临到的一个问题就是如何将开关的开/断状态转变成Arduino能够读取的高/低电平。解决的办法是通过上/下拉电阻,按照电路的不同通常又可以分为正逻辑(PositiveLogic)和负逻辑(InvertedLogic)两种。

在正逻辑电路中,开关一端接电源,另一端则通过一个10K的下拉电阻接地,输入信号从开关和电阻间引出。当开关断开的时候,输入信号被电阻“拉”向地,形成低电平(0V);当开关接通的时候,输入信号直接与电源相连,形成高电平。对于经常用到的按压式开关来讲,就是按下为高,抬起为低。

在负逻辑电路中,开关一端接地,另一端则通过一个10K的上拉电阻接电源,输入信号同样也是从开关和电阻间引出。当开关断开时,输入信号被电阻“拉”向电源,形成高电平(5V);当开关接通的时候,输入信号直接与地相连,形成低电平。对于经常用到的按压式开关来讲,就是按下为低,抬起为高。

为了验证Arduino数字I/O的输入功能,我们可以将开关接在Arduino的任意一个数字I/O管脚上(13除外),并通过读取它的接通或者断开状态,来控制其它数字I/O管脚的高低。本实验采用的原理图如下所示,其中开关接在数字I/O的7号管脚上,被控的发光二极管接在数字I/O的13号管脚上:

相应的代码为:

intledPin=13;intswitchPin=7;intvalue=0;voidsetup(){pinMode(ledPin,OUTPUT);pinMode(switchPin,INPUT);}voidloop(){value=digitalRead(switchPin);if(HIGH==value){//turnLEDoffdigitalWrite(ledPin,LOW);}else{//turnLEDondigitalWrite(ledPin,HIGH);}}

由于采用的是负逻辑电路,开关按下时用digitalRead()函数读取到的值为LOW,此时再用digitalWrite()函数将发光二极管所在的管脚置为高,点亮发光二极管。同理,当开关抬起时,发光二极管将被熄灭,这样我们就实现了用开关来控制发光二极管的功能。

arduino学习笔记9Arduino的数字输出

Arduino的数字I/O被分成两个部分,其中每个部分都包含有6个可用的I/O管脚,即管脚2到管脚7和管脚8到管脚13。除了管脚13上接了一个1K的电阻之外,其他各个管脚都直接连接到ATmega上。我们可以利用一个6位的数字跑马灯,来对Arduino数字I/O的输出功能进行验证,以下是相应的原理图:

电路中在每个I/O管脚上加的那个1K电阻被称为限流电阻,由于发光二极管在电路中没有等效电阻值,使用限流电阻可以使元件上通过的电流不至于过大,能够起到保护的作用。

该工程对应的代码为:

intBASE=2;intNUM=6;intindex=0;voidsetup(){for(inti=BASE;i<BASE+NUM;i++){pinMode(i,OUTPUT);}}voidloop(){for(inti=BASE;i<BASE+NUM;i++){digitalWrite(i,LOW);}digitalWrite(BASE+index,HIGH);index=(index+1)%NUM;delay(100);}下载并运行该工程,连接在Arduino数字I/O管脚2到管脚7上的发光二极管会依次点亮0.1秒,然后再熄灭:

这个实验可以用来验证数字I/O输出的正确性。Arduino上一共有十二个数字I/O管脚,我们可以用同样的办法验证其他六个管脚的正确性,而这只需要对上述工程的第一行做相应的修改就可以了:

intBASE=8;

arduino学习笔记10Arduino的串口输入

串行通信是在实现在PC机与微控制器进行交互的最简单的办法。之前的PC机上一般都配有标准的RS-232或者RS-422接口来实现串行通信,但现在这种情况已经发生了一些改变,大家更倾向于使用USB这样一种更快速但同时也更加复杂的方式来实现串行通信。尽管在有些计算机上现在已经找不到RS-232或者RS-422接口了,但我们仍可以通过USB/串口或者PCMCIA/串口这样的转换器,在这些设备上得到传统的串口。

通过串口连接的Arduino在交互式设计中能够为PC机提供一种全新的交互方式,比如用PC机控制一些之前看来非常复杂的事情,像声音和视频等。很多场合中都要求Arduino能够通过串口接收来自于PC机的命令,并完成相应的功能,这可以通过Arduino语言中提供的Serial.read()函数来实现。

在这一实验中我们同样不需要任何额外的电路,而只需要用串口线将Arduino和PC机连起来就可以了,相应的Arduino工程代码为:

intledPin=13;intval;voidsetup(){pinMode(ledPin,OUTPUT);Serial.begin(9600);}voidloop(){val=Serial.read();if(-1!=val){if(&39;==val){digitalWrite(ledPin,HIGH);delay(500);digitalWrite(ledPin,LOW);}}}

把工程下载到Arduino模块中之后,在Arduino集成开发环境中打开串口监视器并将波特率设置为9600,然后向Arduino模块发送字符H,如下图所示:

该工程运行起来之后会不断调用Serial.read()函数从串口获得数据。Arduino语言提供的这个函数是不阻塞的,也就是说不论串口上是否真的有数据到达,该函数都会立即返回。Serial.read()函数每次只读取一个字节的数据,当串口上有数据到达的时候,该函数的返回值为到达的数据中第一个字符的ASCII码;当串口上没有数据到达的时候,该函数的返回值则为-1。

Arduino语言的参考手册中没有对Serial.read()函数做过多的说明,我的一个疑问是如果PC机一次发送的数据太多,Arduino是否提供相应的串口缓存功能来保证数据不会丢失?Arduino语言中提供的另外一个函数Serial.available()或许能够帮助我们用实验来进行验证:

intledPin=13;intval;voidsetup(){pinMode(ledPin,OUTPUT);Serial.begin(9600);}voidloop(){val=Serial.read();if(-1!=val){if(&39;==val){digitalWrite(ledPin,HIGH);delay(500);digitalWrite(ledPin,LOW);Serial.print(&34;);Serial.println(Serial.available(),DEC);}}}

函数Serial.available()的功能是返回串口缓冲区中当前剩余的字符个数,按照Arduino提供的该函数的说明,串口缓冲区中最多能缓冲128个字节。我们可以一次给Arduino模块发送多个字符,来验证这一功能:

在这一实验中,每当Arduino成功收到一个字符H,连接在数字I/O端口管脚13上的发光二极管就会闪烁一次:

arduino学习笔记11Arduino的串口输出

在许多实际应用场合中我们会要求在Arduino和其它设备之间实现相互通信,而最常见通常也是最简单的办法就是使用串行通信。在串行通信中,两个设备之间一个接一个地来回发送数字脉冲,它们之间必须严格遵循相应的协议以保证通信的正确性。

在PC机上上最常见的串行通信协议是RS-232串行协议,而在各种微控制器(单片机)上采用的则是TTL串行协议。由于这两者的电平有很大的不同,因此在实现PC机和微控制器的通信时,必须进行相应的转换。完成RS-232电平和TTL电平之间的转换一般采用专用芯片,如MAX232等,但在Arduino上是用相应的电平转换电路来完成的。

根据Arduino的原理图我们不难看出,ATmega的RX和TX引脚一方面直接接到了数字I/O端口的0号和1号管脚,另一方面又通过电平转换电路接到了串口的母头上。因此,当我们需要用Arduino与PC机通信时,可以用串口线将两者连接起来;当我们需要用Arduino与微控制器(如另一块Arduino)通信时,则可以用数字I/O端口的0号和1号管脚。

串行通信的难点在于参数的设置,如波特率、数据位、停止位等,在Arduino语言可以使用Serial.begin()函数来简化这一任务。为了实现数据的发送,Arduino则提供了Serial.print()和Serial.println()两个函数,它们的区别在于后者会在请求发送的数据后面加上换行符,以提高输出结果的可读性。

在这一实验中没有用到额外的电路,我们只需要用串口线将Arduino和PC机连起来就可以了,相应的代码为:

voidsetup(){Serial.begin(9600);}voidloop(){Serial.println(&34;);delay(1000);}

在将工程下载到Arduino模块中之后,在Arduino集成开发环境的工具栏中单击“SerialMonitor”控制,打开串口监视器:

接着将波特率设置为9600,即保持与工程中的设置相一致:

如果一切正常,此时我们就可以在Arduino集成开发环境的Console窗口中看到串口上输出的数据了:

为了检查串口上是否有数据发送,一个比较简单的办法是在数字I/O端口的1号管脚(TX)和5V电源之间接一个发光二极管,如下面的原理图所示:

这样一旦Arduino在通过串口向PC机发送数据时,相应的发光二极管就会闪烁,实际应用中这是一个非常方便的调试手段;-)

arduino学习笔记12PWM(脉冲宽度调制)

PulseWidthModulation,orPWM,isatechniqueforgettinganalogresultswithdigitalmeans.Digitalcontrolisusedtocreateasquarewave,asignalswitchedbetweenonandoff.Thison-offpatterncansimulatevoltagesinbetweenfullon(5Volts)andoff(0Volts)bychangingtheportionofthetimethesignalspendsonversusthetimethatthesignalspendsoff.Thedurationof&34;iscalledthepulsewidth.Togetvaryinganalogvalues,youchange,ormodulate,thatpulsewidth.Ifyourepeatthison-offpatternfastenoughwithanLEDforexample,theresultisasifthesignalisasteadyvoltagebetween0and5vcontrollingthebrightnessoftheLED.

脉冲宽度调制或PWM,是通过数字均值获得模拟结果的技术。数字控制被用来创建一个方波,信号在开和关之间切换。这种开关模式通过改变“开”时间段和“关”时间段的比值完全模拟从开(5伏特)和关(0伏特)之间的电压。“开时间“的周期称为脉冲宽度。为了得到不同的模拟值,你可以更改,或调节脉冲宽度。如果你重复这种开关模式速度足够快,其结果是一个介于0和5V之间的稳定电压用以控制LED的亮度。

Inthegraphicbelow,thegreenlinesrepresentaregulartimeperiod.ThisdurationorperiodistheinverseofthePWMfrequency.Inotherwords,withArduino&34;intledpin=5&34;单联共阳数码管,下面是其引脚图。

查看其背后,四个角分别有2个原点和5,10两个标记。分别表示了1,6,5,10针脚。数码管和发光二极管一样,需要添加限流电阻,因为网上没有查到资料说明该数码管的击穿电压是多大。所以供给电源电压宁可小不可大,所以选择220Ω限流电阻,和3.3V供电。线路连接图如下

把下面的代码编译后下载到控制板上,看看效果~

//设置控制各段的数字IO脚,具体几号引脚对应哪一段,来源为数码管官方引脚图。inta=7;intb=6;intc=5;intd=11;inte=10;intf=8;intg=9;intdp=4;//显示数字1voiddigital_1(void){unsignedcharj;digitalWrite(c,LOW);//给数字5引脚低电平,点亮c段digitalWrite(b,LOW);//点亮b段for(j=7;j<=11;j++)//熄灭其余段digitalWrite(j,HIGH);digitalWrite(dp,HIGH);//熄灭小数点DP段}//显示数字2voiddigital_2(void){unsignedcharj;digitalWrite(b,LOW);digitalWrite(a,LOW);for(j=9;j<=11;j++)digitalWrite(j,LOW);digitalWrite(dp,HIGH);digitalWrite(c,HIGH);digitalWrite(f,HIGH);}//显示数字3voiddigital_3(void){unsignedcharj;digitalWrite(g,LOW);digitalWrite(d,LOW);for(j=5;j<=7;j++)digitalWrite(j,LOW);digitalWrite(dp,HIGH);digitalWrite(f,HIGH);digitalWrite(e,HIGH);}//显示数字4voiddigital_4(void){digitalWrite(c,LOW);digitalWrite(b,LOW);digitalWrite(f,LOW);digitalWrite(g,LOW);digitalWrite(dp,HIGH);digitalWrite(a,HIGH);digitalWrite(e,HIGH);digitalWrite(d,HIGH);}//显示数字5voiddigital_5(void){unsignedcharj;for(j=7;j<=9;j++)digitalWrite(j,LOW);digitalWrite(c,LOW);digitalWrite(d,LOW);digitalWrite(dp,HIGH);digitalWrite(b,HIGH);digitalWrite(e,HIGH);}//显示数字6voiddigital_6(void){unsignedcharj;for(j=7;j<=11;j++)digitalWrite(j,LOW);digitalWrite(c,LOW);digitalWrite(dp,HIGH);digitalWrite(b,HIGH);}//显示数字7voiddigital_7(void){unsignedcharj;for(j=5;j<=7;j++)digitalWrite(j,LOW);digitalWrite(dp,HIGH);for(j=8;j<=11;j++)digitalWrite(j,HIGH);}//显示数字8voiddigital_8(void){unsignedcharj;for(j=5;j<=11;j++)digitalWrite(j,LOW);digitalWrite(dp,HIGH);}voidsetup(){inti;//定义变量for(i=4;i<=11;i++)pinMode(i,OUTPUT);//设置4~11引脚为输出模式}voidloop(){while(1){digital_1();//数字1delay(2000);//延时2sdigital_2();delay(2000);digital_3();delay(2000);digital_4();delay(2000);digital_5();delay(2000);digital_6();delay(2000);digital_7();delay(2000);digital_8();delay(2000);}}

复制代码

本次试验的效果为数码管1,2,3,4,5,6,7,8这样子循环显示。http://player.youku.com/player.php/sid/XMjgzNzQ4Mzk2/v.swf

arduino学习笔记19按键实验

按键是一种常用的控制电器元件,常用来接通或断开电路,从而达到控制电机或者其他设备运行的开关。按键的外观多种多样,本次实验使用的是这种微型按键,6mm的,如下图。

此种按键有4个脚,从背面看是这样子的。

在按键没有按下去的时候1,2号脚相连,3,4号脚相连。按键按下去的时候,1,2,3,4号脚就全部接通。本次实验使用按键来控制led的亮或者灭。一般情况是直接把按键开关串联在led的电路中来开关,这种应用情况比较单一。这次实验通过间接的方法来控制,按键接通后判断按键电路中的输出电压,如果电压大于4.88V,就使给LED电路输出高电平,反之就输出低电平。使用逻辑判断的方法来控制LED亮或者灭,此种控制方法应用范围较广。本次连接方法如下图。按键开关两段一端连接5V接口,一端连接模拟5号口。LED长针脚串联220Ω电阻连接数字7号口,短针脚连接GND。

把下面的代码上传到arduino控制板上,看看效果。

intkey=7;//设置LED的数字IO脚voidsetup(){pinMode(key,OUTPUT);//设置数字IO引脚为输出模式}voidloop(){inti;//定义变量while(1){i=analogRead(5);//读取模拟5口电压值if(i>1000)//如果电压值大于1000(即4.88V)digitalWrite(key,HIGH);//设置第七引脚为高电平,点亮led灯elsedigitalWrite(key,LOW);//设置第七引脚为低电平,熄灭led灯}}

复制代码

本次实验的效果如下http://player.youku.com/player.php/sid/XMjgzNDMwNzcy/v.swf本次实验使用到analogRead()这个新命令。analogRead()作用是读取模拟口的数值。默认是把0-5V的输入电压分成1024份,每一份大约为0.049V,其数值在0-1023之间。在本次程序代码中的读取数值如果大于512则给LED输出高电平,所对应的电压也就为大于2.5V。analogRead()命令输入的范围与分辨率可以使用analogReference()命令进行改动。刚开始本实验选用的判断标准是512,也就是2.5V。但是有网友按照教程的方法进行试验发现有问题,有时不需要按按钮灯就会自己亮。根据多次试验与分析后,确定其为各种干扰所致。比如感应电流等等不少都是大于2.5V的,所以为了提高准确度,只能提高判断的电压,本次实验就是提高到1000(4.88V)。人体自身也带电,早中晚还个不一样。下面的实验就是把模拟5号口判断标准定位512,用手去触摸模拟5号口导线就可以点亮LED。http://player.youku.com/player.php/sid/XMjgzNDMwODk2/v.swf

arduino学习笔记20PWM控制LED实验PWM讲解

本次实验通过PWM来控制一盏LED灯,让它慢慢变亮再慢慢变暗,如此循环。下面是接线图:

/*本次实验演示如何通过analogWrite()命令使连接9号端口的LED灯亮度逐渐变化*/intbrightness=0;//定义整数型变量brightness与其初始值,此变量用来表示LED的亮度。intfadeAmount=5;//定义整数型变量fadeAmount,此变量用来做亮度变化的增减量。voidsetup(){pinMode(9,OUTPUT);//设置9号口为输出端口:}voidloop(){analogWrite(9,brightness);//把brightness的值写入9号端口brightness=brightness+fadeAmount;//改变brightness值,使亮度在下一次循环发生改变if(brightness==0||brightness==255){fadeAmount=-fadeAmount;//在亮度最高与最低时进行翻转}delay(30);//延时30毫秒}

复制代码

本次实验效果如下:http://player.youku.com/player.php/sid/XMjgzNTI5MDI4/v.swf

analogWrite()其作用是给端口写入一个模拟值(PWM波)。可以用来控制LED灯的亮度变化,或者以不同的速度驱动马达。当执行analogWrite()命令后,端口会输出一个稳定的占空比的方波。除非有下一个命令来改变它。PWM信号的频率大约为490Hz.在使用ATmega168与ATmega328的arduino控制板上,其工作在3,5,6,9,10,11端口。ArduinoMega控制板,可以工作于2-13号端口。在更古老的基于ATmega8的arduino控制板上,analogWrite()命令只能工作于9,10,11号端口。在使用analogWrite()命令前,可以不使用pinMode()命令把端口定义为输出端口,当然如果定义了更好,这样利于程序语言规范。语法analogWrite(pin,value)参数pin:写入的端口value:占空比:在0-255之间。注释与已知问题当PWM输出与5,6号端口的时候,会产生比预期更高的占空比。原因是PWM输出所使用的内部时钟,millis()与delay()两函数也在使用。所以要注意使用5,6号端口时,空占比要设置的稍微低一些,或者会产生5,6号端口无法输出完全关闭的信号。PWM(Pulse-widthmodulation)脉宽调制PWM是使用数字手段来控制模拟输出的一种手段。使用数字控制产生占空比不同的方波(一个不停在开与关之间切换的信号)来控制模拟输出。额~~这个说的太专业了,还是说的通俗点。以本次实验来看,端口的输入电压只有两个0V与5V。如我我想要3V的输出电压怎么办。。。有同学说串联电阻,对滴,这个方法是正确滴。但是如果我想1V,3V,3.5V等等之间来回变动怎么办呢?不可能不停地切换电阻吧。这种情况下。。。就需要使用PWM了。他是怎么控制的呢,对于arduino的数字端口电压输出只有LOW与HIGH两个开关,对应的就是0V与5V的电压输出,咱本把LOW定义为0,HIGH定义为1.一秒内让arduino输出500个0或者1的信号。如果这500个全部为1,那就是完整的5V,如果全部为0,那就是0V。如果010101010101这样输出,刚好一半一半,输出端口就感觉是2.5V的电压输出了。这个和咱们放映电影是一个道理,咱们所看的电影并不是完全连续的,它其实是每秒输出25张图片,在这种情况下人的肉眼是分辨不出来的,看上去就是连续的了。PWM也是同样的道理,如果想要不同的电压,就控制0与1的输出比例控制就ok~当然。。。这和真实的连续输出还是有差别的,单位时间内输出的0,1信号越多,控制的就越精确。在下图中,绿线之间代表一个周期,其值也是PWM频率的倒数。换句话说,如果arduinoPWM的频率是500Hz,那么两绿线之间的周期就是2毫秒。analogWrite()命令中可以操控的范围为0-255,analogWrite(255)表示100%占空比(常开),analogWrite(127)占空比大约为50%(一半的时间)。

传统方法实现PWM除了使用analogWrite()命令实现PWM,还可以通过传统方法来控制电平的开关时间来设置。请看如下代码

voidsetup(){pinMode(13,OUTPUT);//设定13号端口为输出}voidloop(){digitalWrite(13,HIGH);delayMicroseconds(100);//大约10%占空比的1KHz方波digitalWrite(13,LOW);delayMicroseconds(900);}

复制代码

这种方法的的优点是他可以使用任意数字端口做输出端口。而且可以自己随意设定占空比与频率。一个主要的缺点是任何中断都会影响时钟,这样就会导致很大的抖动,除非你禁用中断。第二个却就是CPU在处理输出的时候,就无法做其他事情了。上面的代码用到了一个新的命令delayMicroseconds()其作用是产生一个延时,计量单位是微秒,1000微秒=1毫秒。目前delayMicroseconds()最大值为16383。如果值大于1000,推荐使用delay()命令。

arduino学习笔记21数字骰子实验

前几次做了数码管实验和按键控制LED的实验,通过实验大家已经学会了两种器件的基本用法。这次使用数码管与按键进行组合,做一个简易数字骰子。数字筛子的基本原理是数码管快速在1-8之间循环跳动,当按下按键时,数码管定格在当前的数字上,不再跳动。先看一下接线图

//设置控制各段的数字IO脚inta=7;intb=6;intc=5;intd=11;inte=10;intf=8;intg=9;intdp=4;//显示数字1voiddigital_1(void){unsignedcharj;digitalWrite(c,LOW);//给数字5引脚低电平,点亮c段digitalWrite(b,LOW);//点亮b段for(j=7;j<=11;j++)//熄灭其余段digitalWrite(j,HIGH);digitalWrite(dp,HIGH);//熄灭小数点DP段}//显示数字2voiddigital_2(void){unsignedcharj;digitalWrite(b,LOW);digitalWrite(a,LOW);for(j=9;j<=11;j++)digitalWrite(j,LOW);digitalWrite(dp,HIGH);digitalWrite(c,HIGH);digitalWrite(f,HIGH);}//显示数字3voiddigital_3(void){unsignedcharj;digitalWrite(g,LOW);digitalWrite(d,LOW);for(j=5;j<=7;j++)digitalWrite(j,LOW);digitalWrite(dp,HIGH);digitalWrite(f,HIGH);digitalWrite(e,HIGH);}//显示数字4voiddigital_4(void){digitalWrite(c,LOW);digitalWrite(b,LOW);digitalWrite(f,LOW);digitalWrite(g,LOW);digitalWrite(dp,HIGH);digitalWrite(a,HIGH);digitalWrite(e,HIGH);digitalWrite(d,HIGH);}//显示数字5voiddigital_5(void){unsignedcharj;for(j=7;j<=9;j++)digitalWrite(j,LOW);digitalWrite(c,LOW);digitalWrite(d,LOW);digitalWrite(dp,HIGH);digitalWrite(b,HIGH);digitalWrite(e,HIGH);}//显示数字6voiddigital_6(void){unsignedcharj;for(j=7;j<=11;j++)digitalWrite(j,LOW);digitalWrite(c,LOW);digitalWrite(dp,HIGH);digitalWrite(b,HIGH);}//显示数字7voiddigital_7(void){unsignedcharj;for(j=5;j<=7;j++)digitalWrite(j,LOW);digitalWrite(dp,HIGH);for(j=8;j<=11;j++)digitalWrite(j,HIGH);}//显示数字8voiddigital_8(void){unsignedcharj;for(j=5;j<=11;j++)digitalWrite(j,LOW);digitalWrite(dp,HIGH);}voidsetup(){inti;for(i=4;i<=11;i++){pinMode(i,OUTPUT);//设置4~11口为输出模式}}voidloop(){while(1){digital_1();//显示数字1while(analogRead(0)>1000);//如果读到模拟0口的值1000则说明有按键按下delay(100);//延时200msdigital_2();while(analogRead(0)>1000);delay(100);digital_3();while(analogRead(0)>1000);delay(100);digital_4();while(analogRead(0)>1000);delay(100);digital_5();while(analogRead(0)>1000);delay(100);digital_6();while(analogRead(0)>1000);delay(100);digital_7();while(analogRead(0)>1000);delay(100);digital_8();while(analogRead(0)>1000);delay(100);}}

复制代码

实验的效果如下http://player.youku.com/player.php/sid/XMjg1MDE1MjA4/v.swf

arduino学习笔记22光控LED实验

光敏电阻又称光导管,常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。这些制作材料具有在特定波长的光照下,其阻值迅速减小的特性。这是由于光照产生的载流子都参与导电,在外加电场的作用下漂移运动,从而使光敏电阻的阻值迅速下降。光敏电阻的工作原理基于内光电效应。在半导体光敏材料的两端装上电极引线,将其封装在带有透明窗的管壳里就构成光敏电阻,为了增加灵敏度,两电极常做成梳状。在有光照射时,射入的光强,电阻减小,射入的光弱,电阻增大。下图就是一个光敏电阻

本次实验设计的效果是,当光照正常的时候led灯是灭的,当周围变暗时led灯变亮。因为光敏电阻受不同光照影响变化很大,所以本次实验的参数是在60W三基色节能灯照射下实验(无日光照射),同样亮度的日光下光敏电阻的阻值会比日光灯下低不少,估计和不同光的波段有关系。不同环境下实验使用的参数不同,大家根据原理进行调整。实验前先测量一下当前环境下光敏电阻的亮阻值与暗阻值下图是测出来的LED亮阻值,为9.1KΩ

下图是测出来的LED暗阻值,为32.4KΩ

硬件连接图如下

根据测出来的亮阻9.1KΩ,暗阻32.4欧姆。选定分压电阻为10KΩ。因为当有遮挡物的后,阻值会变大。假设亮阻为10KΩ(对于光敏电阻来说,与测量出来的9.1KΩ差别不大,计算起来更加方便了),分压阻值为10K欧姆。模拟2号口所测量的触发电压为10KΩ分压电阻的,在5V电源供电下,亮与暗转换的触发电压为5×10÷(10+10)=2.5V。当光线越暗,光敏电阻的阻值也就越大,分压两端电压也就越小。所以触发条件就为≤2.5V。(

不同光照条件下触发电压不同,请根据实验环境进行调整。)程序代码如下

intphotocellPin=2;//定义变量photocellsh=2,为电压读取端口。intledPin=12;//定义变量ledPin=12,为led电平输出端口intval=0;//定义val变量的起始值voidsetup(){pinMode(ledPin,OUTPUT);//使ledPin为输出模式}voidloop(){val=analogRead(photocellPin);//从传感器读取值if(val<=512){//512=2.5V,想让传感器敏感一些的时候,把数值调高,想让传感器迟钝的时候把数值调低。digitalWrite(ledPin,HIGH);//当val小于512(2.5V)的时候,led亮。}else{digitalWrite(ledPin,LOW);}}

复制代码

实验效果如下http://player.youku.com/player.php/sid/XMjg1MzAxMDUy/v.swf

arduino学习笔记231602液晶实验

本次试验使用arduino直接驱动1602液晶显示文字1602液晶在应用中非常广泛,最初的1602液晶使用的是HD44780控制器,现在各个厂家的1602模块基本上都是采用了与之兼容的IC,所以特性上基本都是一致的。1602LCD主要技术参数显示容量为16×2个字符;芯片工作电压为4.5~5.5V;工作电流为2.0mA(5.0V);模块最佳工作电压为5.0V;字符尺寸为2.95×4.35(W×H)mm。1602液晶接口引脚定义

接口说明:1、两组电源一组是模块的电源一组是背光板的电源一般均使用5V供电。本次试验背光使用3.3V供电也可以工作。2、VL是调节对比度的引脚,串联不大于5KΩ的电位器进行调节。本次实验使用1KΩ的电阻来设定对比度。其连接分高电位与低电位接法,本次使用低电位接法,串联1KΩ电阻后接GND。3、RS是很多液晶上都有的引脚是命令/数据选择引脚该脚电平为高时表示将进行数据操作;为低时表示进行命令操作。4、RW也是很多液晶上都有的引脚是读写选择端该脚电平为高是表示要对液晶进行读操作;为低时表示要进行写操作。5、E同样很多液晶模块有此引脚通常在总线上信号稳定后给一正脉冲通知把数据读走,在此脚为高电平的时候总线不允许变化。6、D0—D78位双向并行总线,用来传送命令和数据。7、BLA是背光源正极,BLK是背光源负极。1602液晶的基本操作分以下四种:

下图就是1602液晶实物图

1602直接与arduino通信,根据产品手册描述,分8位连接法与4位连接法,咱们先使用8位连接法进行实验。硬件连接方式如下图

代码如下

intDI=12;intRW=11;intDB[]={3,4,5,6,7,8,9,10};//使用数组来定义总线需要的管脚intEnable=2;voidLcdCommandWrite(intvalue){//定义所有引脚inti=0;for(i=DB[0];i<=DI;i++)//总线赋值{digitalWrite(i,value&01);//因为1602液晶信号识别是D7-D0(不是D0-D7),这里是用来反转信号。value>>=1;}digitalWrite(Enable,LOW);delayMicroseconds(1);digitalWrite(Enable,HIGH);delayMicroseconds(1);//延时1msdigitalWrite(Enable,LOW);delayMicroseconds(1);//延时1ms}voidLcdDataWrite(intvalue){//定义所有引脚inti=0;digitalWrite(DI,HIGH);digitalWrite(RW,LOW);for(i=DB[0];i<=DB[7];i++){digitalWrite(i,value&01);value>>=1;}digitalWrite(Enable,LOW);delayMicroseconds(1);digitalWrite(Enable,HIGH);delayMicroseconds(1);digitalWrite(Enable,LOW);delayMicroseconds(1);//延时1ms}voidsetup(void){inti=0;for(i=Enable;i<=DI;i++){pinMode(i,OUTPUT);}delay(100);//短暂的停顿后初始化LCD//用于LCD控制需要LcdCommandWrite(0x38);//设置为8-bit接口,2行显示,5×7文字大小delay(64);LcdCommandWrite(0x38);//设置为8-bit接口,2行显示,5×7文字大小delay(50);LcdCommandWrite(0x38);//设置为8-bit接口,2行显示,5×7文字大小delay(20);LcdCommandWrite(0x06);//输入方式设定//自动增量,没有显示移位delay(20);LcdCommandWrite(0x0E);//显示设置//开启显示屏,光标显示,无闪烁delay(20);LcdCommandWrite(0x01);//屏幕清空,光标位置归零delay(100);LcdCommandWrite(0x80);//显示设置//开启显示屏,光标显示,无闪烁delay(20);}voidloop(void){LcdCommandWrite(0x01);//屏幕清空,光标位置归零delay(10);LcdCommandWrite(0x80+3);delay(10);//写入欢迎信息LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);delay(10);LcdCommandWrite(0xc0+1);//定义光标位置为第二行第二个位置delay(10);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);delay(5000);LcdCommandWrite(0x01);//屏幕清空,光标位置归零delay(10);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);delay(3000);LcdCommandWrite(0x02);//设置模式为新文字替换老文字,无新文字的地方显示不变。delay(10);LcdCommandWrite(0x80+5);//定义光标位置为第一行第六个位置delay(10);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);LcdDataWrite(&39;);delay(5000);}

复制代码

实验效果如下http://player.youku.com/player.php/sid/XMjg2NTkxODY0/v.swf4位接法在正常使用下,8位接法基本把arduino的数字端口占满了,如果想要多接几个传感器就没有端口了,这种情况下怎么处理呢,咱们可以使用4位接法。4位接法的硬件连接方法如下图

硬件接好后把下面的代码上传到控制板上,看看效果。

intLCD1602_RS=12;intLCD1602_RW=11;intLCD1602_EN=10;intDB[]={6,7,8,9};charstr1[]=&34;;charstr2[]=&34;;charstr3[]=&34;;charstr4[]=&34;;voidLCD_Command_Write(intcommand){inti,temp;digitalWrite(LCD1602_RS,LOW);digitalWrite(LCD1602_RW,LOW);digitalWrite(LCD1602_EN,LOW);temp=command&0xf0;for(i=DB[0];i<=9;i++){digitalWrite(i,temp&0x80);temp<<=1;}digitalWrite(LCD1602_EN,HIGH);delayMicroseconds(1);digitalWrite(LCD1602_EN,LOW);temp=(command&0x0f)<<4;for(i=DB[0];i<=10;i++){digitalWrite(i,temp&0x80);temp<<=1;}digitalWrite(LCD1602_EN,HIGH);delayMicroseconds(1);digitalWrite(LCD1602_EN,LOW);}voidLCD_Data_Write(intdat){inti=0,temp;digitalWrite(LCD1602_RS,HIGH);digitalWrite(LCD1602_RW,LOW);digitalWrite(LCD1602_EN,LOW);temp=dat&0xf0;for(i=DB[0];i<=9;i++){digitalWrite(i,temp&0x80);temp<<=1;}digitalWrite(LCD1602_EN,HIGH);delayMicroseconds(1);digitalWrite(LCD1602_EN,LOW);temp=(dat&0x0f)<<4;for(i=DB[0];i<=10;i++){digitalWrite(i,temp&0x80);temp<<=1;}digitalWrite(LCD1602_EN,HIGH);delayMicroseconds(1);digitalWrite(LCD1602_EN,LOW);}voidLCD_SET_XY(intx,inty){intaddress;if(y==0)address=0x80+x;elseaddress=0xC0+x;LCD_Command_Write(address);}voidLCD_Write_Char(intx,inty,intdat){LCD_SET_XY(x,y);LCD_Data_Write(dat);}voidLCD_Write_String(intX,intY,char*s){LCD_SET_XY(X,Y);//设置地址while(*s)//写字符串{LCD_Data_Write(*s);s++;}}voidsetup(void){inti=0;for(i=6;i<=12;i++){pinMode(i,OUTPUT);}delay(100);LCD_Command_Write(0x28);//4线2行5x7delay(50);LCD_Command_Write(0x06);delay(50);LCD_Command_Write(0x0c);delay(50);LCD_Command_Write(0x80);delay(50);LCD_Command_Write(0x01);delay(50);}voidloop(void){LCD_Command_Write(0x01);delay(50);LCD_Write_String(3,0,str1);//第1行,第4个地址起delay(50);LCD_Write_String(1,1,str2);//第2行,第2个地址起delay(5000);LCD_Command_Write(0x01);delay(50);LCD_Write_String(0,0,str3);delay(50);LCD_Write_String(0,1,str4);delay(5000);}

复制代码

4位接法实验效果如下http://player.youku.com/player.php/sid/XMjg3MDE5MDIw/v.swf这里我们讲解一下最关键的部分,就是LCD的控制命令。在上面两段代码中,我们常常可以遇到0x01,0x38这种参数。这些参数代表什么呢?在C/C++语言中,0x38代表的是十六进制的数值&34;,&34;的意思就是十六进制。先打开win7下的计算器,选择“程序员”“基本”,

然后咱们选择“十六进制”,输入“38”,

然后再点击“二进制”。这时十六进制的“38”就会转换为二进制下的数值“111000”。

以8位控制法接LCD是,对应的控制信息就是“00111000”

同理,也可以把二进制的控制信息,逆运算为十六进制的。有的产品说明书写的控制命令是&34;这里说明一下,一般情况下十六进制前缀0x后缀h十进制后缀D八进制后缀Q二进制后缀B但是不同的程序语言,对于十六进制的表达方式不完全相同,在arduino下,表达十六进制数值“38”只能使用“0x38”而不能用“38H”最后放三个附件,是三个不同厂家的1602LCD手册,供大家深入研究。

1602手册.pdf(634.17KB,下载次数:3)

1602.pdf(233KB,下载次数:1)

SMC1602A.pdf(255.88KB,下载次数:1)

arduino学习笔记24温度传感器实验

通过上一次的实验,我们学会了1602液晶的使用。下面我们做一个简单的温度传感器,通过一个LM35温度传感器读取室温后,使温度显示在1602液晶屏幕上。上次我们驱动液晶是使用的手工编写代码,这次我们直接使用arduino自带的LiquidCrystal库来进行驱动,此库文件允许arduino控制板控制基于HitachiHD44780或与之相兼容芯片大部分的液晶,可以工作于4bit或者8bit状态。下图为我们所使用的arduino的LiquidCrystal库文件位置,只有这里显示的库文件,arduino才可以调用。

什么是温度传感器?温度传感器就是利用物质随温度变化特性的规律,把温度转换为电量的传感器。按照测量方式可以分为接触式和非接触式两大类,按照传感器材料以及元件特性分为热电阻传感器和热电偶传感器两类。白光烙铁头使用的是热电偶传感器,本次试验使用的LM35是热电阻传感器。LM35温度传感器实物如下图:

LM35使用非常普遍,他使用内部补偿机制,输出可以从0℃开始。封装为T0992,工作电压4—30V。而且在上述电压范围内,芯片的工作电流不超过60ua。根据产品使用手册,得知LM35传感器的输出电压与摄氏温度呈线性关系,0℃时输出为0V,每升高1℃,输出电压增加10mv。下图为实验硬件连接方式

代码如下

34;LM35Thermometer&34;LM35Thermometer&34;.&34;C&include<Wire.h>//调用arduino自带的I2C库defineRegister_ID0defineRegister_X00x32defineRegister_Y00x34defineRegister_Z00x3634;X=&34;Y=&34;Z=&defineDHT11_PIN0//ADC0接到模拟口0

byteread_dht11_dat()

{

bytei=0;

byteresult=0;

for(i=0;i<8;i++){

while(!(PINC&_BV(DHT11_PIN)));//waitfor50us

delayMicroseconds(30);

if(PINC&_BV(DHT11_PIN))

result|=(1<<(7-i));

while((PINC&_BV(DHT11_PIN)));//wait&39;finish

}

returnresult;

}

voidsetup()

{

DDRC|=_BV(DHT11_PIN);

PORTC|=_BV(DHT11_PIN);

Serial.begin(19200);

Serial.println(&34;);

}

voidloop()

{

bytedht11_dat[5];

bytedht11_in;

bytei;

//startcondition

//1.pull-downi/opinfrom18ms

PORTC&=~_BV(DHT11_PIN);

delay(18);

PORTC|=_BV(DHT11_PIN);

delayMicroseconds(40);

DDRC&=~_BV(DHT11_PIN);

delayMicroseconds(40);

dht11_in=PINC&_BV(DHT11_PIN);

if(dht11_in){

Serial.println(&34;);

return;

}

delayMicroseconds(80);

dht11_in=PINC&_BV(DHT11_PIN);

if(!dht11_in){

Serial.println(&34;);

return;

}

delayMicroseconds(80);

//nowreadyfordatareception

for(i=0;i<5;i++)

dht11_dat[i]=read_dht11_dat();

DDRC|=_BV(DHT11_PIN);

PORTC|=_BV(DHT11_PIN);

bytedht11_check_sum=dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];

//checkcheck_sum

if(dht11_dat[4]!=dht11_check_sum)

{

Serial.println(&34;);

}

Serial.print(&34;);

Serial.print(dht11_dat[0],DEC);

Serial.print(&34;);

Serial.print(dht11_dat[1],DEC);

Serial.print(&34;);

Serial.print(&34;);

Serial.print(dht11_dat[2],DEC);

Serial.print(&34;);

Serial.print(dht11_dat[3],DEC);

Serial.println(&34;);

delay(2000);

}

编译代码后下载到Arduino中,打开串口助手即可看见实际测量的温度与湿度。

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

站内搜索