首页 » SEO优化 » php负数转正技巧_arduino进修笔记分享

php负数转正技巧_arduino进修笔记分享

访客 2024-10-24 0

扫一扫用手机浏览

文章目录 [+]

2、单片机有什么用?实际事情中并不是任何必要打算机的场合都哀求打算机有很高的性能,一个掌握电冰箱温度的打算机难道要用酷睿处理器吗?运用的关键是看是否够用,是否有很好的性能价格比。
如果一台冰箱都须要用酷睿处理起来进行温度掌握,那价格便是天价了。
单片机常日用于工业生产的掌握、生活中与程序和掌握有关(如:电子琴、冰箱、智能空调等)的场合。
下图便是一个Atmega328P-PU单片机,基于AVR指令集的8位处理器,频率20MHz,存储器空间32KB。

什么是Arduino?Arduino是一个能够用来感应和掌握现实物理天下的一套工具。
它由一个基于单片机并且开放源码的硬件平台,和一套为Arduino板编写程序 的开拓环境组成。
Arduino可以用来开拓交互产品,比如它可以读取大量的开关和传感器旗子暗记,并且可以掌握各式各样的电灯、电机和其他物理设备。
Arduino项目可以是单独的,也可以在运行时和你电脑中运行的程序(例如:Flash,Processing,MaxMSP)进行通讯。
Arduino板你可以选择自己去手动组装或是购买已经组装好的;Arduino开源的IDE可以免费下载得到。
Arduino的编程措辞就像似在对一个类似于物理的打算平台进行相应的连线,它基于处理多媒体的编程环境。

php负数转正技巧_arduino进修笔记分享

为什么要利用Arduino?有很多的单片机和单片机平台都适宜用做交互式系统的设计。
例如:Parallax Basic Stamp, Netmedia’s BX-24,Phidgets,MIT’s Handyboard 和其它等等供应类似功能的。
所有这些工具,你都不须要去关心单片机编程繁琐的细节,供应给你的是一套随意马虎利用的工具包。
Arduino同样也简化了同单片机事情的流程,但同其它系统比较Arduino在很多地方更具有优胜性,特殊适宜老师,学生和一些业余爱好者们利用:

php负数转正技巧_arduino进修笔记分享
(图片来自网络侵删)
便宜 - 和其它平台比较,Arduino板算是相称便宜了。
最便宜的Arduino版本可以自己动手制作,纵然是组装好的成品,其价格也不会超过200元。
跨平台 - Arduino软件可以运行在Windows,Macintosh OSX,和Linux操作系统。
大部分其它的单片机系统都只能运行在Windows上。
大略单纯的编程环境 - 初学者很随意马虎就能学会利用Arduino编程环境,同时它又能为高等用户供应足够多的高等运用。
对付老师们来说,一样平常都能很方便的利用Processing 编程环境,以是如果学生学习过利用Processing 编程环境的话,那他们在利用Arduino开拓环境的时候就会以为很相似很熟习。
软件开源并可扩展 - Arduino软件是开源的,对付有履历的程序员可以对其进行扩展。
Arduino编程措辞可以通过C++库进行扩展,如果有人想去理解技能上的细节,可以跳过Arduino措辞而直策应用AVR C 编程措辞(由于Arduino措辞实际上是基于AVR C的)。
类似的,如果你须要的话,你也可以直接往你的Arduino程序中添加AVR-C 代码。
硬件开源并可扩展 - Arduino板基于 Atmel 的ATMEGA8 和ATMEGA168/328 单片机。
Arduino基于Creative Commons 容许协议,以是有履历的电路设计师能够根据需求设计自己的模块,可以对其扩展或改进。
乃至是对付一些相对没有什么履历的用户,也可以通过制作试验板来理解Arduino是怎么事情的,省钱又省事。
Arduino基于AVR平台,对AVR库进行了二次编译封装,把端口都打包好了,寄存器啦、地址指针之类的基本不用管。
大大降落了软件开拓难度,适宜非专业爱好者利用。
优点和缺陷并存,由于是二次编译封装,代码不如直策应用AVR代码编写精练,代码实行效率与代码体积都弱于AVR直接编译。
性能:Digital I/O 数字输入/输出端口0—13。
Analog I/O 仿照输入/输出端口0-5。
支持ICSP下载,支持TX/RX。
输入电压:USB接口供电或者5V-12V外部电源供电。
输出电压:支持3.3V级5V DC输出。
处理器:利用Atmel Atmega168 328处理器,因其支持者浩瀚,已有公司开拓出来32位的MCU平台支持arduino。
目前arduino的掌握板最新的为Arduino Uno,如下图: 海内利用比较多的为Arduino Duemilanove 2009,紧张缘故原由是Uno的usb掌握芯片封装办法改变,制造本钱上升,其他变革不大,性价比还是Arduino Duemilanove 2009比较好。
因其开源特性,生产arduino掌握板的厂商浩瀚,同样的Duemilanove 2009就有很多种颜色。
对付一些对电路板大小哀求比较严格的地方,arduino团队供应了arduino Nano,此板体积做的非常小。
如下图: arduino板子上基本端口如图描述,对几个比较分外的端口下面详细解释下:VIN端口:VIN是input voltage的缩写,表示有外部电源时的输入端口。
AREF:Reference voltage for the analog inputs(仿照输入的基准电压)。
利用analogReference()命令调用。
ICSP:也有称为ISP(In System Programmer),便是一种线上即时烧录,目前比较新的芯片都支持这种烧录模式,包括大家常听说的8051系列的芯片,也都逐步采取这种简便的烧录办法。
我们都知道传统的烧录办法,都是将被烧录的芯片,从线路板上拔起,有的焊去世在线路板上的芯片,还得先把芯片焊接下来才能烧录。
为理解决这种问题,发明了ICSP线上即时烧录办法。
只须要准备一条R232线(连接烧录器),以及一条连接烧录器与烧录芯片针脚的连接线就可以。
电源的+5V,GND,两条卖力传输烧录信息的针脚,再加上一个烧录电压针脚,这样就可以烧录了。
arduino学习条记2通过Arduino编译器查看串口数据最大略的例子:void setup() { Serial.begin(9600); // 打开串口,设置波特率为9600 bps}void loop() { int val; val=analogRead(5);//传感器接到仿照口5,数值根据自己的须要可变 Serial.println(val,DEC);//从串口发送字符串并换行 delay(100);}如果电路安装精确,按照示例代码运行、上传,然后点击编译器的Serial Monitor按钮,就可以看到从代码定义的输入口(这儿是仿照口5)获取的数据了。
arduino学习条记3 arduino措辞Arduino措辞是建立在C/C++根本上的,实在也便是根本的C措辞,Arduino措辞只不过把AVR单片机(微掌握器)干系的一些参数设置都函数化,不用我们去理解他的底层,让我们不理解AVR单片机(微掌握器)的朋友也能轻松上手。

在与Arduino DIYER打仗的这段韶光里,创造有些朋友对Arduino措辞还是比较难入手,那么这里我就大略的注释一下Arduino措辞(本人也是半罐子水,有错的地方还请各位示正)。

/根本C措辞/

关键字:ifif...elseforswitch casewhiledo... whilebreakcontinuereturngoto语法符号:;{}/// /运算符:=+-/%==!=<><=>=&&||!++--+=-==/=数据类型:boolean 布尔类型charbyte 字节类型intunsigned intlongunsigned longfloatdoublestringarrayvoid数据类型转换:char()byte()int()long()float()常量:HIGH | LOW 表示数字IO口的电平,HIGH 表示高电平(1),LOW 表示低电平(0)。
INPUT | OUTPUT 表示数字IO口的方向,INPUT 表示输入(高阻态),OUTPUT 表示输出(AVR能供应5V电压 40mA电流)。
true | false true 表示真(1),false表示假(0)。

//

以上为根本c措辞的关键字和符号,有c措辞根本的都该当理解其含义,这里也不作过多的阐明。

/Arduino 措辞/

构造void setup() 初始化变量,管脚模式,调用库函数等void loop() 连续实行函数内的语句功能

数字 I/O

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

仿照 I/O

int analogRead(pin) 仿照IO口读函数,pin表示为0~5(Arduino Diecimila为0~5,Arduino nano为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的使能掌握。
unsigned long pulseIn(pin, value) 脉冲长度记录函数,返回韶光参数(us),pin表示为0~13,value为HIGH或LOW。
比如value为HIGH,那么当pin输入为高电平时,开始计时,当pin输入为低电平时,停滞计时,然后返回该韶光。

韶光函数

unsigned long millis() 返回韶光函数(单位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)函数 。
long random(max) 随机数函数,返回数据大于即是0,小于max。
long random(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等。
int Serial.available() 判断缓冲器状态。
int Serial.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 - a library for keeping track of the current date and time in software.Debounce - for reading noisy digital inputs (e.g. from buttons)Firmata - for communicating with applications on the computer using a standard serial protocol.GLCD - graphics routines for LCD based on the KS0108 or equivalent chipset.LCD - control LCDs (using 8 data lines)LCD 4 Bit - control LCDs (using 4 data lines)LedControl - for controlling LED matrices or seven-segment displays with a MAX7221 or MAX7219.LedControl - an alternative to the Matrix library for driving multiple LEDs with Maxim chips.Messenger - for processing text-based messages from the computerMetro - help you time actions at regular intervalsMsTimer2 - uses the timer 2 interrupt to trigger an action every N milliseconds.OneWire - control devices (from Dallas Semiconductor) that use the One Wire protocol.PS2Keyboard - read characters from a PS2 keyboard.Servo - provides software support for Servo motors on any pins.Servotimer1 - provides hardware support for Servo motors on pins 9 and 10Simple Message System - send messages between Arduino and the computerSSerial2Mobile - send text messages or emails using a cell phone (via AT commands over software serial)TextString - handle stringsTLC5940 - 16 channel 12 bit PWM controller.X10 - Sending X10 signals over AC power lines

//

arduino学习条记4 数据类型

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

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

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

+= , -= , = , /= Description描述Perform a mathematical operation on a variable with another constant or variable. The += (et al) operators are just a convenient shorthand for the expanded syntax, listed below. 对一个变量和另一个参数或变量完成一个数学运算。
+=(以及其他)可以缩短语法长度。

Syntax语法x += y; // equivalent to the expression x = x + y; // 等价于 x = x + y;x -= y; // equivalent to the expression x = x - y; // 等价于 x = x - y;x = y; // equivalent to the expression x = x y; // 等价于 x = x y;x /= y; // equivalent to the expression x = x / y; // 等价于 x = x / y;

Parameters参数x: any variable type x:任何变量类型

y: any variable type or constant y:任何变量类型或常数

Examples范例x = 2;x += 4; // x now contains 6 // x现在为6x -= 3; // x now contains 3 // x现在为3x = 10; // x now contains 30 // x现在为30x /= 2; // x now contains 15 // x现在为15

Syntax语法x++; // increment x by one and returns the old value of x // 将x的值加1并返回原来的x的值。
++x; // increment x by one and returns the new value of x // 将x的值加1并返回现在的x的值。
x-- ; // decrement x by one and returns the old value of x // 将x的值减1并返回原来的x的值。
--x ; // decrement x by one and returns the new value of x // 将x的值减1并返回现在的x的值。

Parameters参数x: an integer or long (possibly unsigned) x:一个整数或长整数(可以无符号)

Returns返回The original or newly incremented / decremented value of the variable. 返回变量原始值或增加/花费后的新值。

Examples范例x = 2;y = ++x; // x now contains 3, y contains 3 // x现在为3,y为3y = x--; // x contains 2 again, y still contains 3 // x现在仍旧为2,y将为3

arduino学习条记6 Arduino根本

在学措辞之间,还要做的一个作业便是要明白程序的构架,这个也同样大略,大体可分为几个部分。

1、声明变量及接口名称(int val;int ledPin=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和 serial Arduino仅仅支持 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)

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

范例 :

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

digitalWrite(pin, value)

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

范例 :

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

int digitalRead(pin)

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

范例 :

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

int analogRead(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)

unsigned long pulseIn(pin, value)

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

范例 :

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

shiftOut(dataPin, clockPin, bitOrder, value)

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

范例 :

shiftOut(dataPin, clockPin, LSBFIRST, 255);

韶光函数

掌握与打算晶片实行期间的韶光

unsigned long millis()

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

范例:

duration = millis()-lastTime; // 表示自"lastTime"至当下的韶光

delay(ms)

停息晶片实行多少毫秒

范例:

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

delay Microseconds(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之间的数值。

double pow(base, exponent)

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

范例:

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

double sqrt(x)

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

范例:

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

double sin(rad)

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

范例:

double sine = sin(2); // 近似值 0.90929737091

double cos(rad)

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

范例:

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

double tan(rad)

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

范例:

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

乱数函式

产生乱数

randomSeed(seed)

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

范例:

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

long random(max)

long random(min, max)

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

范例:

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

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

序列通讯

你可以在第五章瞥见一些利用序列埠与电脑交流讯息的范例,以下是函式阐明。

Serial.begin(speed)

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

范例:

Serial.begin(9600);

Serial.print(data)

Serial.print(data, encoding)

经序列埠传送资料,供应编码办法的选项。
如果没有指定,预设以一样平常笔墨传送。

范例:

Serial.print(75); // 列印出 "75"

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

Serial.print(75, HEX); // "4B" (75 的十六进位)

Serial.print(75, OCT); // "113" (75 in的八进位)

Serial.print(75, BIN); // "1001011" (75的二进位)

Serial.print(75, BYTE); // "K" (以byte进行传送,显示以ASCII编码办法)

Serial.println(data)

Serial.println(data, encoding)

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

范例:

Serial.println(75); //列印出"75 "

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

Serial.println(75, HEX); // "4B "

Serial.println(75, OCT); // "113 "

Serial.println(75, BIN); // "1001011 "

Serial.println(75, BYTE); // "K "

int Serial.available()

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

范例:

int count = Serial.available();

int Serial.read()

读取1byte的序列资料

范例:

int data = Serial.read();

Serial.flush()

有时候由于资料速率太快,超过程式处理资料的速率,你可以利用此函式打消缓冲区内的资料。
经由此函式可以确保缓冲区(buffer)内的资料都是最新的。

范例:

Serial.flush();

arduino学习条记8数字输入

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

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

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

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

相应的代码为:

int ledPin = 13;int switchPin = 7;int value = 0;void setup() {pinMode(ledPin, OUTPUT);pinMode(switchPin, INPUT);}void loop() {value = digitalRead(switchPin);if (HIGH == value) { // turn LED off digitalWrite(ledPin, LOW);} else { // turn LED on digitalWrite(ledPin, HIGH);}}

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

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

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

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

该工程对应的代码为:

int BASE = 2;int NUM = 6;int index = 0;void setup(){for (int i = BASE; i < BASE + NUM; i ++) { pinMode(i, OUTPUT);}}void loop(){for (int i = 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管脚,我们可以用同样的办法验证其他六个管脚的精确性,而这只须要对上述工程的第一行做相应的修正就可以了:

int BASE = 8;

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

串行通信是在实现在PC机与微掌握器进行交互的最大略的办法。
之前的PC机上一样平常都配有标准的 RS-232或者RS-422接口来实现串行通信,但现在这种情形已经发生了一些改变,大家更方向于利用USB这样一种更快速但同时也更加繁芜的办法来实现串行通信。
只管在有些打算机上现在已经找不到RS-232或者RS-422接口了,但我们仍可以通过USB/串口或者PCMCIA/串口这样的转换器, 在这些设备上得到传统的串口。

通过串口连接的Arduino在交互式设计中能够为PC机供应一种全新的交互办法,比如用PC机掌握一些之前看来非常繁芜的事情,像声音和视频等。
很多场合中都哀求Arduino能够通过串口吸收来自于PC机的命令,并完成相应的功能,这可以通过Arduino措辞中供应的 Serial.read()函数来实现。

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

int ledPin = 13;int val; void setup() {pinMode(ledPin, OUTPUT);Serial.begin(9600);} void loop() {val = Serial.read();if (-1 != val) { if ('H' == 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()或许能够帮助我们用实验来进行验证:

int ledPin = 13;int val; void setup() {pinMode(ledPin, OUTPUT);Serial.begin(9600);} void loop() {val = Serial.read();if (-1 != val) { if ('H' == val) { digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); Serial.print("Available: "); Serial.println(Serial.available(), DEC); }}}

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

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

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

在许多实际运用处所中我们会哀求在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机连起来就可以了,相应的代码为:

void setup() {Serial.begin(9600);}void loop() {Serial.println("Hello World!");delay(1000);}

在将工程下载到Arduino模块中之后,在Arduino集成开拓环境的工具栏中单击“Serial Monitor”掌握,打开串口监视器:

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

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

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

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

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

Pulse Width Modulation, or PWM, is a technique for getting analog results with digital means. Digital control is used to create a square wave, a signal switched between on and off. This on-off pattern can simulate voltages in between full on (5 Volts) and off (0 Volts) by changing the portion of the time the signal spends on versus the time that the signal spends off. The duration of "on time" is called the pulse width. To get varying analog values, you change, or modulate, that pulse width. If you repeat this on-off pattern fast enough with an LED for example, the result is as if the signal is a steady voltage between 0 and 5v controlling the brightness of the LED.

脉冲宽度调制或PWM,是通过数字均值得到仿照结果的技能。
数字掌握被用来创建一个方波,旗子暗记在开和关之间切换。
这种开关模式通过改变“开”韶光段和“关”韶光段的比值完备仿照从开(5伏特)和关(0伏特)之间的电压。
“开韶光“的周期称为脉冲宽度。
为了得到不同的仿照值,你可以变动,或调节脉冲宽度。
如果你重复这种开关模式速率足够快,其结果是一个介于0和5V之间的稳定电压用以掌握LED的亮度。

In the graphic below, the green lines represent a regular time period. This duration or period is the inverse of the PWM frequency. In other words, with Arduino's PWM frequency at about 500Hz, the green lines would measure 2 milliseconds each. A call to analogWrite() is on a scale of 0 - 255, such that analogWrite(255) requests a 100% duty cycle (always on), and analogWrite(127) is a 50% duty cycle (on half the time) for example.

下图中,绿色线表示一个固定的韶光期限。
此持续韶光或周期是PWM的频率的倒数。
换言之,Arduino的PWM频率约为500Hz,每个绿线之间表示2毫秒。
一个analogWrite()的调用区间为0- 255,例如analogWrite(255)须要100%占空比(常开),和analogWrite(127)是50%占空比(上一半的韶光)。

Once you get this example running, grab your arduino and shake it back and forth. What you are doing here is essentially mapping time across the space. To our eyes, the movement blurs each LED blink into a line. As the LED fades in and out, those little lines will grow and shrink in length. Now you are seeing the pulse width.

一旦你运行这个例子中,捉住你的Arduino来回扭捏。
你这么做的本色上是韶光超过时空的映射。
对我们的眼睛,每个运动模糊成一条线的LED闪烁。
由于LED消逝和缩小,那些小行的长度会增长和紧缩。
现在你就可以看到脉冲宽度。

arduino学习条记13 Arduino的仿照输入Description 先容

Reads the value from the specified analog pin. The Arduino board contains a 6 channel (8 channels on the Mini and Nano, 16 on the Mega), 10-bit analog to digital converter. This means that it will map input voltages between 0 and 5 volts into integer values between 0 and 1023. This yields a resolution between readings of: 5 volts / 1024 units or, .0049 volts (4.9 mV) per unit. The input range and resolution can be changed using analogReference().

It takes about 100 microseconds (0.0001 s) to read an analog input, so the maximum reading rate is about 10,000 times a second.

从指定的仿照引脚读取值。
Arduino主板有6个通道(Mini和Nano有8个,Mega有16个),10位AD(模数)转换器。
这意味着输入电压0-5伏对应0-1023的整数值。
这便是说读取精度为:5伏/1024个单位,约即是每个单位0.049伏(4.9毫伏)。
输入范围和进度可以通过analogReference()进行修正。

仿照输入的读取周期为100微秒(0.0001秒),以是最大读取速率为每秒10,000次。

Syntax 语法

analogRead(pin)

Parameters 参数

pin: the number of the analog input pin to read from (0 to 5 on most boards, 0 to 7 on the Mini and Nano, 0 to 15 on the Mega)

pin:读取的仿照输入引脚号(大多数主板是0-5,Mini和Nano是0-7,Mega是0-15)

Returns 返回值

int (0 to 1023)

整数型 int(0到1023)

Note 备注

If the analog input pin is not connected to anything, the value returned by analogRead() will fluctuate based on a number of factors (e.g. the values of the other analog inputs, how close your hand is to the board, etc.).

如果仿照输入引脚没有连接到任何地方,analogRead()的返回值也会由于某些成分而颠簸(如其他仿照输入,你的手与主板靠的太近)

Example 例子

int analogPin = 3; // potentiometer wiper (middle terminal) connected to analog pin 3

// outside leads to ground and +5V

int val = 0; // variable to store the value read

void setup()

{

Serial.begin(9600); // setup serial

}

void loop()

{

val = analogRead(analogPin); // read the input pin

Serial.println(val); // debug value

}

arduino学习条记14 Arduino的仿照输出Description 先容

Writes an analog value (PWM wave) to a pin. Can be used to light a LED at varying brightnesses or drive a motor at various speeds. After a call to analogWrite(), the pin will generate a steady square wave of the specified duty cycle until the next call to analogWrite() (or a call to digitalRead() or digitalWrite() on the same pin). The frequency of the PWM signal is approximately 490 Hz.

将仿照值(PWM波)输出到管脚。
可用于在不同的光芒亮度调节发光二极管亮度或以不同的速率驱动马达。
调用analogWrite()后,该引脚将产生一个指定占空比的稳定方波,直到下一次调用analogWrite()(或在同一引脚调用digitalRead()或digitalWrite())。
PWM的旗子暗记频率约为490赫兹。

On most Arduino boards (those with the ATmega168 or ATmega328), this function works on pins 3, 5, 6, 9, 10, and 11. On the Arduino Mega, it works on pins 2 through 13. Older Arduino boards with an ATmega8 only support analogWrite() on pins 9, 10, and 11. You do not need to call pinMode() to set the pin as an output before calling analogWrite().

在大多数Arduino板(带有ATmega168或ATmega328),这个函数事情在引脚3,5,6,9,10和11。
在ArduinoMega,它适用于2-13号引脚。
老的带有ATmega8的Arduino板只支持9,10,11引脚上利用。
你并不须要在调用analogWrite()之前为设置输入引脚而调用pinMode()。

The analogWrite function has nothing whatsoever to do with the analog pins or the analogRead function.

这个analogWrite方法与仿照引脚或者analogRead方法绝不相关

Syntax 语法

analogWrite(pin, value)

Parameters 参数

pin: the pin to write to.

pin:输出的引脚号

value: the duty cycle: between 0 (always off) and 255 (always on).

value:占用空:从0(常关)到255(常开)

Returns 返回值

nothing

Notes and Known Issues 备注和已知问题

The PWM outputs generated on pins 5 and 6 will have higher-than-expected duty cycles. This is because of interactions with the millis() and delay() functions, which share the same internal timer used to generate those PWM outputs. This will be noticed mostly on low duty-cycle settings (e.g 0 - 10) and may result in a value of 0 not fully turning off the output on pins 5 and 6.

引脚5和6的PWM输出将产生高于预期的占空比。
这是由于millis()和delay()函数,它们共享同一个内部定时器用于产生PWM输出所产生的相互浸染。
这提醒我们引脚5和6在多数低占空比的设置(如0- 10)的情形下0数值的结果并没有完备关闭。

Example 例子

Sets the output to the LED proportional to the value read from the potentiometer.

int ledPin = 9; // LED connected to digital pin 9

int analogPin = 3; // potentiometer connected to analog pin 3

int val = 0; // variable to store the read value

void setup()

{

pinMode(ledPin, OUTPUT); // sets the pin as output

}

void loop()

{

val = analogRead(analogPin); // read the input pin

analogWrite(ledPin, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255

arduino学习条记15制作第一个电路 单led闪烁

做任何一个电路之前,一定要先理解电路中原件的参数,其事情电压,事情电流等。
第一个实验咱们用到的LED从网上查找资料得知,其事情电压一样平常为1.5-2.0V,事情电流一样平常为10-20ma,反向击穿电压为5V。
掌握板逻辑电路供电为5V。
根据以上参数假设LED事情电压选用1.7,事情电流选用15ma,限流电阻=(总电压-LED电压)/电流,以是限流电阻=(5-1.7)/0.015=220Ω。
首先须要从arduino官方网站下载其编译软件,地址是http://arduino.cc/en/Main/Software笔者利用的平台为win7 32位,如果大家利用的是其他平台,按照对应的下载就可以。
下载回来的软件包解压缩后的目录构造如下图,arduino.exe是程序的启动文件,driver目录是掌握板usb芯片驱动,usb接上掌握板后如果要探求驱动,把目录指定到这里就可以。

本次实验所用到的器材为一个面包板,一个LED,一个220Ω的电阻,几根导线,如下图:

本次实验的连接方法如下图,LED两个针脚有一长一短,短的是连接GND,长的是连接正极。
在LED的长引脚前,须要添加一个220Ω的限流电阻。
连接数字5号接口。

实物连接如下图:

通过面包板把个个电子器件连接好往后,接上USB线,设置好掌握板型号、端口号。
程序措辞先不详解,大家先如法泡制对着抄,后面通过各个实验,将对不同命令进行详解。
编写程序前,先须要选择掌握板的型号。
如下图:

掌握板型号选择好后,选择串口位置,笔者电脑的串口为COM3:

串口详细是多少号可以到设备管理中进行查看,如下图:

先把程序复制进去:

int ledPin=5; //设定掌握LED的数字IO脚void setup(){ pinMode(ledPin,OUTPUT);//设天命字IO口的模式,OUTPUT 为输出}void loop(){ digitalWrite(ledPin,HIGH); //设定PIN5脚为HIGH = 5V旁边 delay(2000); //设定延时时间,2000 = 2秒 digitalWrite(ledPin,LOW); //设定PIN5脚为LOW = 0V delay(2000); //设定延时时间,2000 = 2秒}

复制代码

图中int;void setup等褐色的笔墨是系统命令,OUTPUT等蓝色笔墨是命令的功能开关,玄色笔墨是变量。
程序写好往后点击编译按钮进行编译。
编译完成后会显示出来编译后的文件大小,本次编译出来的程序大小为1026字节。
然后把编译好的程序下载到arduino掌握板上,点击下载按钮。
下载完成后会有提示 把所有的ledpin换成xxx试试,一样可以滴~~~ledpin只是自己定义的一个名字,浸染只是方便识别辨认。
本次实验效果如下,闪烁着光芒的灯。


http://player.youku.com/player.php/sid/XMjg0MTA0Mzg4/v.swf总结:int;void setup等褐色笔墨是系统命令,OUTPUT等蓝色笔墨是系统命令的功能开关,玄色笔墨是变量。
在"int ledpin=5"中;设置了LED的数字IO脚,ledpin仅仅是5号数字端口自定义出来的名字,变成xxx等都可以。
对付多脚IO操作的程序中,为每一个引脚定义名字是有必要性的,程序繁芜后方便功能识别。
arduino学习条记16六灯闪烁实验

通过上一节学习,知道了若何让一个led进行闪烁,下面的实验会对六个led进行掌握,先看硬件连接图。

按照上面的硬件连接方法接好后,咱们来测试两段程序,看看个中的差别。
通过这两段程序先容一下arduino的措辞轮廓。

//设置掌握Led的数字IO脚int Led1 = 1;int Led2 = 2;int Led3 = 3;int Led4 = 4;int Led5 = 5;int Led6 = 6;//led灯花样显示样式1子程序void style_1(void){ unsigned char j; for(j=1;j<=6;j++) { digitalWrite(j,HIGH); delay(200); } for(j=6;j>=1;j--) { digitalWrite(j,LOW); delay(200); } }void setup(){ unsigned char i; for(i=1;i<=6;i++)//依次设置1~6个数字引脚为输出模式 pinMode(i,OUTPUT);//设置第i个引脚为输出模式}void loop(){ style_1();//样式1}

复制代码

上面代码的效果视频如下:http://player.youku.com/player.php/sid/XMjgzOTA0Mjk2/v.swf

//设置掌握Led的数字IO脚int Led1 = 1;int Led2 = 2;int Led3 = 3;int Led4 = 4;int Led5 = 5;int Led6 = 6;//led灯花样显示样式1子程序void style_1(void){ unsigned char j; for(j=1;j<=6;j++) digitalWrite(j,HIGH); delay(200); for(j=6;j>=1;j--) { digitalWrite(j,LOW); delay(200); } }void setup(){ unsigned char i; for(i=1;i<=6;i++)//依次设置1~6个数字引脚为输出模式 pinMode(i,OUTPUT);//设置第i个引脚为输出模式}void loop(){ style_1();//样式1}

复制代码

上面代码的效果视频如下:http://player.youku.com/player.php/sid/XMjg0MDU5NjQ0/v.swf通过下载测试,创造第一段程序是led 1-6逐个点亮,然后从6-1再逐个熄灭如此循环。
第二段程序是6个灯同时亮,然后再6-1逐个熄灭如此循环。
下面对产生不同效果的代码进行剖析。
下面这段代码代表的for语句循环的是,是把j点亮,然后再延迟200毫秒,然后再循环。
形成的效果便是6个灯相隔200毫秒逐步被点亮。

for(j=1;j<=6;j++) { digitalWrite(j,HIGH); delay(200); }

复制代码

下面这段代码实在是不规范写法,for命令表达哀求一定要有{}循环,如果没有标出{},编译时就会自动对下一句加上{}。
如果代码量很大,出问题是查找起来会非常辛劳。

for(j=1;j<=6;j++) digitalWrite(j,HIGH); delay(200);

复制代码

精确的写法该当是下面这个样子

for(j=1;j<=6;j++) { digitalWrite(j,HIGH); } delay(200);

复制代码

六个灯逐个被点亮,然后再延时200毫秒进入下一句。
由于六灯逐个点亮的速率非常快,以是看上去像一起亮的。
void(无类型)在arduino中是数据类型的一种,常日用来代表一个事宜。
如果掌握过程比较大略void一样平常无需定义,直策应用

void setup(){ // ...}void loop(){ // ...}

复制代码

代表事宜的开始与事宜的循环。
如果掌握过程比较繁芜,一样平常就要设置多个子事宜,把繁芜的过程进行分解,每一个子事宜定义为一个void数据。
把以下代码上传上去,看看led灯是如何事情的。

//设置掌握Led的数字IO脚int Led1 = 1;int Led2 = 2;int Led3 = 3;int Led4 = 4;int Led5 = 5;int Led6 = 6;//led灯花样显示样式1子程序void style_1(void){ unsigned char j; for(j=1;j<=6;j++)//每隔200ms依次点亮1~6引脚相连的led灯 { digitalWrite(j,HIGH);//点亮j引脚相连的led灯 delay(200);//延时200ms } for(j=6;j>=1;j--)//每隔200ms依次熄灭6~1引脚相连的led灯 { digitalWrite(j,LOW);//熄灭j引脚相连的led灯 delay(200);//延时200ms } }//灯闪烁子程序void flash(void){ unsigned char j,k; for(k=0;k<=1;k++)//闪烁两次 { for(j=1;j<=6;j++)//点亮1~6引脚相连的led灯 digitalWrite(j,HIGH);//点亮与j引脚相连的led灯 delay(200);//延时200ms for(j=1;j<=6;j++)//熄灭1~6引脚相连的led灯 digitalWrite(j,LOW);//熄灭与j引脚相连的led灯 delay(200);//延时200ms }}//led灯花样显示样式2子程序void style_2(void){ unsigned char j,k; k=1;//设置k的初值为1 for(j=3;j>=1;j--) { digitalWrite(j,HIGH);//点亮灯 digitalWrite(j+k,HIGH);//点亮灯 delay(400);//延时400ms k +=2;//k值加2 } k=5;//设置k值为5 for(j=1;j<=3;j++) { digitalWrite(j,LOW);//熄灭灯 digitalWrite(j+k,LOW);//熄灭灯 delay(400);//延时400ms k -=2;//k值减2 }}//led灯花样显示样式3子程序void style_3(void){ unsigned char j,k;//led灯花样显示样式3子程序 k=5;//设置k值为5 for(j=1;j<=3;j++) { digitalWrite(j,HIGH);//点亮灯 digitalWrite(j+k,HIGH);//点亮灯 delay(400);//延时400ms digitalWrite(j,LOW);//熄灭灯 digitalWrite(j+k,LOW);//熄灭灯 k -=2;//k值减2 } k=3;//设置k值为3 for(j=2;j>=1;j--) { digitalWrite(j,HIGH);//点亮灯 digitalWrite(j+k,HIGH);//点亮灯 delay(400);//延时400ms digitalWrite(j,LOW);//熄灭灯 digitalWrite(j+k,LOW);//熄灭灯 k +=2;//k值加2 } }void setup(){ unsigned char i; for(i=1;i<=6;i++)//依次设置1~6个数字引脚为输出模式 pinMode(i,OUTPUT);//设置第i个引脚为输出模式}void loop(){ style_1();//样式1 flash();//闪烁 style_2();//样式2 flash();//闪烁 style_3();//样式3 flash();//闪烁}

复制代码

上面这段代码的效果视频如下:http://player.youku.com/player.php/sid/XMjg0MjA2Njk2/v.swf上面的代码分为4个子事宜,样式1,样式2,样式3和闪烁。
闪烁:1-6号灯亮,延时200ms,1-6号灯熄灭,延时200ms。
效果视频如下:http://player.youku.com/player.php/sid/XMjg0MjAxMDgw/v.swf样式1:1-6号灯逐个点亮,然后6-1逐个熄灭。
效果视频如下:http://player.youku.com/player.php/sid/XMjgzOTA0Mjk2/v.swf样式2:3,4号灯先亮,然后2,5号再亮,末了1,6号两。
接着1,6号灯熄灭,再2,5号熄灭,末了3,4号熄灭。
效果视频如下:http://player.youku.com/player.php/sid/XMjg0MjAwNTA0/v.swf样式三:3,4号灯亮,然后3,4号熄灭2,5号亮,然后2,5号熄灭1,6号亮,再1,6号熄灭2,5号亮,末了2,5号熄灭3,4号亮。
效果视频如下:http://player.youku.com/player.php/sid/XMjg0MjAwNzc2/v.swf通过以上4种事宜的组合,就可以做出来各种效果。
arduino学习条记17蜂鸣器实验

本次实验所用的为下图所示的这种小型无源蜂鸣器

通过上网查询参数,得到其事情电压为5V,和arduino掌握板数字端口输出电压同等,以是不须要接电阻。
可直接接上利用。
先大略先容一下这种小型蜂鸣器。
小型蜂鸣器因其体积小(直径只有6mm)、重量轻、价格低、构造牢固,而广泛地运用在各种须要发声的电器设备、电子制作和单片机等电路中。
这种蜂鸣器分有源蜂鸣器与无源蜂鸣器下图为有源蜂鸣器

下图为无源蜂鸣器

从外不雅观上看,两种蜂鸣器彷佛一样,如果将蜂鸣器引脚朝上时,可以看到,有绿色电路板的是一种无源蜂鸣器,没有电路板而利用黑胶密封的是一种有源蜂鸣器。
从外不雅观上并不能绝对的区分出有源与无源,最可靠的做法除了查看产品的参数手册以外,还有便是利用万用表测试蜂鸣器电阻,只有8Ω或者16Ω的是无源蜂鸣器,电阻在几百欧以上的是有源蜂鸣器。
有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可以连续发声,而无源蜂鸣器则和电磁扬声器一样,须要接在音频输出电路中才能发声。
大略先容完蜂鸣器往后先看一下硬件连接示意图

把下面的代码上传到arduino掌握板上,看看实验结果。

int buzzer=7;//设置掌握蜂鸣器的数字IO脚void setup(){ pinMode(buzzer,OUTPUT);//设置数字IO脚模式,OUTPUT为输出}void loop(){ unsigned char i,j;//定义变量 while(1) { for(i=0;i<80;i++)//输出一个频率的声音 { digitalWrite(buzzer,HIGH);//发声音 delay(1);//延时1ms digitalWrite(buzzer,LOW);//不发声音 delay(1);//延时ms } for(i=0;i<100;i++)//输出另一个频率的声音 { digitalWrite(buzzer,HIGH);//发声音 delay(2);//延时2ms digitalWrite(buzzer,LOW);//不发声音 delay(2);//延时2ms } }}

复制代码

实验效果如下面视频(须要开音响才能听到蜂鸣器发出的声音)http://player.youku.com/player.php/sid/XMjgzNzQ4OTU2/v.swf第一个频率的声音为1毫秒发声1毫秒不发声。
1秒即是1000毫秒,2毫秒为一个周期。
得出频率为500赫兹。
第二个频率的声音为2毫秒发声2毫秒不发声,4毫秒为一个周期。
得出频率为250赫兹。
一个事宜的循环便是500赫兹的声音响80毫秒,然后250赫兹的声音响100毫秒。
如此循环下去。
while()函数本次试验利用到了while()函数在loop()中用while也是一个循环语句,一样平常形式:while(表达式)语句表达式是循环条件,语句是循环体。
语义是:打算表达式的值,当值为真(非0)时,实行循环体语句。
其实行过程可用下图表: 浸染:实现“当型”循环。
当“表达式”非0(真)是,实行“语句”。
“语句”是被循环实行的程序,称为“循环体”。
arduino学习条记18数码管实验

数码管先容数码管是一种半导体发光器件,其基本单元是发光二极管。
数码管按段数分为七段数数码管和八段数数码管,八段数数码管比七段数数码管多一个发光二极管单元(多一个小数点显示)发光二极管单元连接办法分为共阳数码管和共阴数码管。
共阳数码管是指将所有发光二极管的阳极连接到一起形成公共阳极(COM)的数码管。
共阳数码管在运用时应将公共极PWR接到电源输入PWR上,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管则更好相反,阴极连接到一起形成了公共阴极,阳极是独立分开的。
先来看一下本次实验利用的数码管。
通过查询型号LG5011BSR得知其为0.5"单联共阳数码管,下面是其引脚图。

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

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

//设置掌握各段的数字IO脚,详细几号引脚对应哪一段,来源为数码管官方引脚图。
int a=7;int b=6;int c=5;int d=11;int e=10;int f=8;int g=9;int dp=4;//显示数字1void digital_1(void){ unsigned char j; digitalWrite(c,LOW);//给数字5引脚低电平,点亮c段 digitalWrite(b,LOW);//点亮b段 for(j=7;j<=11;j++)//熄灭别的段 digitalWrite(j,HIGH); digitalWrite(dp,HIGH);//熄灭小数点DP段}//显示数字2void digital_2(void){ unsigned char j; digitalWrite(b,LOW); digitalWrite(a,LOW); for(j=9;j<=11;j++) digitalWrite(j,LOW); digitalWrite(dp,HIGH); digitalWrite(c,HIGH); digitalWrite(f,HIGH);}//显示数字3void digital_3(void){ unsigned char j; digitalWrite(g,LOW); digitalWrite(d,LOW); for(j=5;j<=7;j++) digitalWrite(j,LOW); digitalWrite(dp,HIGH); digitalWrite(f,HIGH); digitalWrite(e,HIGH);}//显示数字4void digital_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); }//显示数字5void digital_5(void){ unsigned char j; for(j=7;j<=9;j++) digitalWrite(j,LOW); digitalWrite(c,LOW); digitalWrite(d,LOW); digitalWrite(dp,HIGH); digitalWrite(b,HIGH); digitalWrite(e,HIGH); }//显示数字6void digital_6(void){ unsigned char j; for(j=7;j<=11;j++) digitalWrite(j,LOW); digitalWrite(c,LOW); digitalWrite(dp,HIGH); digitalWrite(b,HIGH); }//显示数字7void digital_7(void){ unsigned char j; for(j=5;j<=7;j++) digitalWrite(j,LOW); digitalWrite(dp,HIGH); for(j=8;j<=11;j++) digitalWrite(j,HIGH);}//显示数字8void digital_8(void){ unsigned char j; for(j=5;j<=11;j++) digitalWrite(j,LOW); digitalWrite(dp,HIGH);}void setup(){ int i;//定义变量 for(i=4;i<=11;i++) pinMode(i,OUTPUT);//设置4~11引脚为输出模式}void loop(){ while(1) { digital_1();//数字1 delay(2000);//延时2s digital_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掌握板上,看看效果。

int key=7;//设置LED的数字IO脚void setup(){ pinMode(key,OUTPUT);//设置数字IO引脚为输出模式}void loop(){ int i;//定义变量 while(1) { i=analogRead(5);//读取仿照5口电压值 if(i>1000)//如果电压值大于1000(即4.88V) digitalWrite(key,HIGH);//设置第七引脚为高电平,点亮led灯 else digitalWrite(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学习条记20 PWM掌握LED实验 PWM讲解

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

/本次实验演示如何通过analogWrite()命令使连接9号端口的LED灯亮度逐渐变革 /int brightness = 0; //定义整数型变量brightness与其初始值,此变量用来表示LED的亮度。
int fadeAmount = 5; //定义整数型变量fadeAmount,此变量用来做亮度变革的增减量。
void setup() { pinMode(9, OUTPUT);// 设置9号口为输出端口:} void loop() { 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端口。
Arduino Mega掌握板,可以事情于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-width modulation)脉宽调制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频率的倒数。
换句话说,如果arduino PWM的频率是500Hz,那么两绿线之间的周期便是2毫秒。
analogWrite() 命令中可以操控的范围为0-255, analogWrite(255)表示100%占空比(常开), analogWrite(127)占空频年夜约为50%(一半的韶光)。

传统方法实现PWM除了利用analogWrite()命令实现PWM,还可以通过传统方法来掌握电平的开关韶光来设置。
请看如下代码

void setup(){ pinMode(13, OUTPUT);//设定13号端口为输出}void loop(){ 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脚int a=7;int b=6;int c=5;int d=11;int e=10;int f=8;int g=9;int dp=4;//显示数字1void digital_1(void){ unsigned char j; digitalWrite(c,LOW);//给数字5引脚低电平,点亮c段 digitalWrite(b,LOW);//点亮b段 for(j=7;j<=11;j++)//熄灭别的段 digitalWrite(j,HIGH); digitalWrite(dp,HIGH);//熄灭小数点DP段}//显示数字2void digital_2(void){ unsigned char j; digitalWrite(b,LOW); digitalWrite(a,LOW); for(j=9;j<=11;j++) digitalWrite(j,LOW); digitalWrite(dp,HIGH); digitalWrite(c,HIGH); digitalWrite(f,HIGH);}//显示数字3void digital_3(void){ unsigned char j; digitalWrite(g,LOW); digitalWrite(d,LOW); for(j=5;j<=7;j++) digitalWrite(j,LOW); digitalWrite(dp,HIGH); digitalWrite(f,HIGH); digitalWrite(e,HIGH);}//显示数字4void digital_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); }//显示数字5void digital_5(void){ unsigned char j; for(j=7;j<=9;j++) digitalWrite(j,LOW); digitalWrite(c,LOW); digitalWrite(d,LOW); digitalWrite(dp,HIGH); digitalWrite(b,HIGH); digitalWrite(e,HIGH); }//显示数字6void digital_6(void){ unsigned char j; for(j=7;j<=11;j++) digitalWrite(j,LOW); digitalWrite(c,LOW); digitalWrite(dp,HIGH); digitalWrite(b,HIGH); }//显示数字7void digital_7(void){ unsigned char j; for(j=5;j<=7;j++) digitalWrite(j,LOW); digitalWrite(dp,HIGH); for(j=8;j<=11;j++) digitalWrite(j,HIGH);}//显示数字8void digital_8(void){ unsigned char j; for(j=5;j<=11;j++) digitalWrite(j,LOW); digitalWrite(dp,HIGH);}void setup(){ int i; for(i=4;i<=11;i++) { pinMode(i,OUTPUT);//设置4~11口为输出模式 }}void loop(){ while(1) { digital_1();//显示数字1 while(analogRead(0)>1000);//如果读到仿照0口的值1000则解释有按键按下 delay(100);//延时200ms digital_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。

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

int photocellPin = 2; //定义变量photocellsh=2,为电压读取端口。
int ledPin = 12; //定义变量ledPin=12,为led电平输出端口int val = 0; //定义val变量的起始值void setup() { pinMode(ledPin, OUTPUT); //使ledPin为输出模式} void loop() { 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学习条记23 1602液晶实验

本次试验利用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—D7 8 位双向并行总线,用来传送命令和数据。
7、BLA是背光源正极,BLK是背光源负极。
1602液晶的基本操作分以下四种:

下图便是1602液晶实物图

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

代码如下

int DI = 12;int RW = 11;int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//利用数组来定义总线须要的管脚int Enable = 2;void LcdCommandWrite(int value) {// 定义所有引脚int i = 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}void LcdDataWrite(int value) {// 定义所有引脚int i = 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}void setup (void) {int i = 0;for (i=Enable; i <= DI; i++) { pinMode(i,OUTPUT);}delay(100);// 短暂的停顿后初始化LCD// 用于LCD掌握须要LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5x7笔墨大小 delay(64); LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5x7笔墨大小 delay(50); LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5x7笔墨大小 delay(20); LcdCommandWrite(0x06); // 输入办法设定 // 自动增量,没有显示移位delay(20); LcdCommandWrite(0x0E); // 显示设置 // 开启显示屏,光标显示,无闪烁delay(20); LcdCommandWrite(0x01); // 屏幕清空,光标位置归零 delay(100); LcdCommandWrite(0x80); // 显示设置 // 开启显示屏,光标显示,无闪烁delay(20); }void loop (void) { LcdCommandWrite(0x01); // 屏幕清空,光标位置归零 delay(10); LcdCommandWrite(0x80+3); delay(10); // 写入欢迎信息 LcdDataWrite('W'); LcdDataWrite('e'); LcdDataWrite('l'); LcdDataWrite('c'); LcdDataWrite('o'); LcdDataWrite('m'); LcdDataWrite('e'); LcdDataWrite(' '); LcdDataWrite('t'); LcdDataWrite('o'); delay(10); LcdCommandWrite(0xc0+1); // 定义光标位置为第二行第二个位置 delay(10); LcdDataWrite('g'); LcdDataWrite('e'); LcdDataWrite('e'); LcdDataWrite('k'); LcdDataWrite('-'); LcdDataWrite('w'); LcdDataWrite('o'); LcdDataWrite('r'); LcdDataWrite('k'); LcdDataWrite('s'); LcdDataWrite('h'); LcdDataWrite('o'); LcdDataWrite('p'); delay(5000); LcdCommandWrite(0x01); // 屏幕清空,光标位置归零 delay(10); LcdDataWrite('I'); LcdDataWrite(' '); LcdDataWrite('a'); LcdDataWrite('m'); LcdDataWrite(' '); LcdDataWrite('h'); LcdDataWrite('o'); LcdDataWrite('n'); LcdDataWrite('g'); LcdDataWrite('y'); LcdDataWrite('i'); delay(3000); LcdCommandWrite(0x02); //设置模式为新笔墨更换老笔墨,无新笔墨的地方显示不变。
delay(10); LcdCommandWrite(0x80+5); //定义光标位置为第一行第六个位置 delay(10); LcdDataWrite('t'); LcdDataWrite('h'); LcdDataWrite('e'); LcdDataWrite(' '); LcdDataWrite('a'); LcdDataWrite('d'); LcdDataWrite('m'); LcdDataWrite('i'); LcdDataWrite('n'); delay(5000);}

复制代码

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

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

int LCD1602_RS=12; int LCD1602_RW=11; int LCD1602_EN=10; int DB[] = { 6, 7, 8, 9};char str1[]="Welcome to";char str2[]="geek-workshop";char str3[]="this is the";char str4[]="4-bit interface";void LCD_Command_Write(int command){int i,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);}void LCD_Data_Write(int dat){int i=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);}void LCD_SET_XY( int x, int y ){ int address; if (y ==0) address = 0x80 + x; else address = 0xC0 + x; LCD_Command_Write(address); }void LCD_Write_Char( int x,int y,int dat){ LCD_SET_XY( x, y ); LCD_Data_Write(dat);}void LCD_Write_String(int X,int Y,char s){ LCD_SET_XY( X, Y ); //设置地址 while (s) //写字符串 { LCD_Data_Write(s); s ++; }}void setup (void) { int i = 0; for (i=6; i <= 12; i++) { pinMode(i,OUTPUT); } delay(100); LCD_Command_Write(0x28);//4线 2行 5x7 delay(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); }void loop (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代表的是十六进制的数值"38","0x"的意思便是十六进制。
先打开win7下的打算器,选择“程序员”“基本”,

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

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

以8位掌握法接LCD是,对应的掌握信息便是“00111000”

同理,也可以把二进制的掌握信息,逆运算为十六进制的。
有的产品解释书写的掌握命令是"38H"这里解释一下,一样平常情形下十六进制 前缀0x 后缀h 十进制 后缀D八进制 后缀Q二进制 后缀B但是不同的程序措辞,对付十六进制的表达办法不完备相同,在arduino下,表达十六进制数值“38”只能利用“0x38”而不能用“38H”末了放三个附件,是三个不同厂家的1602 LCD手册,供大家深入研究。

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

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

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

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

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

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

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

代码如下

#include <LiquidCrystal.h> //调用arduino自带的LiquidCrystal库LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//设置接口int potPin = 4; //设置仿照口4为LM35的旗子暗记输入端口float temperature = 0; //设置temperature为浮点变量long val=0; //设置val为长整数变量void setup(){ lcd.begin(16, 2); //初始化LCDlcd.print("LM35 Thermometer"); //使屏幕显示笔墨LM35 Thermometerdelay(1000); //延时1000ms}void loop () {val = analogRead(potPin); //val变量为从LM35旗子暗记口读取到的数值temperature = ((val+1)0.00488281251000); //把读取到的val转换为温度数值的10倍lcd.clear(); //清屏lcd.print("LM35 Thermometer"); //使屏幕显示笔墨LM35 Thermometerlcd.setCursor(0, 1) ; //设置光标位置为第二行第一个位置lcd.print((long)temperature / 10); //显示温度整数位lcd.print("."); //显示小数点lcd.print( (long)temperature % 10); //显示温度小数点后一位lcd.print((char)223); //显示o符号lcd.print("C"); //显示字母Cdelay(2000); //延时2秒,这里也便是刷新速率。
}

复制代码

实验效果如下,为了使温度发生变革,用一个装了热水的塑料杯,放在传感器阁下。
http://player.youku.com/player.php/sid/XMjg3NjYyMjI0/v.swf关于LiquidCrystal库利用的更详细方法,请查看arduino官方先容。
http://arduino.cc/en/Reference/LiquidCrystal附件为LM35的产品解释书

LM35产品解释书.pdf (303.72 KB, 下载次数: 0)

arduino学习条记25 ADXL345加速度传感器实验

前两天我们做了温度传感器实验,大家一定还有印象。
本日我们来研究其余一种传感器加速度传感器。
什么是加速度传感器加速度传感器,浸染是丈量在加速过程中产生的力。
最基本的如咱们平常所熟习的是重力加速度,大小是1g。
加速度传感器一样平常用于什么地方通过丈量由重力引起的加速度,你可以打算出设备相对付水平面的倾斜角度。
通过剖析动态加速度,你可以剖析出设备的移动办法。
自平衡车中便是利用加速度传感器与陀螺仪进行卡尔曼滤波进行姿态纠正。
本次试验利用的ADXL345数字传感器,通过I2C或者SPI接口直接输出数字旗子暗记。
在1g的加速度下,输出数值为256.

2011-7-28 22:56:15 上传

下载附件 (24.89 KB)

下面是硬件连接图

2011-7-29 22:16:48 上传

下载附件 (112.73 KB)

2011-7-29 15:58:16 上传

下载附件 (164.15 KB)

2011-7-28 22:56:16 上传

下载附件 (203.65 KB)

下面是代码

#include <Wire.h> //调用arduino自带的I2C库#include <LiquidCrystal.h> //调用arduino自带的LiquidCrystal库#define Register_ID 0#define Register_2D 0x2D#define Register_X0 0x32#define Register_X1 0x33#define Register_Y0 0x34#define Register_Y1 0x35#define Register_Z0 0x36#define Register_Z1 0x37LiquidCrystal lcd(12, 11, 10, 9, 8, 7);//设置接口int ADXAddress = 0xA7>>1; //转换为7位地址int reading = 0;int val = 0;int X0,X1,X_out;int Y0,Y1,Y_out;int Z1,Z0,Z_out;double Xg,Yg,Zg;void setup(){ lcd.begin(16, 2); //初始化LCD delay(100); Wire.begin(); //初始化I2C delay(100); Wire.beginTransmission(ADXAddress); Wire.send(Register_2D); Wire.send(8); Wire.endTransmission();}void loop(){ Wire.beginTransmission(ADXAddress); Wire.send(Register_X0); Wire.send(Register_X1); Wire.endTransmission(); Wire.requestFrom(ADXAddress,2); if(Wire.available()<=2); { X0 = Wire.receive(); X1 = Wire.receive(); X1 = X1<<8; X_out = X0+X1; } Wire.beginTransmission(ADXAddress); Wire.send(Register_Y0); Wire.send(Register_Y1); Wire.endTransmission(); Wire.requestFrom(ADXAddress,2); if(Wire.available()<=2); { Y0 = Wire.receive(); Y1 = Wire.receive(); Y1 = Y1<<8; Y_out = Y0+Y1; } Wire.beginTransmission(ADXAddress); Wire.send(Register_Z0); Wire.send(Register_Z1); Wire.endTransmission(); Wire.requestFrom(ADXAddress,2); if(Wire.available()<=2); { Z0 = Wire.receive(); Z1 = Wire.receive(); Z1 = Y1<<8; Z_out = Y0+Y1; } Xg = X_out/256.00;//把输出结果转换为重力加速度g,精确到小数点后2位。
Yg = Y_out/256.00; Zg = Z_out/256.00; lcd.clear(); //清屏 lcd.print("X="); //使屏幕显示笔墨X= lcd.print(Xg); lcd.setCursor(8, 0); lcd.print("Y="); lcd.print(Yg); lcd.setCursor(0, 1); lcd.print("Z="); lcd.print(Zg); delay(500); //延时0.5秒,刷新频率这里进行调度}

复制代码

试验效果如下附件为ADXL345中文手册

ADXL345中文PDF.pdf

arduino学习条记26 4位数码管实验

这次我们进行的实验是利用arduino驱动一块共阳四位数码管。
驱动数码管限流电阻肯定是必不可少的,限流电阻有两种接法,一种是在d1-d4阳极接,统共接4颗。
这种接法好处是需求电阻比较少,但是会产生每一位上显示不同数字亮度会不一样,1最亮,8最暗。
其余一种接法便是在其他8个引脚上接,这种接法亮度显示均匀,但是用电阻较多。
本次实验利用8颗220Ω电阻(由于没有100Ω电阻,以是利用220Ω的代替,100欧姆亮度会比较高)。
下图为4位数码管

23 分钟前 上传

下载附件 (118.5 KB)

4位数码管统共有12个引脚,小数点朝下正放在面前时,左下角为1,其他管脚顺序为逆时针旋转。
左上角为最大的12号管脚。

23 分钟前 上传

下载附件 (62.87 KB)

下图为数码管的解释手册

23 分钟前 上传

下载附件 (143.54 KB)

下面是硬件连接图

23 分钟前 上传

下载附件 (154.12 KB)

18 分钟前 上传

下载附件 (202.16 KB)

把下面的代码复制下载到掌握板中,看看效果。

//设置阴极接口int a = 1;int b = 2;int c = 3;int d = 4;int e = 5;int f = 6;int g = 7;int p = 8;//设置阳极接口int d4 = 9;int d3 = 10;int d2 = 11;int d1 = 12;//设置变量int del = 100;int buttoncount = 0;int loopcount = 0;void setup(){ pinMode(d1, OUTPUT); pinMode(d2, OUTPUT); pinMode(d3, OUTPUT); pinMode(d4, OUTPUT); pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(p, OUTPUT); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(p, HIGH);}void loop(){ roulette(4); //轮转效果 delay(100); zigzag(2); //Z字型效果 delay(100); circles(4); //圈状效果 delay(100);}void pickDigit(int x) //定义pickDigit(x),其浸染是开启dx端口{ digitalWrite(d1, LOW); digitalWrite(d2, LOW); digitalWrite(d3, LOW); digitalWrite(d4, LOW); switch(x) { case 1: digitalWrite(d1, HIGH); break; case 2: digitalWrite(d2, HIGH); break; case 3: digitalWrite(d3, HIGH); break; default: digitalWrite(d4, HIGH); break; }}void clearLEDs() //清屏{ digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(p, HIGH);}void roulette(int x) //设置轮转效果{ loopcount = 0; while (loopcount < x) { digitalWrite(a, LOW); pickDigit(1); delay(del); pickDigit(2); delay(del); pickDigit(3); delay(del); pickDigit(4); delay(del); digitalWrite(a, HIGH); digitalWrite(b, LOW); delay(del); digitalWrite(b, HIGH); digitalWrite(c, LOW); delay(del); digitalWrite(c, HIGH); digitalWrite(d, LOW); delay(del); pickDigit(3); delay(del); pickDigit(2); delay(del); pickDigit(1); delay(del); digitalWrite(d, HIGH); digitalWrite(e, LOW); delay(del); digitalWrite(e, HIGH); digitalWrite(f, LOW); delay(del); clearLEDs(); loopcount++; }}void zigzag(int x) //设置Z字形效果{ loopcount = 0; while(loopcount < x) { digitalWrite(a, LOW); pickDigit(1); delay(del); pickDigit(2); delay(del); pickDigit(3); delay(del); pickDigit(4); delay(del); digitalWrite(a, HIGH); digitalWrite(b, LOW); delay(del); digitalWrite(b, HIGH); digitalWrite(g, LOW); delay(del); pickDigit(3); delay(del); pickDigit(2); delay(del); pickDigit(1); delay(del); digitalWrite(g, HIGH); digitalWrite(e, LOW); delay(del); digitalWrite(e, HIGH); digitalWrite(d, LOW); delay(del); pickDigit(2); delay(del); pickDigit(3); delay(del); pickDigit(4); delay(del); digitalWrite(d, HIGH); digitalWrite(c, LOW); delay(del); digitalWrite(c, HIGH); digitalWrite(g, LOW); delay(del); pickDigit(3); delay(del); pickDigit(2); delay(del); pickDigit(1); delay(del); digitalWrite(g, HIGH); digitalWrite(f, LOW); delay(del); clearLEDs(); loopcount++; }}void circles(int x) //设置圈状效果{ loopcount = 0; while (loopcount < x) { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); pickDigit(1); delay(250); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(f, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); pickDigit(2); delay(250); digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(f, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); pickDigit(3); delay(250); digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(f, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); pickDigit(4); delay(250); clearLEDs(); loopcount++; }}

复制代码

上面代码效果如下,为3种花样组成。
再把下面代码复制下载到掌握板中,看看效果。

//设置阴极接口int a = 1;int b = 2;int c = 3;int d = 4;int e = 5;int f = 6;int g = 7;int p = 8;//设置阳极接口int d4 = 9;int d3 = 10;int d2 = 11;int d1 = 12;//设置变量long n = 0;int x = 100;int del = 55; //此处数值对时钟进行微调void setup(){ pinMode(d1, OUTPUT); pinMode(d2, OUTPUT); pinMode(d3, OUTPUT); pinMode(d4, OUTPUT); pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(p, OUTPUT);}void loop(){ clearLEDs(); pickDigit(1); pickNumber((n/x/1000)%10); delayMicroseconds(del); clearLEDs(); pickDigit(2); pickNumber((n/x/100)%10); delayMicroseconds(del); clearLEDs(); pickDigit(3); dispDec(3); pickNumber((n/x/10)%10); delayMicroseconds(del); clearLEDs(); pickDigit(4); pickNumber(n/x%10); delayMicroseconds(del); n++; if (digitalRead(13) == HIGH) { n = 0; }}void pickDigit(int x) //定义pickDigit(x),其浸染是开启dx端口{ digitalWrite(d1, LOW); digitalWrite(d2, LOW); digitalWrite(d3, LOW); digitalWrite(d4, LOW); switch(x) { case 1: digitalWrite(d1, HIGH); break; case 2: digitalWrite(d2, HIGH); break; case 3: digitalWrite(d3, HIGH); break; default: digitalWrite(d4, HIGH); break; }}void pickNumber(int x) //定义pickNumber(x),其浸染是显示数字x{ switch(x) { default: zero(); break; case 1: one(); break; case 2: two(); break; case 3: three(); break; case 4: four(); break; case 5: five(); break; case 6: six(); break; case 7: seven(); break; case 8: eight(); break; case 9: nine(); break; }}void dispDec(int x) //设定开启小数点{ digitalWrite(p, LOW);}void clearLEDs() //清屏{ digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(p, HIGH);}void zero() //定义数字0时阴极那些管脚开关{ digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH);}void one() //定义数字1时阴极那些管脚开关{ digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH);}void two() //定义数字2时阴极那些管脚开关{ digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, LOW);}void three() //定义数字3时阴极那些管脚开关{ digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW);}void four() //定义数字4时阴极那些管脚开关{ digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW);}void five() //定义数字5时阴极那些管脚开关{ digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW);}void six() //定义数字6时阴极那些管脚开关{ digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW);}void seven() //定义数字7时阴极那些管脚开关{ digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH);}void eight() //定义数字8时阴极那些管脚开关{ digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW);}void nine() //定义数字9时阴极那些管脚开关{ digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW);}

复制代码

这次的代码为大略单纯的秒表,效果如下,精准度不是很高,须要大家微调参数。

arduino学习条记27 DHT11数字温湿度传感器的利用

概述

DHT11 数字温湿度传感器是一款含有已校准数字旗子暗记输出的温湿度复合传感器。
它运用专用的数字模块采集技能

和温湿度传感技能,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC 测

温元件,并与一个高性能8 位单片机相连接。
因此该产品具有品质卓越、超快相应、抗滋扰能力强、性价比极高档优

点。
每个DHT11 传感器都在极为精确的湿度校验室中进行校准。
校准系数以程序的形式储存在OTP 内存中,传感器内

部在检测旗子暗记的处理过程中要调用这些校准系数。
单线制串行接口,使系统集成变得大略单纯快捷。
超小的体积、极低的

功耗,旗子暗记传输间隔可达20 米以上,使其成为各种运用乃至最为苛刻的运用处所的最佳选则。

DHT11 数字温湿度传感器模块为3 针PH2.0 封装。
连接方便。

性能描述

1. 供电电压:3-5.5V

2. 供电电流:最大2.5Ma

3. 温度范围:0-50℃ 偏差±2℃

4. 湿度范围:20-90%RH 偏差±5%RH

5. 相应韶光: 1/e(63%) 6-30s

6. 丈量分辨率分别为 8bit(温度)、8bit(湿度)

7. 采样周期间隔不得低于1 秒钟

8. 模块尺寸:30x20mm

传感器的时序

DATA 用于微处理器与 DHT11之间的通讯和同步,采取单总线数据格式,一次通讯韶光4ms旁边,数据分小数部分和

整数部分,详细魄式不才面解释,当前小数部分用于往后扩展,现读出为零.操作流程如下:

一次完全的数据传输为40bit,高位先出。

数据格式:

8bit湿度整数数据+8bit湿度小数数据

+8bi温度整数数据+8bit温度小数数据

+8bit校验和

数据传送精确时校验和数据即是“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。

用户MCU发送一次开始旗子暗记后,DHT11从低功耗模式转换到高速模式,等待主机开始旗子暗记结束后,DHT11发送相应旗子暗记,

送出40bit的数据,并触发一次旗子暗记采集,用户可选择读取部分数据.从模式下,DHT11吸收到开始旗子暗记触发一次温湿度采集,如果没有吸收到主机发送开始旗子暗记,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。

模块的利用

将 DHT11 模块接到Arduino 传感器扩展板的仿照口0

代码如下:

#define DHT11_PIN 0 // ADC0 接到仿照口0

byte read_dht11_dat()

{

byte i = 0;

byte result=0;

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

while(!(PINC & _BV(DHT11_PIN))); // wait for 50us

delayMicroseconds(30);

if(PINC & _BV(DHT11_PIN))

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

while((PINC & _BV(DHT11_PIN))); // wait '1' finish

}

return result;

}

void setup()

{

DDRC |= _BV(DHT11_PIN);

PORTC |= _BV(DHT11_PIN);

Serial.begin(19200);

Serial.println("Ready");

}

void loop()

{

byte dht11_dat[5];

byte dht11_in;

byte i;

// start condition

// 1. pull-down i/o pin from 18ms

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("dht11 start condition 1 not met");

return;

}

delayMicroseconds(80);

dht11_in = PINC & _BV(DHT11_PIN);

if(!dht11_in){

Serial.println("dht11 start condition 2 not met");

return;

}

delayMicroseconds(80);

// now ready for data reception

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

dht11_dat[i] = read_dht11_dat();

DDRC |= _BV(DHT11_PIN);

PORTC |= _BV(DHT11_PIN);

byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];

// check check_sum

if(dht11_dat[4]!= dht11_check_sum)

{

Serial.println("DHT11 checksum error");

}

Serial.print("Current humdity = ");

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

Serial.print(".");

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

Serial.print("% ");

Serial.print("temperature = ");

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

Serial.print(".");

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

Serial.println("C ");

delay(2000);

}

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

相关文章

我国土地利用分类代码的构建与应用

土地利用分类代码是我国土地管理的重要组成部分,是土地资源调查、规划、利用和保护的依据。土地利用分类代码的构建与应用显得尤为重要。本...

SEO优化 2025-02-18 阅读1 评论0

微信跳转微信支付便捷支付体验的秘密武器

移动支付已成为人们日常生活中不可或缺的一部分。作为我国领先的社交平台,微信支付凭借其便捷、安全的支付方式,深受广大用户的喜爱。而微...

SEO优化 2025-02-18 阅读1 评论0

探寻会计科目代码背后的奥秘分类与

会计科目代码是会计信息系统中不可或缺的组成部分,它将企业的经济活动进行分类和归纳,为会计核算、财务分析和决策提供重要依据。本文将从...

SEO优化 2025-02-18 阅读1 评论0