《Arduino程序设计基础》示例程序

本页为1至4章例程,其余部分见 示例程序进阶部分

进阶部分例程

1.6 Blink——Arduino的Hello world!

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
  This example code is in the public domain.
*/

// 在大多数Arduino控制板上 13号引脚都连接了一个标有“L”的LED灯
// 我们给13号引脚设置一个别名“led”
int led = 13;

//在板子启动或者复位重启后, setup部分的程序只会运行一次
void setup()
{                
  // 将“led”引脚设置为输出状态
  pinMode(led, OUTPUT);     
}

//setup部分程序运行完后,loop部分的程序会不断重复运行
void loop() 
{
  digitalWrite(led, HIGH);   // 点亮LED
  delay(1000);           // 等待一秒钟
  digitalWrite(led, LOW);   //通过将引脚电平拉低,关闭LED
  delay(1000);           //等待一秒钟
}

2.1.1 Arduino程序结构

void setup()
{
  // 在这里填写你的setup代码,它只会运行一次:
}

void loop() 
{
  // 在这里填写你的loop代码,它会不断重复运行:
}

2.5.1.1 实验:流水灯实验

/*
OpenJumper LED Module
流水灯效果
www.openjumper.cn
*/

void setup() 
{
  //初始化I/O口
  for(int i=2;i<8;i++)
  pinMode(i,OUTPUT);
}

void loop() 
{
  //从引脚2到引脚7,逐个点亮LED,等待1秒再熄灭LED
  for(int i=2;i<7;i++)
  {
    digitalWrite(i,HIGH);
    delay(1000);
    digitalWrite(i,LOW);   
  }
  //从引脚7到引脚2,逐个点亮LED,等待1秒再熄灭LED
  for(int i=7;i>2;i--)
  {
    digitalWrite(i,HIGH);
    delay(1000);
    digitalWrite(i,LOW);   
  } 
}

2.5.1.2 实验:按键控制LED

/*
  Button

通过2号引脚连接的按键,控制13号引脚连接的LED

备注:大多数Arduino的13号引脚上都连接了名为L的LED.

 created 2005
 by DojoDave <http://www.0j0.org>
 modified 30 Aug 2011
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/Button
*/

// 设置各引脚别名
const int buttonPin = 2;     // 连接按键的引脚
const int ledPin =  13;      // 连接LED的引脚

// 变量定义
int buttonState = 0;         // 存储按键状态的变量

void setup() {
  // 初始化LED引脚为输出状态
  pinMode(ledPin, OUTPUT);      
  // 初始化按键引脚为输入状态
  pinMode(buttonPin, INPUT);     
}

void loop(){
  // 读取按键状态并存储在变量中
  buttonState = digitalRead(buttonPin);

  // 检查按键是否被按下
  // 如果按键按下,那buttonState应该为高电平
  if (buttonState == HIGH) {     
    //点亮LED
    digitalWrite(ledPin, HIGH);  
  } 
  else {
    // 熄灭LED
    digitalWrite(ledPin, LOW); 
  }
}
[vc_separator]
/*
OpenJumper Button Module
www.openjumper.cn
*/

int buttonPin = 2;
int ledPin = 13;
int buttonState = 0; 

void setup() 
{
  //初始化I/O口
  pinMode(buttonPin,INPUT_PULLUP);
  pinMode(ledPin,OUTPUT);
}

void loop() 
{
  buttonState = digitalRead(buttonPin);
  //按住按键时,点亮LED;放开按键后,熄灭LED。
  if(buttonState==HIGH)
  {
    digitalWrite(ledPin,LOW);
  }
  else
  {
    digitalWrite(ledPin,HIGH);
  }
}

2.5.1.3 实验:新的按键控制方式

/*
OpenJumper Button Module 
按键控制LED
www.openjumper.cn
*/

int buttonPin = 2;
int ledPin = 13;
boolean ledState=false;  // 记录LED状态
boolean buttonState=true;  // 记录按键状态

void setup() 
{
//初始化I/O口
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin,OUTPUT);
}

void loop() 
{
//等待按键按下
while(digitalRead(buttonPin)==HIGH){}

  //当按键按下时,点亮或熄灭LED
  if(ledState==true)
  {
    digitalWrite(ledPin,LOW);
    ledState=!ledState;
  }
  else
  {
    digitalWrite(ledPin,HIGH);
    ledState=!ledState;
  }
  delay(500);
}

2.5.2 项目:人体感应灯(数字传感器与继电器模块)

/*
OpenJumper Example
Pyroelectric Infrared Sensor And Relay
人体感应灯
http://www.openjumper.cn/
*/

int PIRpin=2;
int RELAYpin=3;

void setup() {
  Serial.begin(9600);
  pinMode(PIRpin,INPUT);
  pinMode(RELAYpin,OUTPUT); 
}

void loop() {
  // 等待传感器检测到人
  while(!digitalRead(PIRpin)){}
  // 将灯打开10秒,然后关闭
  Serial.println("turn on");
  digitalWrite(RELAYpin,HIGH);
  delay(10000);  
  digitalWrite(RELAYpin,LOW);
  Serial.println("turn off");  
}

2.5.3 模拟I/O的使用

/*
Fading
通过analogWrite()函数实现呼吸灯效果

 */

int ledPin = 9;    // LED连接在9号引脚上

void setup()  { 
  // Setup部分不进行任何处理
} 

void loop()  { 
  // 从暗到亮,以每次加5的形式逐渐亮起来
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    // 输出PWM
    analogWrite(ledPin, fadeValue);         
    // 等待30ms,以便观察到渐变效果
    delay(30);                            
  } 

  //从亮到暗,以每次减5的形式逐渐暗下来
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    //输出PWM
    analogWrite(ledPin, fadeValue);         
    //等待30ms,以便观察到渐变效果
    delay(30);                            
  } 
}

2.5.3.1 实验:呼吸灯

/*
Fading
通过analogWrite()函数实现呼吸灯效果

 */

int ledPin = 9;    // LED连接在9号引脚上

void setup()  { 
  // Setup部分不进行任何处理
} 

void loop()  { 
  // 从暗到亮,以每次加5的形式逐渐亮起来
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    // 输出PWM
    analogWrite(ledPin, fadeValue);         
    // 等待30ms,以便观察到渐变效果
    delay(30);                            
  } 

  //从亮到暗,以每次减5的形式逐渐暗下来
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    //输出PWM
    analogWrite(ledPin, fadeValue);         
    //等待30ms,以便观察到渐变效果
    delay(30);                            
  } 
}

2.5.3.2 实验:使用电位器控制呼吸灯的呼吸频率

/*
OpenJumper LEDModule
www.openjumper.cn
*/

int ledPin = 9;  //9号引脚控制LED
int pot=A0;    //A0引脚读取电位器输出电压
void setup(){} 

void loop(){ 
  //LED逐渐变亮
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) 
  { 
    analogWrite(ledPin, fadeValue);
//读取电位器输出电压,除以5时为了缩短延时时间
int time=analogRead(pot)/5;
    delay(time);  //将time用于延时
  } 
  //LED逐渐变暗
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) 
  { 
analogWrite(ledPin, fadeValue);
    delay(analogRead(pot)/5); //读取电位器输出电压,并用于延时
  } 
}

2.5.3.3 实验:通过光敏电阻检测环境光亮度

/*
OpenJumper light sensor 
www.openjumper.cn
*/

void setup()
{
  // 初始化串口
  Serial.begin(9600);
}
void loop() 
{
// 读出当前光线强度,并输出到串口显示
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  delay(1000);
}

2.5.4 项目:电子温度计

/*
OpenJumper LM35Module
www.openjumper.cn
*/

int LM35 = A0;
void setup() 
{
  // 初始化串口通信
  Serial.begin(9600); 
}

void loop() 
{
  // 读取传感器模拟值,并计算出当前温度
  float temp = (5.0 * analogRead(LM35) * 100.0) / 1024;
  // 将温度输出至串口显示
  Serial.print("temperature   " );                       
  Serial.print(temp);           
  Serial.println("C");   
  delay(1000);                     
}

2.6.1 串口输出

int counter=0; // 计数器

void setup() {
//初始化串口
  Serial.begin(9600);
}

void loop() {
//每loop循环一次,计数器变量加1
counter = counter+1;
// 输出变量
Serial.print(counter);
// 输出字符
Serial.print(‘:’);
// 输出字符串;
Serial.println("Hellow World");
delay(1000);
}

2.6.2 串口输入

void setup() {
  //初始化串口
  Serial.begin(9600);
}

void loop() {
  // 读取输入的信息
  char ch=Serial.read();
  // 输出信息
  Serial.print(ch);
  delay(1000); 
}

2.6.3 实验:串口控制开关灯

/*
串口控制开关灯
奈何col
*/

void setup() {
  // 初始化串口
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}

void loop() {
  // 如果缓冲区中有数据,则读取并输出
if(Serial.available()>0)
  {
    char ch=Serial.read();
    Serial.print(ch);
    //开灯
    if(ch=='a')
    {
      digitalWrite(13,HIGH);
      Serial.println("turn on");
    }
    //关灯
    else if(ch=='b')
    {
      digitalWrite(13,LOW);
      Serial.println("turn off");
    }   
  }  
}

2.7.1 运行时间函数

/*
Get the run time
http://www.arduino.cn/
*/
unsigned long time1;
unsigned long time2;

void setup(){
  Serial.begin(9600);
}

void loop(){
  time1 = millis();
  time2 = micros();
  //输出系统运行时间
  Serial.print(time1);
  Serial.println("ms");
  Serial.print(time2);
  Serial.println("us");
  //等待1秒开始下一次loop循环
  delay(1000);
}

3.1.1 蜂鸣器发声

/*
Melody

Plays a melody 
This example code is in the public domain.
http://arduino.cc/en/Tutorial/Tone
*/

#include "pitches.h"

// 记录曲子的音符
int melody[] = {
  NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};

// 音符持续时间  4为四分音符, 8为八分音符
int noteDurations[] = {
  4, 8, 8, 4,4,4,4,4 };

void setup() {
  // 遍历整个曲子的音符
  for (int thisNote = 0; thisNote < 8; thisNote++) {

// noteDurations[]数组中存储的是音符的类型
// 我们需要将其换算为音符持续时间,方法如下:
    // 音符持续时间=1000ms / 音符类型
    //例如,四分音符=1000 / 4,8分音符 = 1000/8
    int noteDuration = 1000/noteDurations[thisNote];
    tone(8, melody[thisNote],noteDuration);

    // 为了能辨别出不同的音调,你需要在两个音调间设置一定的延时
    // 增加30%延时时间是比较合适的
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // 停止发声
    noTone(8);
  }
}

void loop() {
  // 程序并不重复,因此这里为空
}

3.2 项目:简易电子琴

/*
OpenJumper
蜂鸣器+触摸模块制作简易电子琴
奈何col
*/
#include "pitches.h"

void setup() {
  //初始化触摸模块连接引脚
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,INPUT);
  pinMode(5,INPUT);
  pinMode(6,INPUT);
  pinMode(7,INPUT);
  pinMode(8,INPUT);
}

void loop() {
  // 依次读出各触摸模块状态
  // 如果模块被触摸,则发出相应的音色
  if(digitalRead(2)){
    tone(10, NOTE_C5,10); //Do(523Hz)
  }
  if(digitalRead(3)){
    tone(10, NOTE_D5,10); // Re (587Hz),
  }
  if(digitalRead(4)){
    tone(10, NOTE_E5, 10); // Mi(659Hz)
  }
  if(digitalRead(5)){
    tone(10, NOTE_F5, 10); //Fa(698Hz)
  }
  if(digitalRead(6)){
    tone(10, NOTE_G5, 10); //So(784Hz)
  }
  if(digitalRead(7)){
    tone(10, NOTE_A5, 10); //La(880Hz)
  }
  if(digitalRead(8)){
    tone(10, NOTE_B5, 10); //Si(988Hz)
  }
}

3.3.1 超声波测距

/*
SR04超声波传感器驱动
串口显示检测距离
*/

// 设定SR04连接的Arduino引脚
const int TrigPin = 2; 
const int EchoPin = 3; 
float distance; 

void setup() 
{   // 初始化串口通信及连接SR04的引脚
	Serial.begin(9600); 
	pinMode(TrigPin, OUTPUT); 
    // 要检测引脚上输入的脉冲宽度,需要先设置为输入状态
	pinMode(EchoPin, INPUT); 
    Serial.println("Ultrasonic sensor:");
} 

void loop() 
{ 
    //产生一个10us的高脉冲去触发TrigPin 
	digitalWrite(TrigPin, LOW); 
	delayMicroseconds(2); 
	digitalWrite(TrigPin, HIGH); 
	delayMicroseconds(10);
	digitalWrite(TrigPin, LOW); 
    // 检测脉冲宽度,并计算出距离
	distance = pulseIn(EchoPin, HIGH)/ 58.00;
	Serial.print(distance); 
	Serial.print("cm"); 
	Serial.println(); 
	delay(1000); 
}

3.5.2 实验:外部中断触发蜂鸣器警报

/*
Arduino外部中断的使用
外部中断触发警报声
*/

//默认无遮挡,蜂鸣器发声
boolean RunBuzzer = true;

void setup()
{
  Serial.begin(9600);
  // 初始化外部中断
  // 当int.0电平由高变低时,触发中断函数Hello
  attachInterrupt(0, warning, CHANGE);
}

void loop()
{
  if(RunBuzzer)
  {
    tone(8,1000);
  }
  else
  {
    noTone(8);
  }
}

// 中断函数
void warning ()
{
  RunBuzzer=!RunBuzzer;
}

4.1 编写并使用函数,提高程序的可读性

float distance; 

void setup() 
{ 
	Set_SR04(2,3);
	Serial.begin(9600); 
} 

void loop() 
{ 
	distance=Get_SR04(2,3);
	Serial.print(distance); 
	Serial.print("cm"); 
	Serial.println(); 
	delay(1000); 
}

void Set_SR04(int TrigPin,int EchoPin)
{
	pinMode(TrigPin, OUTPUT); 
	pinMode(EchoPin, INPUT); 
}

float Get_SR04(int TrigPin,int EchoPin)
{
	digitalWrite(TrigPin, LOW); 
	delayMicroseconds(2); 
	digitalWrite(TrigPin, HIGH); 
	delayMicroseconds(10);
	digitalWrite(TrigPin, LOW); 
	float distance = pulseIn(EchoPin, HIGH) / 58.0;
	return distance;
}

4.2 使用Arduino类库

[vc_button title=”下载SR04类库” target=”_blank” color=”wpb_button” icon=”none” size=”btn-small” href=”http://x.openjumper.cn/sr04/”]
//2012-4-27 奈何col From OpenJumper.com

// 声明该程序要使用SR04类库
#include "SR04.h"

// 实例化一个SR04对象,并初始化连接的引脚
// TrigPin连接到2号引脚   EchoPin连接到3号引脚
SR04 sr04 = SR04(2,3);

void setup()
{
  // 初始化串口通信
  Serial.begin(9600); 
}

void loop()
{
  // 使用Get()函数获取当前超声波传感器返回的距离值
  // 并存入变量distance中
  float distance=sr04.Get();
// 输出测得的距离
Serial.print(distance);
  Serial.print("cm");
  Serial.println(); 
}
[vc_separator]
//2012-4-27 奈何col From OpenJumper.com

#include "SR04.h"

// 实例化两个SR04对象,并初始化连接的引脚
SR04 sr04A = SR04(2,3);
SR04 sr04B = SR04(4,5 );

void setup()
{
  // 初始化串口通信
  Serial.begin(9600); 
}

void loop()
{
  // 分别调用Get()函数获取当前超声波传感器返回的距离值
  // 并存入变量distance中
  float distanceA=sr04A.Get();
float distanceB=sr04B.Get();
// 分别输出两个超声波传感器测得的距离
Serial.print(distanceA);
  Serial.print("cm");
Serial.print(distanceB);
  Serial.print("cm");
  Serial.println(); 
}

4.3.1 编写头文件

//2012-4-27 奈何col From OpenJumper.com
#ifndef SR04_H
#define SR04_H
#if defined(ARDUINO) && ARDUINO >= 100
	#include "Arduino.h"
#else
	#include "WProgram.h"
#endif

class SR04 {
public:
	SR04(int TrigPin,int EchoPin);
	float Get();

private:
	int Trig_pin;
int Echo_pin;
	float distance;
};
#endif

4.3.7 编写.cpp文件

//2012-4-27 奈何col From OpenJumper.com
#if ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif
#include "SR04.h"

SR04::SR04(int TP, int EP)
{
   pinMode(TP,OUTPUT);
   pinMode(EP,INPUT);
   Trig_pin=TP;
   Echo_pin=EP;
}

float SR04::Get()
{
digitalWrite(Trig_pin, LOW); 
	delayMicroseconds(2); 
	digitalWrite(Trig_pin, HIGH); 
	delayMicroseconds(10);
	digitalWrite(Trig_pin, LOW); 
	float distance = pulseIn(Echo_pin, HIGH) / 58.00;
	return distance;
}

4.3.9 建立示例程序

//2012-4-27 奈何col From OpenJumper.com
#include "SR04.h"
SR04 sr04 = SR04(2,3);
void setup()
{
  Serial.begin(9600); 
}
void loop()
{
  float distance=sr04.Get();
  Serial.print(distance);
  Serial.print("cm");
  Serial.println(); 
}
发表评论

你的email 地址不会公开

你也可以使用 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

清除表单提交