Arduino开发从入门到实战程序源代码.docx
Arduino开发从入门到实战程序源代码程序源码 第五章炫酷 D LED 灯5.4.2 程序源码 /项目一LED 闪耀灯 int LEDPin=13; void setup() pinMode(LEDPin,OUTPUT);/13 脚设置为输出 void loop() digitalWrite(LEDPin,HIGH);/设定 PIN13 脚为 HIGH = 5V 左右 delay(1000); /设定延时时间,1000 = 1s digitalWrite(LEDPin,LOW);/设定 PIN13 脚为 LOW = 0Vdelay(1000); /设定延时时间,1000 = 1s 5.7 拓展试验 广告灯拓展试验参考程序为:/设置限制 LED 的数字 I/O 脚 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 依次点亮 16 引脚相连的 LED 灯 digitalWrite(j,HIGH);/点亮与 j 引脚相连的 LED 灯 delay(200); /延时 200msfor(j=6;j=1;j-)/每隔 200ms 依次熄灭与 61 引脚相连的 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+) /点亮与 16 引脚相连的 LED 灯 digitalWrite(j,HIGH); /点亮与 j 引脚相连的 LED 灯 delay(200);/延时 200msfor(j=1;j=6;j+)/熄灭与 16 引脚相连的 LED 灯 digitalWrite(j,LOW);/熄灭与 j 引脚相连的 LED 灯 delay(200); /延时 200ms/LED 灯花样显示样式 2 子程序 void style_2(void)unsigned char j,k;k=1; /设置 k 的初值为 1for(j=3;j=1;j-) digitalWrite(j,HIGH);/点亮灯 digitalWrite(j+k,HIGH);/点亮灯 delay(400); /延时 400msk +=2; /k 值加 2k=5;/设置 k 值为 5for(j=1;j=3;j+)digitalWrite(j,LOW); /熄灭灯 digitalWrite(j+k,LOW); /熄灭灯 delay(400);/延时 400msk -=2;/k 值减 2/LED 灯花样显示样式 3 子程序 void style_3(void)unsigned char j,k; /LED 灯花样显示样式 3 子程序 k=5; /设置 k 值为 5for(j=1;j=3;j+)digitalWrite(j,HIGH);/点亮灯 digitalWrite(j+k,HIGH);/点亮灯 delay(400); /延时 400msdigitalWrite(j,LOW);/熄灭灯 digitalWrite(j+k,LOW);/熄灭灯 k -=2; /k 值减 2k=3;/设置 k 值为 3for(j=2;j=1;j-) digitalWrite(j,HIGH); /点亮灯 digitalWrite(j+k,HIGH);/点亮灯 delay(400); /延时 400msdigitalWrite(j,LOW);/熄灭灯 digitalWrite(j+k,LOW); /熄灭灯 k +=2;/k 值加 2 void setup() unsigned char i;for(i=1;i=6;i+)/依次设置 16 个数字引脚为输出模式 pinMode(i,OUTPUT); /设置第 i 个引脚为输出模式 void loop() style_1(); /样式 1flash(); /闪耀 style_2();/样式 2flash(); /闪耀 style_3(); /样式 3flash();/闪耀第六章按键开关输入642 程序源码 int LED = 13; /设置限制 LED 的数字 I/O 脚 void setup()pinMode(LED,OUTPUT); /设置数字 I/O 引脚为输出模式 void loop() int i; while(1)i=analogRead(A0); /读取模拟 0 口电压值 if(igt;1000) /假如电压值大于 1000(即 4.88V) digitalWrite(LED,HIGH);/设置第 13 引脚为高电平,点亮 LED 灯 else digitalWrite(LED,LOW); /设置第 13 引脚为低电平,熄灭 LED 灯 66 拓展试验 #define LED 13 #define sw 7 int val=0; int old_val=0; int state=0;/定义状态位 void setup() pinMode(LED,OUTPUT); pinMode(sw,INPUT); void loop() val=digitalRead(sw); if(val=HIGH)amp;amp;(old_val=LOW) state=1-state; /状态位取反 delay(10); old_val=val; if(state=1) digitalWrite(LED,HIGH); else digitalWrite(LED,LOW); 第七章触摸开关742 程序源码#define LED 13/设置限制 LED 的数字 I/O 脚void setup()pinMode(LED,OUTPUT);/设置数字 I/O 引脚为输出模式 void loop() int i; while(1)i=digitalRead(10);/读取电压值 if(i=LOW) /假如为低电平 digitalWrite(LED,HIGH);/设置第 13 引脚为高电平,点亮 LED 灯 elsedigitalWrite(LED,LOW);/设置第 13 引脚为低电平,熄灭 LED 灯 76 拓展试验 #define LED 13/设置限制 LED 的数字 I/O 脚 void setup()pinMode(LED,OUTPUT);/设置数字 I/O 引脚为输出模式 void loop() int i; digitalWrite(LED,LOW); i=digitalRead(10); /读取电压值if(i=LOW)/假如为低电平 while(1) digitalWrite(LED,HIGH); /设置第 13 引脚为高电平,点亮 LED 灯 delay(10000); break; 第 第 8 8 章温度与湿度监测842 程序源码 #define DHT11_PIN 0 byte read_dht11_dat()/读取 DHT11 数据(每次获得 8 位) byte i = 0; byte result = 0; for(i=0;ilt;8;i+) while(!(PINCamp;_BV(DHT11_PIN); delayMicroseconds(30); if(PINCamp;_BV(DHT11_PIN) result|=(1lt;lt;(7-i); while(PINCamp;_BV(DHT11_PIN); return result;/返回获得的结果 void setup() DDRC|=_BV(DHT11_PIN); PORTC|=_BV(DHT11_PIN); Serial.begin(19200); Serial.println(Ready);/串口输出提示信息 void loop() byte dht11_dat5; byte dht11_in;byte i; PORTC amp;=_BV(DHT11_PIN); delay(18); PORTC|=_BV(DHT11_PIN); delayMicroseconds(40); DDRC amp;=_BV(DHT11_PIN); delayMicroseconds(40); dht11_in = PINC amp; _BV(DHT11_PIN); if(dht11_in) Serial.println(dht11 start condition 1 not met); return; delayMicroseconds(80); dht11_in=PINC amp; _BV(DHT11_PIN); if(!dht11_in) Serial.println(dht11 start condition 2 not met); return; delayMicroseconds(80); for(i=0;ilt;5;i+) dht11_dati=read_dht11_dat(); /获得 40 位温度与湿度数据 DDRC|=_BV(DHT11_PIN); PORTC|=_BV(DHT11_PIN); byte dht11_check_sum = dht11_dat0+dht11_dat1+dht11_dat2+dht11_dat3; if(dht11_dat4!=dht11_check_sum)/校验 Serial.println(DHT11 checksum error); Serial.print(Current humdity= ); Serial.print(dht11_dat0,DEC); /显示湿度整数部分 Serial.print(.); Serial.print(dht11_dat1,DEC); /显示湿度小数部分 Serial.print(%); Serial.print(temperature = ); Serial.print(dht11_dat2,DEC);/显示温度整数部分 Serial.print(.); Serial.print(dht11_dat3,DEC); /显示温度小数部分 Serial.println(C); 86 拓展试验 #define DHT11_PIN 0 int LED=8; int Buzzer=7; byte read_dht11_dat() byte i = 0; byte result = 0; for(i=0;ilt;8;i+) while(!(PINCamp;_BV(DHT11_PIN); delayMicroseconds(30); if(PINCamp;_BV(DHT11_PIN) result|=(1lt;lt;(7-i); while(PINCamp;_BV(DHT11_PIN); return result; void setup() DDRC|=_BV(DHT11_PIN); PORTC|=_BV(DHT11_PIN); pinMode(LED,OUTPUT); pinMode(Buzzer,OUTPUT); Serial.begin(19200); Serial.println(Ready); void loop() byte dht11_dat5; byte dht11_in; byte i; PORTC amp;=_BV(DHT11_PIN); delay(18); PORTC|=_BV(DHT11_PIN); delayMicroseconds(40); DDRC amp;=_BV(DHT11_PIN); delayMicroseconds(40); dht11_in = PINC amp; _BV(DHT11_PIN); if(dht11_in) Serial.println(dht11 start condition 1 not met); return; delayMicroseconds(80); dht11_in=PINC amp; _BV(DHT11_PIN);if(!dht11_in) Serial.println(dht11 start condition 2 not met); return; delayMicroseconds(80); for(i=0;ilt;5;i+)/获得 40 位温度与湿度数据 dht11_dati=read_dht11_dat(); DDRC|=_BV(DHT11_PIN); PORTC|=_BV(DHT11_PIN); byte dht11_check_sum = dht11_dat0+dht11_dat1+dht11_dat2+dht11_dat3; if(dht11_dat4!=dht11_check_sum)/校验 Serial.println(DHT11 checksum error); Serial.print(Current humdity= ); Serial.print(dht11_dat0,DEC); /显示湿度整数部分 Serial.print(.); Serial.print(dht11_dat1,DEC); /显示湿度小数部分 Serial.print(%); Serial.print(temperature = ); Serial.print(dht11_dat2,DEC); /显示温度整数部分 Serial.print(.); Serial.print(dht11_dat3,DEC); /显示温度小数部分 Serial.println(C); if(dht11_dat0=25) digitalWrite(LED,HIGH); else digitalWrite(LED,LOW);if(dht11_dat2=28) digitalWrite(Buzzer,HIGH); else digitalWrite(Buzzer,LOW); delay(2000); 第 第 9 9 章气体监测942 程序源码void setup() Serial.begin(9600); void loop() int val; val=analogRead(0);/获得当前气体浓度 Serial.println(val,DEC); /十进制串口输出 delay(1000); 第十章D LCD 显示104 程序设计 2) 试验程序 LCD 显示试验参考程序源代码为: 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=DB0;i lt;= DI;i+) /总线赋值digitalWrite(i,value amp; 01); /因为1602液晶信号识别是D7D0(不是D0D7),这里是 /用来反转信号 value gt;gt;= 1; digitalWrite(Enable,LOW); delayMicroseconds(1); digitalWrite(Enable,HIGH); delayMicroseconds(1); /延时 1ms digitalWrite(Enable,LOW); delayMicroseconds(1); /延时 1ms void LcdDataWrite(int value) /定义全部引脚int i = 0; digitalWrite(DI,HIGH); digitalWrite(RW,LOW); for (i=DB0;i lt;= DB7;i+) digitalWrite(i,value amp; 01);value gt;gt;= 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;ilt;= DI;i+) pinMode(i,OUTPUT); delay(100); /短暂的停顿后初始化 LCD 用于 LCD 限制须要LcdCommandWrite(0x38); /设置为 8 位接口,2 行显示,5×7 文字大小delay(64); LcdCommandWrite(0x38); /设置为 8 位接口,2 行显示,5×7 文字大小delay(50); LcdCommandWrite(0x38); /设置为 8 位接口,2 行显示,5×7 文字大小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+4); delay(10); /写入欢迎信息LcdDataWrite("W"); LcdDataWrite("e");LcdDataWrite("l"); LcdDataWrite("c"); LcdDataWrite("o"); LcdDataWrite("m"); LcdDataWrite("e");LcdDataWrite("!");delay(10); LcdCommandWrite(0xc0); /定义光标位置为第 2 行第 1 个位置delay(10); LcdDataWrite("I"); LcdDataWrite(" "); LcdDataWrite("L"); LcdDataWrite("o"); LcdDataWrite("v"); LcdDataWrite("e");LcdDataWrite(" "); LcdDataWrite("A"); LcdDataWrite("r"); LcdDataWrite("d"); LcdDataWrite("u"); LcdDataWrite("i"); LcdDataWrite("n"); LcdDataWrite("o"); LcdDataWrite("!");delay(5000);第 第 1 11 章电机控制11.4 2) 步进电机试验程序 #include lt;Stepper.hgt; /这里设置步进电机旋转一圈是多少步 #define STEPS 100 /attached to 设置步进电机的步数和引脚 Stepper stepper(STEPS,8,9,10,11); /定义变量用来存储历史读数 int previous = 0; void setup() /设置电机每分钟的转速为 90 步 stepper.setSpeed(90); void loop() int val = analogRead(0); /移动步数为当前读数减去历史读数 stepper.step(val-previous); /保存历史读数 previous = val; 11.6 void setup() /初始化数字的引脚为输出 pinMode(13,OUTPUT);pinMode(12,OUTPUT);void loop() digitalWrite(13,HIGH); digitalWrite(12,HIGH);delay(50);digitalWrite(13,LOW); digitalWrite(12,LOW);delay(200); 第 第 2 12 章蓝牙通信124 程序设计 void setup() Serial.begin(9600); void loop() while(Serial.available() char c=Serial.read(); if(c="A") Serial.println(HelloI am amarino); 第 第 3 13 章Wi- -i Fi 无线数据传输 134程序设计 void setup() Serial.begin(9600); void loop() Serial.println(Hello World!); delay(1000);第 第 4 14 章e ZigBee 无线数据传输144 程序设计 ZigBee 无线通信试验参考程序源代码分为主机程序和从机程序两部分。1)主机程序 int button_open =4; /开灯按钮连在数字端口 4 int button_close =5; /关灯按钮连在数字端口 5 char flag; /定义向从机发送 LED 灯亮灭标记的变量 void setup() pinMode(button_open,INPUT); /设置按钮为输入模式pinMode(button_close,INPUT);Serial.begin(115200); /启动串口通信,波特率为 115200bpsvoid loop()/假如亮灯按钮按下,同时关灯按钮松开if(digitalRead(button_open)=LOWamp;amp;digitalRead(button_close)=HIGH) flag="a" Serial.print(flag); /向从机发送灯亮标记/假如关灯按钮按下,同时亮灯按钮松开if(digitalRead(button_close)=LOWamp;amp;digitalRead(button_open)=HIGH)flag="b"Serial.print(flag); /向从机发送灯灭标记delay(20); /延时,等待数据发送胜利2)从机程序int LEDpin=9; /LED 灯连在数字端口 9int val;/定义接受主机发来的 LED 灯亮灭标记的变量void setup()pinMode(LEDpin,OUTPUT); /设置 LED 灯为输出模式digitalWrite(LEDpin,HIGH); /初始化使 LED 灯熄灭Serial.begin(115200); /启动串口通信,波特率为 115200bpsvoid loop()if(Serial.available()gt;0) /查询串口有多数据val=Serial.read(); /读取主机发送的数据if(val="a")/假如主机发送字符"a",则点亮 LEDdigitalWrite(LEDpin,LOW); /LED 灯点亮if(val="b")/假如主机发送字符"b",则熄灭 LEDdigitalWrite(LEDpin,HIGH); /LED 灯熄灭第 第 5 15 章基于 o Arduino 的才智农业大棚 1.STC90C5A16S2 单片机程序 . 32 (1)main.c . 32 (2)lcd12864.c . 47 (3)lcd12864.h . 52 2.Arduino 主接收模块 . 53 3.光照强度模块 . 55 4.二氧化碳浓度模块 . 57 5.空气温湿度模块 . 58 6.土壤温湿度模块 . 59 7.pc 端上位机 . 61 8.Android 手机客户端 . 75 (1)MainActivity.java . 75 (2)Second Activity.java . 86 (3)activity_main.xml . 92 (4)second_main.xml . 103 (5)AndroidManifest.xml . 1111.STC90C5A16S2 单片机程序 (1)main.c /*/ / 功能:串口 1 接收来自主 arduino 的串口信息,并送 LCD12864 显示,限制卷帘,浇水,照明灯等外设/ 串口 1 发送数据送 PC 显示,串口 2 接收 PC 发送的指令限制外设和阈值 (bps=9600)/*/ /STC12C5A60S2 单片机资源运用:/ / LCD12864_DATAPORT P0;电机: 喷 水 :P17 / LCD12864_RS=P26;PH1 = P10;照明:P21 / LCD12864_RW=P25;PH2 = P11; /LCD12864_EN=P27;I01 = P16;/ LCD12864_PSB =P32; I11 = P13; /LCD12864_RST =P34;I02 = P14; / 串口 1:RXD:P30; I12 = P15; / TXD: P31; / 串口 2:RXD:P12;(接收 PC 端信息)Arduino TX-gt;P30 J-TXD 盖跳帽左端 J-RXD 的 USB-gt;P12 /*/ /S2 接收来自 arduino 串口信息的格式:0x8e(起先)模块名数据字节数 数据校验码 /2015 年 8 月 12 日,现在改为 0x8e(起先)模块名数据(2 字节)!/S1 发送给 PC 的信息格式:0x9e(起先)模块名数据字节数 数据校验码 /2015 年 8 月 12 日,现在改为0x9e(起先)模块名 数据/其中各模块的名称为: 土壤湿度模块 0x00; 光照强度模块 0x01;空气温湿度 0x02;CO2 浓度模块 0x03 /各模块存储数据的位置:土壤湿度模块 dat0; 光照强度模块 dat1;空气温湿度dat2;CO