本页为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); } }
/* 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/”]
[vc_separator]
//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(); }
//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(); }
发表评论