int val = 0; //定义变量存以储读值 void setup() {
pinMode(ledPin,OUTPUT); //设置引脚为输出引脚 }
void loop() {
val = analogRead(analogPin); //从输入引脚读取数值
analogWrite(ledPin,val / 4); // 以val / 4的数值点亮LED(因为analogRead读取的数值从0到1023,而analogWrite输出的数值从0到255) } 高级 I/O tone()
在一个引脚上产生一个特定频率的方波(50%占空比)。持续时间可以设定,否则波形会一直产生直到调用noTone()函数。该引脚可以连接压电蜂鸣器或其他喇叭播放声音。
在同一时刻只能产生一个声音。如果一个引脚已经在播放音乐,那调用tone()将不会有任何效果。如果音乐在同一个引脚上播放,它会自动调整频率。
使用tone()函数会与3脚和11脚的PWM产生干扰(Mega板除外)。
注意:如果你要在多个引脚上产生不同的音调,你要在对下一个引脚使用tone()函数前对此引脚调用noTone()函数。 tone(pin, frequency)
tone(pin, frequency, duration) pin:要产生声音的引脚
frequency: 产生声音的频率,单位Hz,类型unsigned int duration:声音持续的时间,单位毫秒(可选),类型unsigned long
noTone()
停止由tone()产生的方波。如果没有使用tone()将不会有效果。 noTone(pin)
pin: 所要停止产生声音的引脚
shiftOut()
将一个数据的一个字节一位一位的移出。从最高有效位(最左边)或最低有效位(最右边)开始。依次向数据脚写入每一位,之后时钟脚被拉高或拉低,指示刚才的数据有效。
注意:如果你所连接的设备时钟类型为上升沿,你要确定在调用shiftOut()前时钟脚为低电平,如调用digitalWrite(clockPin, LOW)。
注意:这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。
shiftOut(dataPin, clockPin, bitOrder, value) dataPin:输出每一位数据的引脚(int)
clockPin:时钟脚,当dataPin有值时此引脚电平变化(int) bitOrder:输出位的顺序,最高位优先或最低位优先 value: 要移位输出的数据(byte)
dataPin和clockPin要用pinMode()配置为输出。 shiftOut目前只能输出1个字节(8位),所以如果输出值大于255需要分两步。 //最高有效位优先串行输出 int data= 500; //移位输出高字节
shiftOut(dataPin, clock, MSBFIRST, (data >> 8)); //移位输出低字节
shiftOut(data, clock, MSBFIRST, data); //最低有效位优先串行输出 data = 500; //移位输出低字节
shiftOut(dataPin, clock, LSBFIRST, data); //移位输出高字节
shiftOut(dataPin, clock, LSBFIRST, (data >> 8)); 例子:
相应电路,查看tutorial on controlling a 74HC595 shift register //引脚连接到74HC595的ST_CP int latchPin = 8;
//引脚连接到74HC595的SH_CP int clockPin = 12; // //引脚连接到74HC595的DS int dataPin = 11; void setup() { //设置引脚为输出
pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); }
void loop() { //向上计数程序
for(J = 0; J <256; J + +){ //传输数据的时候将latchPin拉低 digitalWrite(latchpin, LOW);
shiftOut(dataPin,clockPin,LSBFIRST,J); //之后将latchPin拉高以告诉芯片 //它不需要再接受信息了
digitalWrite(latchpin, HIGH); delay(1000); } }
shiftIn()
将一个数据的一个字节一位一位的移入。从最高有效位(最左边)或最低有效位(最右边)开始。对于每个位,先拉高时钟电平,再从数据传输线中读取一位,再将时钟线拉低。
注意:这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。
shiftIn(dataPin,clockPin,bitOrder) dataPin:输出每一位数据的引脚(int)
clockPin:时钟脚,当dataPin有值时此引脚电平变化(int) bitOrder:输出位的顺序,最高位优先或最低位优先
pulseIn()
读取一个引脚的脉冲(HIGH或LOW)。例如,如果value是HIGH,pulseIn()会等待引脚变为HIGH,开始计时,再等待引脚变为LOW并停止计时。返回脉冲的长度,单位微秒。如果在指定的时间内无脉冲函数返回。
此函数的计时功能由经验决定,长时间的脉冲计时可能会出错。计时范围从10微秒至3分钟。(1秒=1000毫秒=1000000微秒) pulseIn(pin, value) pulseIn(pin, value, timeout) pin:你要进行脉冲计时的引脚号(int)。 value:要读取的脉冲类型,HIGH或LOW(int)。
timeout (可选):指定脉冲计数的等待时间,单位为微秒,默认值是1秒(unsigned long) 返回:脉冲长度(微秒),如果等待超时返回0(unsigned long) 例子: int pin = 7;
unsigned long duration; void setup() {
pinMode(pin, INPUT); }
void loop() {
duration = pulseIn(pin, HIGH);; } 时间 millis()
返回Arduino开发板从运行当前程序开始的毫秒数。这个数字将在约50天后溢出(归零) 例子:
unsigned long time; void setup(){
Serial.begin(9600); }
void loop(){
serial.print(\); time = millis();
//打印从程序开始到现在的时间 serial.println(time);
//等待一秒钟,以免发送大量的数据 delay(1000); }
参数 millis 是一个无符号长整数,试图和其他数据类型(如整型数)做数学运算可能会产生错误
micros()
返回 Arduino 开发板从运行当前程序开始的微秒数。这个数字将在约70分钟后溢出(归零)。在 16MHz 的 Arduino 开发板上(比如 Duemilanove 和 Nano),这个函数的分辨率为四微秒(即返回值总是四的倍数)。在 8MHz 的 Arduino 开发板上(比如 LilyPad),这个函数的分辨率为八微秒。
注意 :每毫秒是1,000微秒,每秒是1,000,000微秒。 例子:
unsigned long time; void setup(){
Serial.begin(9600); }
void loop(){
Serial.print(“Time:”); time = micros(); //打印从程序开始的时间 Serial.println(time); //等待一秒钟,以免发送大量的数据 delay(1000); }
delay()
使程序暂停设定的时间(单位毫秒)。(一秒等于1000毫秒) 参数:ms:暂停的毫秒数(unsigned long) 例子:
ledPin = 13 / / LED连接到数字13脚 void setup() {
pinMode(ledPin, OUTPUT); // 设置引脚为输出 }
void loop() {
digitalWrite(ledPin, HIGH); // 点亮LED delay(1000); // 等待1秒 digitalWrite(ledPin, LOW); // 灭掉LED delay(1000); // 等待一秒 }
虽然创建一个使用delay()的闪烁LED很简单,并且许多例子将很短的delay用于消除开关抖动,delay()确实拥有很多显著的缺点。在delay函数使用的过程中,读取传感器值、计算、引脚操
作均无法执行,因此,它所带来的后果就是使其他大多数活动暂停。其他操作定时的方法请参加millis()函数和它下面的例子。大多数熟练的程序员通常避免超过10毫秒的delay(),除非arduino程序非常简单。
但某些操作在delay()执行时任然能够运行,因为delay函数不会使中断失效。通信端口RX接收到得数据会被记录,PWM(analogWrite)值和引脚状态会保持,中断也会按设定的执行。
delayMicroseconds()
使程序暂停指定的一段时间(单位微秒)。一毫秒等于一千微秒,一秒等于1000000微秒。 目前,能够产生的最大的延时准确值是16383。这可能会在未来的Arduino版本中改变。对于超过几千微秒的延迟,你应该使用delay()代替。 例子:
int outPin = 8; // digital pin 8 void setup() {
pinMode(outPin,OUTPUT); //设置为输出的数字管脚 }
void loop() {
digitalWrite(outPin,HIGH); //设置引脚高电平 delayMicroseconds(50); // 暂停50微秒 digitalWrite(outPin, LOW); // 设置引脚低电平 delayMicroseconds(50); // 暂停50微秒 } 数学运算
min() max() abs()
constrain(x,a,b)【将一个数约束在一个范围内】 map(value, fromLow, fromHigh, toLow, toHigh) value:需要映射的值 fromLow:当前范围值的下限 fromHigh:当前范围值的上限 toLow:目标范围值的下限 toHigh:目标范围值的上限 例子:
void setup(){} void loop() {
int val = analogRead(0); val = map(val, 0, 1023, 0, 255); analogWrite(9, val); } 数学实现
long map(long x, long in_min, long in_max, long out_min, long out_max) {