Arduino应用技术 课件 第4-6章 Arduino 通信-Arduino项目实战_第1页
Arduino应用技术 课件 第4-6章 Arduino 通信-Arduino项目实战_第2页
Arduino应用技术 课件 第4-6章 Arduino 通信-Arduino项目实战_第3页
Arduino应用技术 课件 第4-6章 Arduino 通信-Arduino项目实战_第4页
Arduino应用技术 课件 第4-6章 Arduino 通信-Arduino项目实战_第5页
已阅读5页,还剩99页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章Arduino通信让Arduino与外界对话:串口·SPI·IIC·以太网·蓝牙《Arduino应用技术(第二版)》·串口通信·SD卡读写·实时时钟·以太网·蓝牙高职电子信息类专业教学用本章学习目标学完本章,你将掌握Arduino与外界的多种通信方式,为物联网应用打下基础。1掌握串口通信与远程控制2了解SPI通信与SD卡读写3了解IIC通信与实时时钟4了解以太网通信5了解蓝牙通信通信是物联网应用的核心基础。本章以"串口通信"为重点展开,串口、SPI、IIC、以太网、蓝牙五种方式将在后续项目实战章节中被综合运用。说明:4.4以太网与4.5蓝牙正文在提供的教材文本中未完整收录,本PPT以现有内容为主,并补充了要点页。4本章地图:五种通信方式每种通信方式都按"认识接口→连接电路→编写程序→观察现象"四步完成4.1串口通信Serial.available

Serial.read

远程灯控

双板通信4.2SPI/SD卡MOSI/MISO

SCK/SS

SD卡读写4.3IIC时钟DS1302

DS1307

实时时钟LCD4.4以太网W5100扩展板

Ethernet库

TCP/IP协议4.5蓝牙HC-05模块

手机APP控制串口是"点对点"的调试与控制的起点;SPI快而简单、IIC省引脚,两者适合连接外设;以太网与蓝牙则让Arduino走向真正的物联网。4.1串口通信与远程控制Arduino与计算机之间通信时,最常用的方式就是串口通信。在2.2.5节中已经介绍过串口监视器以及常用串口函数(方法),如Serial.begin()、Serial.print()和Serial.println()等。本节进一步探讨读取串口缓冲区中已接收数据的操作方法,实现Arduino与计算机之间的双向通信。缓冲区:Arduino会在SRAM中分配一段大小为64B的接收存储空间,串口接收到的数据会暂时存放在这里。串口通信的典型流程①Serial.begin(9600)初始化并设定波特率②Serial.available()查询缓冲区是否有数据③Serial.read()读取缓冲区中的字节④Serial.print()将结果回传给计算机波特率:串口每秒传输的比特数,常用9600、115200。4.1.1串口读取函数Serial.available()检测串口接收缓冲区的状态,返回已接收并存储(容量64B)中的可读字节数。通常与判断结合使用:Serial.available()>0表示已有数据可读。Serial.read()返回串口缓存中的第一个可读字节(整型),无数据则返回-1。读取后自动清除缓冲区中已读数据;若只想"看一眼"而不删除,可用Serial.peek()。协同运作:两个函数通常成对出现——先判断available()是否有数据,再用read()逐字读取,直到返回0。典型应用while(Serial.available()>0){data=Serial.read();Serial.print(data);delay(5);}功能:循环读取串口数据并赋值给data,直至缓冲区清空。4.1.2串口接收回显程序当串口收到数据时,逐字节读取并回显到串口监视器Serial回显·串口接收示例intincomingByte=0;//传入的串行数据voidsetup(){Serial.begin(9600);//打开串口,波特率9600}voidloop(){//只有接收到数据时才发送if(Serial.available()>0){incomingByte=Serial.read();//读取字节Serial.print("Ireceived:");//显示得到的数据Serial.println(incomingByte,DEC);}}运行结果(图4-1)Serial.println(incomingByte,DEC):以十进制输出读到的字节数值(50对应字符'2')。4.1.2串口通信实现灯控电脑端在串口监视器发送字符'a'点亮LED并输出"turnon";发送'b'熄灭LED并输出"turnoff";其他字符LED状态不变。串口灯控·Serial控制LEDvoidsetup(){Serial.begin(9600);pinMode(13,OUTPUT);}voidloop(){if(Serial.available()>0){charch=Serial.read();Serial.print(ch);if(ch=='a'){//开灯digitalWrite(13,HIGH);Serial.println("turnon");}elseif(ch=='b'){//关灯digitalWrite(13,LOW);Serial.println("turnoff");}}}Serial.read()读到的字符与'a'/'b'比较digitalWrite(13,HIGH/LOW)控制板载LED串口输出同步提示灯的状态这就是"远程控制"的雏形:数据从电脑经串口到达Arduino,程序根据指令作出响应。再结合继电器即可控制大功率负载。4.1.2双Arduino串口通信用另一块Arduino代替电脑发送字符'a'/'b'。发送端引脚2、3各接一个按钮;发送端TX(引脚1)→接收端RX(引脚0),发送端RX(引脚0)→接收端TX(引脚1);两块板GND必须相连。发送端·按钮触发Serial.writeconstintbuttonPin1=2;constintbuttonPin2=3;voidsetup(){Serial.begin(9600);pinMode(buttonPin1,INPUT_PULLUP);pinMode(buttonPin2,INPUT_PULLUP);}voidloop(){if(digitalRead(buttonPin1)==LOW){delay(20);//去抖动if(digitalRead(buttonPin1)==LOW){Serial.write('a');//发送字符awhile(digitalRead(buttonPin1)==LOW);}}//buttonPin2同理,发送字符'b'}要点:按钮按下为低电平触发;delay(20)消抖;Serial.write('a')发送单个字符;while等待按钮释放,防止重复发送。注意:TX与RX交叉连接一方的TX(发送)必须接到另一方的RX(接收),两者交叉;GND必须共地。接收端配合灯控程序即可远程开灯。4.1拓展:软件串口SoftwareSerial有时需要用到多个串口通信,这时可以使用软件串口SoftwareSerial库:把Arduino的任意数字引脚模拟为串口。SoftwareSerial基本用法#include<SoftwareSerial.h>SoftwareSerialmySerial(10,11);//RX接10,TX接11voidsetup(){Serial.begin(9600);//硬件串口mySerial.begin(4800);//软件串口}voidloop(){if(mySerial.available()){Serial.write(mySerial.read());}}使用说明通过SoftwareSerial(rxPin,txPin)创建软串口对象可同时挂接多个软串口,突破硬件串口数量限制软串口波特率不宜过高,且与中断存在相互影响典型应用:连接蓝牙模块、GPS模块等串口外设4.2.1SPI通信SPI(SerialPeripheralInterface,串行外设接口)是一种同步串行通信协议,常用于微控制器与传感器、存储器、显示屏等外设之间的数据传输。MOSI主出从入,主设备向从设备发送数据。MISO主入从出,从设备向主设备发送数据。SCK串行时钟,由主设备提供,同步数据传输。SS/CS从设备选择,低电平选中。SPI系统中可以有多个从机,但仅允许一个主机。主机通过从机选择线(SS)识别并确定当前通信的从机。SS引脚也称CS(ChipSelect,芯片选择引脚),两者是同一概念。ArduinoUNO的SPI引脚SS→引脚10MOSI→引脚11MISO→引脚12SCK→引脚134.2.1SD卡与SD扩展板若需处理或存储大量数据,Arduino内置的EEPROM和Flash存储空间不足时,可外接SD卡扩充存储容量。SD卡基于半导体快闪记忆技术,广泛应用于数码相机、手机、平板等设备。除SD卡外,还需准备SD扩展板与电脑端的SD读卡器;部分设备用全尺寸SD卡,部分用MicroSD卡(TF卡)。图4-3SD卡(microSD+适配器)图4-4SD扩展板MicroSD卡小巧,可装入转SD适配器后使用;扩展板提供卡座与电平转换,直接插到Arduino上。4.2.2SD类库函数SD类库成员函数提供访问SD卡、操作文件与文件夹、进行文件读写的功能函数功能说明SD.begin([cspin])初始化SD卡库与SD卡,成功返回true;无参时默认使用SS引脚。SD.open(fn,[mode])打开文件,可创建新文件;FILE_READ只读、FILE_WRITE写入。file.available()检查文件中可读数据的字节数,返回可用字节数。file.close()关闭文件,并确保数据已被完整写入SD卡。file.print(d,[BASE])将数据写入文件;BASE可为BIN/OCT/DEC/HEX。file.println(d,[BASE])写入数据并自动添加回车换行。file.read()读取文件中一个字节(1B),无数据返回-1。file.write(d)/(buf,len)将数据写入文件,返回已发送的字节数。4.2.3SD卡的电路连接表4-1SD卡扩展板与ArduinoUNO的连接SD扩展板ArduinoUNOGNDGNDVCC3.3VCS数字10号引脚MOSI(DI)数字11号引脚MISO(DO)数字12号引脚SCK(clk)数字13号引脚SD卡扩展板直接叠插在Arduino上,六个信号与电源引脚一一对应,无需额外接线。注意:SD卡的供电电压是3.3V,ArduinoUNO板上已配备相应电压的引脚(3.3V)。切勿将VCC接到5V,以免损坏SD卡。4.2.3SD读写程序(一):初始化与写入SD写入·test.txt(FILE_WRITE)#include<SPI.h>#include<SD.h>FilemyFile;constintss_pin=10;//CS接引脚10voidsetup(){Serial.begin(9600);Serial.print("InitializingSDcard...");if(!SD.begin(ss_pin)){//初始化失败则停止Serial.println("initializationfailed!");return;}Serial.println("initializationdone.");//打开文件(不存在则创建),写入一行数据myFile=SD.open("test.txt",FILE_WRITE);if(myFile){Serial.print("Writingtotest.txt...");myFile.println("testing1,2,3.");myFile.close();//关闭文件,确保写入Serial.println("done.");}else{Serial.println("erroropeningtest.txt");}}voidloop(){}关键点SD.begin(10)初始化,失败则returnSD.open以FILE_WRITE方式打开(可自动建文件)myFile.println写入一行,close确保数据落卡SPI的SS引脚须设为输出模式,否则SD卡库无法正常工作;SD.open的路径用"/"分隔。4.2.3SD读写程序(二):读取与回显写入完成后,再以只读方式打开test.txt,逐字节读取并输出到串口监视器SD读取·test.txt(只读)myFile=SD.open("test.txt");//只读方式打开if(myFile){Serial.println("test.txt:");while(myFile.available()){//有数据则读Serial.write(myFile.read());//逐字节读取并回显}myFile.close();}else{Serial.println("erroropeningtest.txt");}//以上代码位于setup()中,位于写入之后读取逻辑:available()返回可读字节数,配合read()在while循环中逐个读出,再用Serial.write直接输出到串口。拓展思考:结合3.1节的DHT11,把温湿度数据按固定周期写入SD卡形成数据日志,实现"记录仪"功能。4.3IIC通信与实时时钟实时时钟,亦称RTC时钟。目前流行的时钟电路模块有DS1302、DS1307等,接口简洁、价格经济、操作便捷,应用广泛。DS1302三线串行通信

涓流充电·可编程充电DS1307IIC总线接口

56B非易失RAMIIC总线(I2C):仅需SDA(数据)和SCL(时钟)两根线即可挂接多个设备,通过不同的设备地址区分。ArduinoUNO的IIC引脚:A4=SDA,A5=SCL。与带IIC接口的LCD1602液晶接线方式相同。本节目标:用DS1302/DS1307搭建实时时钟显示电路,在LCD1602上显示当前日期与时间。4.3.1DS1302实时时钟模块DS1302由美国DALLAS公司设计,是一款具备涓细电流充电能力的低功耗、高性能实时时钟(RTC)芯片,广泛用于需精确时间记录的电子设备。主要特点三线串行数据传输方式为掉电保护电源提供可编程充电,可关闭充电功能普通32.768kHz晶振,精确计时年、月、日、周、时、分、秒支持12/24小时制,闰年自动调整图4-5DS1302模块(含晶振与纽扣电池)模块引脚:除电源(VCC、GND)外,还有RST(复位)、I/O(数据)、CLK(时钟)。4.3.1DS1302库函数在编写程序之前,先认识DS1302所用到的主要库函数库函数功能说明DS1302rtc(RST,SDA,SCL)创建DS1302对象,指定RST/I/O/CLK连接引脚。rtc.init()初始化模块,配置引脚并检查DS1302是否响应。rtc.halt(value)false启动时钟开始计时;true停止计时。rtc.writeProtect(v)true启用写保护防止误写;false禁用,设置时间前需禁用。rtc.setDate(d,mon,y)设置日期,如setDate(15,3,25)表示2025-03-15。rtc.setTime(h,m,s)设置时间,如setTime(15,17,0)表示15:17:00。rtc.setDOW(dow)设置星期,如setDOW(1)表示星期一。rtc.getTime(&y,...)读取年月日时分秒到变量;另有getDateStr/getTimeStr/getDOWStr。4.3.1DS1302读写示例程序DS1302读写·串口打印日期时间#include<DS1302.h>DS1302rtc(2,3,4);//创建对象:引脚2、3、4voidsetup(){Serial.begin(9600);rtc.init();//初始化DS1302rtc.writeProtect(false);//禁用写保护rtc.halt(false);//启动时钟rtc.writeProtect(true);//启用写保护}voidloop(){rtc.writeProtect(false);//禁用写保护rtc.setTime(30,59,23);//设置23:59:30rtc.setDate(15,12,23);//设置2023-12-15rtc.writeProtect(true);//启用写保护uint8_tsecond,minute,hour,day,month,year;rtc.getTime(&second,&minute,&hour,&day,&month,&year);Serial.print(year+2000);Serial.print("-");Serial.print(month);Serial.print("-");Serial.print(day);Serial.print("");Serial.print(hour);Serial.print(":");Serial.print(minute);Serial.print(":");Serial.println(second);delay(1000);//每秒更新一次}初始化三件套rtc.init()初始化通信writeProtect(false)解除写保护halt(false)启动时钟开始计时getTime通过"取地址"方式(&second)把时间写入变量;getDateStr/getTimeStr/getDOWStr可返回字符串。4.3.1DS1302+LCD1602实时时钟电路表4-2DS1302与Arduino接线DS1302ArduinoVCC3.3VGNDGNDCLK数字4号引脚DAT(I/O)数字3号引脚RST数字2号引脚表4-3LCD1602(IIC)与Arduino接线LCD1602IICArduinoSDAA4SCLA5VCC/GND5V/GND图4-6DS1302+LCD1602接线效果LCD为IIC接口(地址0x27),使用LiquidCrystal_I2C库驱动,仅占用A4、A5两脚。4.3.1实时时钟程序(一):setup初始化DS1302+LCD1602·初始化与开机画面#include<DS1302.h>#include<Wire.h>#include<LiquidCrystal_I2C.h>DS1302rtc(2,3,4);//时钟对象:引脚2、3、4LiquidCrystal_I2Clcd(0x27,16,2);//LCD对象:地址0x27voidsetup(){lcd.init();//初始化LCDlcd.backlight();//打开背光lcd.clear();lcd.setCursor(0,0);lcd.print("Hello,world!");//开机显示信息rtc.init();//初始化DS1302rtc.writeProtect(false);//解除写保护rtc.halt(false);//启动时钟rtc.writeProtect(true);//启用写保护}说明lcd构造参数依次为IIC地址0x27、列数16、行数2;开机画面显示"Hello,world!"。地址不匹配会显示乱码:可用IIC扫描程序(Wire库+0x00~0x7F探测)确认实际地址。4.3.1实时时钟程序(二):loop显示loop·读取时钟并显示日期与时间voidloop(){uint8_tsecond,minute,hour,day,month,year;rtc.getTime(&second,&minute,&hour,&day,&month,&year);//读取时间lcd.setCursor(0,0);//第一行:日期lcd.print(year+2000);//年+2000lcd.print("/");lcd.print(month);lcd.print("/");lcd.print(day);lcd.setCursor(0,1);//第二行:时间lcd.print(hour);lcd.print(":");lcd.print(minute);lcd.print(":");lcd.println(second);delay(1000);//每秒刷新一次}显示效果2025/5/2518:32:19第一次使用时建议把setTime/setDate写入一次校准;此后模块由纽扣电池供电,断电也能继续走时。4.3.2DS1307实时时钟模块DS1307由美国DALLAS公司设计,是另一款低功耗RTC芯片,配备56字节非易失性RAM的全BCD码时钟日历,应用广泛。模块已外接晶振和纽扣电池。功能特性经IIC总线通信,提供秒分时日年月信息支持12/24小时制,闰年自动调整,有效期至2100年IIC地址默认0x68,且无法通过软件修改;SDA接A4、SCL接A5,与IIC接口的LCD1602接法相同。引脚说明VCC/GND供电;SDA/SCL为IIC数据与时钟;VBAT接外部电池,SQW/OUT输出方波。通常仅需连接电源与SDA、SCL两根线即可工作,其余引脚可不接。4.3.2DS1307实时时钟连接电路DS1307通过I2C总线与Arduino连接,并外接LCD1602实时显示日期时间图4-8DS1307实时时钟连接电路图连接:VCC→5V,GND→GND,SDA→A4,SCL→A5;LCD1602亦通过I2C接入同一总线。4.3.2DS1307库函数DS1307使用RTClib库(头文件RTClib.h),核心成员函数如下库函数功能说明RTC_DS1307rtc;创建DS1307对象rtc。rtc.begin()初始化DS1307模块,确保其正常工作。rtc.adjust(DateTime(...))设置当前时间与日期,如adjust(DateTime(F(__DATE__),F(__TIME__)))。rtc.now()获取当前时间,返回DateTime对象。now.year()...second()从DateTime对象中提取年、月、日、时、分、秒。now.unixtime()获取自1970-01-01起的秒数(Unix时间戳)。rtc.isrunning()检测时钟是否在运行,false时调用adjust()启动。rtc.lostPower()检测是否丢失电源;true时需重新设置时间。4.3.2DS1307串口读取示例DS1307读取·串口打印时间#include<Wire.h>#include<RTClib.h>RTC_DS1307rtc;voidsetup(){Serial.begin(9600);if(!rtc.begin()){Serial.println("Couldn'tfindRTC");while(1);//找不到RTC则停机}if(!rtc.isrunning()){Serial.println("RTCisNOTrunning!");rtc.adjust(DateTime(F(__DATE__),F(__TIME__)));}}voidloop(){DateTimenow=rtc.now();//读取当前时间Serial.print(now.year(),DEC);Serial.print('/');Serial.print(now.month(),DEC);Serial.print('/');Serial.print(now.day(),DEC);Serial.print("");Serial.print(now.hour(),DEC);Serial.print(':');Serial.print(now.minute(),DEC);Serial.print(':');Serial.println(now.second(),DEC);delay(1000);//每秒打印一次}关键点begin()失败则while(1)停机isrunning()为false时用编译时间校准DEC参数指定按十进制输出F(__DATE__)与F(__TIME__)取编译时刻的日期与时间,将当前时间写入芯片。4.4.1W5100网络扩展板简介W5100是WIZnet公司推出的多功能单片网络接口芯片,内部集成10/100Mb/s以太网控制器、全硬件TCP/IP协议栈、MAC和PHY,支持TCP、UDP、PPPoE等协议,内置16KB数据缓存。图4-9W5100扩展板主要特性全硬件TCP/IP协议栈+MAC+PHY支持TCP、UDP、ICMP、IGMP、IPv4、ARP、PPPoE、Ethernet内部16KB存储器作TX/RX缓存支持4个独立端口(Socket)同时连接3.3V工作电压,I/O口可承受5V0.18μmCMOS工艺,LQFP80无铅封装多种接口:直接并行、间接并行、SPI总线支持ADSL连接(PPPoE,带PAP/CHAP验证)内嵌10BaseT/100BaseTX以太网物理层支持自动应答(全双工/半双工)支持自动极性变换(MDI/MDIX)多种指示灯:Tx、Rx、Full/Duplex、Collision、Link、Speed应用领域串行到以太网转换:工业控制、LED指示灯控制、无线中继等并行到以太网转换:自动售货机、微型打印机、复印机等USB到以太网转换:存储设备(U盘、外挂硬盘、网络打印机)GPIO到以太网转换:家庭网络传感器、安防设备、网络摄像机、网络门禁系统4.4.1W5100扩展板部件与功能SD卡插槽以太网相关硬件均带MicroSD卡插槽,可读写MicroSD卡,实现数据本地存储。SD卡与W5100共用SPI总线,通过不同SS引脚选择使能。POE供电PowerOverEthernet:在现有以太网Cat.5布线基础上,为IP终端(IP电话、AP、网络摄像机)传输数据的同时提供直流供电,仅需一根POE网线。指示灯含义指示灯含义指示灯含义PWR设备已通电RX网络接收数据时闪烁LINK网络已连接,收发数据时闪烁TX网络发送数据时闪烁FULLD网络连接为全双工通信COLL网络检测到冲突时闪烁100M当前为100Mb/s网络连接L可编程指示灯(用户自定义)注意:这里的RX和TX是网络通信指示灯(表示以太网数据收发),而非Arduino或其他控制器上的串口通信指示灯。两者名称相同但含义完全不同,不要混淆。引脚使用:W5100与SD卡共用SPI总线,需通过不同SS(片选)引脚选择使能。W5100默认SS=D10,SD卡默认SS=D4。4.4.2Ethernet类库使用网络功能需包含Ethernet.h与SPI.h;Ethernet类库定义多个类配合使用:Ethernet、IPAddress、EthernetServer、EthernetClient。Ethernet类成员函数Ethernet.begin(mac)//仅MAC,DHCP自动获取IPEthernet.begin(mac,ip)//指定IP(静态)Ethernet.begin(mac,ip,dns)//+DNS服务器Ethernet.begin(mac,ip,dns,gateway)//+网关Ethernet.begin(mac,ip,dns,gateway,subnet)//+子网掩码Ethernet.localIP()//获取本机IP(DHCP时用)Ethernet.maintain()//更新DHCP租约,返回0~4begin()参数说明参数说明mac本设备的MAC地址(必填)ip本设备的IP地址(静态时必填)dnsDNS服务器地址gateway网关IP,默认IP末字节为1subnet子网掩码,默认DHCP返回值begin(mac)DHCP连接成功返回1,失败返回0;指定IP时不返回数据。maintain()返回:0无变化/1更新失败/2更新成功/3重绑失败/4重绑成功。IPAddress类用于表示IP地址,如IPAddressip(192,168,1,177)。可直接打印或用于begin()参数。教材正文至此为止,后续Web服务器等内容以课堂拓展为准。代码示例:DHCP方式初始化以太网#include<SPI.h>#include<Ethernet.h>bytemac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED};//MAC地址void

setup(){Serial.begin(9600);if(Ethernet.begin(mac)==0)Serial.println("DHCP失败");elseSerial.println(Ethernet.localIP());}4.4.3Ethernet的初始化所有网络通信程序都要使用Ethernet.begin()函数初始化网络设备,配置MAC地址、IP地址、子网掩码和网关等信息。有两种方式:自定义IP地址和DHCP动态获取IP。1.自定义IP地址(静态)#include<SPI.h>#include<Ethernet.h>//MAC地址:6字节,十六进制bytemac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED};//IP地址:4字节,十进制byteip[]={192,168,1,177};void

setup(){Ethernet.begin(mac,ip);//初始化}void

loop(){}2.DHCP动态获取IP地址//仅传MAC,自动开启DHCPif(Ethernet.begin(mac)==0){Serial.println("DHCP失败");for(;;);//死循环}//获取并打印分配到的IPSerial.print("MyIP:");Serial.println(Ethernet.localIP());//loop中用maintain()续租switch(Ethernet.maintain()){...}DHCPmaintain()返回值返回值含义返回值含义0没有改变1更新失败2更新成功3重新绑定失败图4-10获取IP地址(串口监视器输出):DHCP成功后串口输出:MyIPaddress:77新Ethernet扩展板的MAC地址贴在背面,需替换代码中的mac[]数组。4.4.4Ethernet与Web应用HTTP(超文本传输协议)是万维网信息交换的基础,基于请求与响应模式、无状态的应用层协议,通常基于TCP连接。浏览器访问网页经历三步:发送HTTP请求→服务器返回HTML响应→浏览器显示网页。HTTP请求(三部分)请求行:MethodRequest-URIHTTP-VersionCRLF请求报头:Accept(接收类型)、Host(主机和端口)请求正文:Arduino中使用不多表4-4HTTP请求参数参数说明Method请求方法(GET/POST)Request-URI资源标识符(网页地址)HTTP-Version协议版本,Arduino常用HTTP/1.0CRLF回车换行,表示请求结束HTTP响应(三部分)状态行:HTTP-VersionStatus-CodeReason-PhraseCRLF响应报头:服务器附加信息响应正文:HTML文档内容表4-7常见HTTP状态码状态码说明200(OK)请求成功400(BadRequest)请求语法错误401(Unauthorized)请求未经授权403(Forbidden)服务器拒绝提供服务404(NotFound)请求资源不存在500(ServerError)服务器内部错误503(Unavailable)服务器暂时不可用表4-5Method方法:GET:请求获取Request-URI标识的资源POST:在Request-URI标识的资源后附加新数据HTTP请求示例:GET/search?q=arduinoHTTP/1.1Host:Connection:close(空行表示请求结束)HTTP响应示例:HTTP/1.1200OKContent-Type:text/html(空行)<html>...</html>4.4.5网页客户端Arduino作为网页客户端,通过DNS解析域名,连接到网站服务器,以GET方法发送HTTP请求,接收并显示服务器返回的HTML数据。示例:连接百度,发送GET/search?q=arduinoHTTP/1.1,调用百度搜索功能。程序编写:Arduino网页客户端(百度搜索)#include<SPI.h>#include<Ethernet.h>bytemac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED};//MAC地址charserver[]="";//目标域名IPAddressip(192,168,0,177);//DHCP失败时的静态IPEthernetClientclient;//初始化客户端void

setup(){Serial.begin(9600);if(Ethernet.begin(mac)==0){//DHCP获取IPSerial.println("DHCP失败,使用静态IP");Ethernet.begin(mac,ip);}delay(1000);//等待扩展板初始化if(client.connect(server,80)){//连接服务器80端口Serial.println("connected");client.println("GET/search?q=arduinoHTTP/1.1");//请求行client.println("Host:");//请求报头client.println("Connection:close");client.println();//空行结束请求}else{Serial.println("connectionfailed");}}void

loop(){if(client.available()){//读取服务器返回数据charc=client.read();Serial.print(c);}if(!client.connected()){//服务器断开连接Serial.println("\ndisconnecting.");client.stop();while(true);}}图4-11网页客户端运行结果:串口监视器输出百度返回的HTML页面内容(包含HTTP响应头和HTML标签),证明Arduino成功作为网页客户端获取了网页数据。4.4.6网页服务器利用ArduinoEthernet搭建简易网页服务器。接收浏览器访问请求后,发送包含HTML的响应消息,将传感器采集的信息实时展示在网页上。局域网内任何设备均可通过浏览器获取数据。示例:读取引脚A0~A5的模拟值,通过网页显示,浏览器每5秒自动刷新。程序编写:Arduino网页服务器(显示A0-A5模拟值)#include<SPI.h>#include<Ethernet.h>bytemac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED};//MAC地址IPAddressip(192,168,1,177);//静态IP地址EthernetServerserver(80);//HTTP默认端口80void

setup(){Serial.begin(9600);Ethernet.begin(mac,ip);//初始化网络server.begin();//启动服务器Serial.print("serverisat");Serial.println(Ethernet.localIP());}void

loop(){EthernetClientclient=server.available();//监听客户端if(client){booleancurrentLineIsBlank=true;//检测空行(请求结束)while(client.connected()){if(client.available()){charc=client.read();Serial.write(c);if(c=='\n'&¤tLineIsBlank){//收到空行,发送响应client.println("HTTP/1.1200OK");//状态行client.println("Content-Type:text/html");//响应报头client.println("Connection:close");client.println("Refresh:5");//浏览器每5s刷新client.println();//空行分隔报头和正文client.println("<!DOCTYPEHTML><html>");for(intch=0;ch<6;ch++){//输出A0-A5模拟值client.print("analoginput"+String(ch)+"is"+analogRead(ch)+"<br/>");}client.println("</html>");break;}if(c=='\n')currentLineIsBlank=true;else

if(c!='\r')currentLineIsBlank=false;}}delay(1);client.stop();//断开连接}}图4-12网页服务器运行结果:浏览器访问77,显示analoginput0-5的模拟值(0-1023),页面每5秒自动刷新。4.5.1HC-05蓝牙模块简介蓝牙(Bluetooth)是一种支持设备短距离通信的无线电技术,建立连接简单,支持全双工传输且传输速率快,广泛应用于移动电话、笔记本电脑、无线耳机等设备。1994年由爱立信公司研发,具有低功耗、低成本、安全稳定、易于使用等优势。图4-14HC-05蓝牙模块B图4-13蓝牙标志HC-05模块引脚(4线制)引脚功能VCC电源5V(输入范围3.6~6V,最高不超过7V)GND接地TXD串口发送端(接ArduinoRXD)RXD串口接收端(接ArduinoTXD)HC-05主要特性采用CSR主流蓝牙芯片,遵循蓝牙V2.0协议输入电压3.6~6V,板载3.3V稳压芯片波特率:1200~115200可选(默认9600)连接状态指示灯:快闪=未连接,慢闪=AT命令模式未配对电流约30mA,配对成功后约10mA两种模式:命令响应模式(AT指令)、自动连接模式工作模式:自动连接模式下分为主(Master)、从(Slave)、回环(Loopback)三种角色;命令响应模式下可执行所有AT命令,用于配置模块参数。使用HC-05前必须先进行配置。4.5.2蓝牙模块的串口通信通过安卓手机蓝牙功能控制Arduino板上LED灯的亮灭。手机端安装蓝牙串口助手,连接蓝牙模块后发送指令。表4-8蓝牙电路连接表ArduinoHC-055VVCCGNDGNDRXD(引脚0)TXDTXD(引脚1)RXD注意:蓝牙模块TXD接ArduinoRXD,蓝牙模块RXD接ArduinoTXD(交叉连接)。上传程序时需断开蓝牙模块,避免串口冲突。图4-15蓝牙连接图程序编写:手机发送'q'开灯,'w'关灯charval;intledpin=13;void

setup(){Serial.begin(9600);//设置波特率pinMode(ledpin,OUTPUT);}void

loop(){val=Serial.read();//从串口读数据if(val=='q'){digitalWrite(ledpin,HIGH);Serial.println("LEDON");}elseif(val=='w'){digitalWrite(ledpin,LOW);Serial.println("LEDOFF");}}4.5.3蓝牙模块的虚拟串口通信为什么用虚拟串口?蓝牙模块连接ArduinoTX/RX(引脚0/1)时,会干扰电脑通过USB上传程序(串口电压受蓝牙模块影响)。使用SoftwareSerial库将引脚10、11配置为虚拟串口,释放硬件TX/RX。电路连接(引脚10=RX,引脚11=TX)ArduinoHC-055VVCCGNDGND引脚10(虚拟RX)TXD引脚11(虚拟TX)RXDLED状态:电源开启后蓝牙模块LED持续闪烁=无设备连接;设备成功连接后LED每秒闪烁两次=配对完成,可进行数据通信。图4-16虚拟串口蓝牙连接图程序编写:SoftwareSerial虚拟串口,发送'1'开灯,'0'关灯#include<SoftwareSerial.h>//引入软串口库SoftwareSerialmySerial(10,11);//定义虚拟RX=10,TX=11intledpin=13;intBluetoothData;void

setup(){Serial.begin(4800);mySerial.begin(9600);pinMode(ledpin,OUTPUT);Serial.println("BluetoothOn,press1or0toblinkLED");}void

loop(){if(mySerial.available()){BluetoothData=mySerial.read();if(BluetoothData=='1'){digitalWrite(ledpin,1);Serial.println("LEDON");}if(BluetoothData=='0'){digitalWrite(ledpin,0);Serial.println("LEDOFF");}}delay(100);//为下一个数据做准备}本章小结本章围绕"Arduino与外界对话"梳理了五种通信方式串口通信Serial.available/read接收数据;实现回显、串口灯控、双机通信与软串口。SPI与SD卡MOSI/MISO/SCK/SS四线;SD类库实现文件读写与数据存储。IIC与实时时钟SDA/SCL两线,设备地址区分;DS1302/DS1307显示日期时间。以太网通信W5100全硬件TCP/IP协议栈;Ethernet.begin配置网络,localIP获取地址。蓝牙通信2.4GHz短距离无线;HC-05/HC-06模块经串口与Arduino交互,手机远程控制。第五章物联网服务平台让Arduino上云:物联网平台·NodeMCU·ESP32·MQTT《Arduino应用技术(第二版)》·乐为物联·百度天工·阿里云·OneNet·NB-IoT·Cayenne高职电子信息类专业教学用本章学习目标①了解物联网平台②掌握Cayenne平台的使用③了解NodeMCU和ESP32开发板④了解MQTT协议及其使用⑤了解乐为物联云平台及其使用重点:MQTT协议、NodeMCU/ESP32开发板使用、乐为物联数据上传。注:教材正文止于5.4.3,5.5Cayenne以要点补充形式呈现。本章地图5.1物联网平台概述物联网由ITU提出;平台是网络架构与产业链的关键枢纽。5.2国内常见物联网平台百度天工、阿里云、QQ物联、中国移动OneNet、中国电信NB-IoT。5.3乐为物联云平台三层架构;注册设备传感器;LM35数据上传到云端。5.4ESP系列开发板与MQTTNodeMCU(ESP8266)与ESP32开发板;MQTT协议、代理平台与PubSubClient库应用。5.5Cayenne平台(要点补充)开源物联网可视化平台;教材正文缺失,本节提供学习目标引导的要点说明。学习路径:先建立"平台是承上启下关键"的整体认识,再逐一认识五大平台,随后动手在乐为物联上传数据,最后掌握ESP开发板与MQTT通信。5.1物联网平台概述2005ITU正式提出"物联网"416亿2025年全球设备预测物联网平台是网络架构与产业链条中的关键枢纽,实现终端设备"管理、控制、运营"一体化,为上层应用提供统一接口。中小企业的痛点缺少服务器、软硬件技术支持与资金独立建平台实施周期长、投入大,风险承受能力弱对物联网需求难以一次性准确把握开放物联网平台的价值国内乐为物联、美国Cosm等开放平台提升开发效率快速实现原型系统现场验证直接平台托管数据,降低风险、节省维护、减少成本5.2国内常见的物联网平台本节介绍五家国内主流物联网平台,了解各自的定位、优势与应用案例百度"天工"智能物联网平台:面向工业制造、能源、物流,端到云全栈,含物接入、物解析、物管理、时序数据库、规则引擎。阿里云物联网平台:2017年云栖大会发布,融合云上网关、规则引擎、共享智能平台,推动生活、工业、城市三大领域智联网建设。QQ物联智能硬件开放平台:2014年发布,将QQ账号体系、关系链、消息通道开放给智能硬件,实现用户与设备互联互通。中国移动OneNet:2014年上线,首家支持CoAP+LWM2M协议,具备流分析、设备云管理、多协议配置等功能。中国电信NB-IoT平台:2017年建成全球首个商用新一代窄带物联网网络,覆盖广、规模大、基于800MHz低频段质量更优。5.2.1–5.2.2百度天工与阿里云物联网平台百度"天工"智能物联网平台图5-1百度天工标志2016年7月推出,面向工业制造、能源、物流等行业,专注产业物联网。涵盖物接入、物解析、物管理、时序数据库、规则引擎五大产品,千万级设备接入、百万数据点每秒读写。应用案例:风力发电预测性维护,故障预测准确率提升至90%、召回率99%;太原铁路局利用大数据与机器学习,调度效率提升59%。阿里云物联网平台2017年10月云栖大会发布,将物联网打造为"智联网"。建设云端一体化使能平台、物联网市场、ICA全球标准联盟三大基础设施,推动生活、工业、城市三大领域智联网建设。应用案例:无锡鸿山物联网小镇,借助飞凤平台实现交通、环境、水务、能源等城市管理项目在线运营。5.2.3–5.2.5QQ物联·OneNet·电信NB-IoT图5-2QQ物联网平台QQ物联(2014):开放QQ账号体系、关系链、消息通道;硬件接入后可添加为"QQ好友",设备拥有在线状态与昵称。另有微信硬件平台。图5-3OneNet物联网平台标志中国移动OneNet(2014):首家支持CoAP+LWM2M、遵循IPSOProfile;一站式托管、多协议解析、数据存储与大数据分析。中国电信NB-IoT(2017):建成全球首个商用新一代窄带物联网网络。优势:覆盖广(4G/5G全覆盖)、规模大(31万台基站同步升级)、质量优(800MHz低频段,穿透力更强)。案例:中关村大街智能路灯、垃圾桶、井盖;厦门海沧智能独立烟感报警系统。5.3.1乐为物联云平台简介乐为物联隶属于北京乐为物联科技有限责任公司,提供高效实现物联网应用的平台,无需繁琐编程即可接入设备并完成数据存储、查询与分析。主要功能个人门户:管理设备、传感器与控制器数据存储与分析工业仪表无缝接入手机APP远程访问开放的API,可公开测量设备乐为物联网三层架构云端服务器(数据存储·分析)设备(GPRS·WiFi·以太网)传感器与控制器(RS232·RS485)传感器采集数据→设备上传云端→用户通过浏览器/APP访问数据库,实现多样数据应用。5.3.2乐为物联云平台操作在乐为物联网中实现应用,第一步是建立设备①注册:访问注册(邮箱激活),登录后进入"我的物联"。②添加设备:"我的设备"中编辑默认设备或"添加新设备",填写信息后保存。③添加传感器:"传感器与控制器"→"新建"→完整填写信息→保存。④添加控制器:步骤同传感器;其他功能(模拟数据、报警等)参照平台说明书。图5-6添加设备图5-7~10添加传感器和控制器要点:乐为平台以"设备→传感器/控制器"两级结构组织数据,先建设备再添加传感器或控制器。5.3.2乐为物联平台操作(二)新建控制器与传感器:为设备配置数据通道图5-10添加控制器图5-11新建设备5.3.2乐为物联平台操作(三)新建传感器并查看实时数据列表图5-12新建传感器乐为平台:传感器实时数据列表要点:LM35温度数据通过串口/网络上报后,在"实时数据"列表即可看到最新值与更新时间。5.3.3数据上传:LM35温度数据上云乐为物联·LM35温度上传(LeweiClient)#include<LeweiClient.h>#include<SPI.h>#include<Ethernet.h>#defineLW_USERKEY"***你的用户名***"#defineLW_GATEWAY"02"//设备标志#definePOST_INTERVAL(30*1000)//更新间隔30sLeWeiClient*lwc;voidsetup(){Serial.begin(9600);lwc=newLeWeiClient("***用户名***","02");}voidloop(){intsensorReading=analogRead(A0)*0.4882;Serial.println(sensorReading);if(lwc){Serial.print("***startdatacollection");lwc->append("lm35",sensorReading);//上传lm35Serial.print("***datasend***");lwc->send();Serial.print("***sendcompleted***");delay(POST_INTERVAL);}}准备与硬件注册账号并记录用户名、设备标志、传感器标志;W5100插Arduino,接网线,LM35接A0。lwc->append的传感器名称必须与服务器上的设置一致;analogRead×0.4882将ADC值换算为温度。5.4ESP系列开发板与MQTT通信乐鑫科技ESP系列芯片、模组、开发板三大类别ESP8266最早推出,ESP32全面升级,ESP32-S/C系列最新兼容ArduinoIDE、EspressifIDF、MicroPython开发板技术特性高性能、低功耗Wi-FiSoC(系统级芯片);内置2.4GHzWiFi接收发射,支持JSON、定时器、PWM、IIC、SPI、1-Wire、Net、MQTT等功能。适用于智能家居、智能穿戴、工业自动化等领域。MQTT协议MessageQueuingTelemetryTransport,消息队列遥测传输:轻量级、高效、可靠,特别适合资源受限的网络环境。发布/订阅模式设备通过发布者/订阅者/代理(Broker)三种角色高效通信;主题(Topic)标识消息类别。广泛应用于智能家居、工业自动化、智能农业、智能城市等。5.4.1NodeMCU开发板简介NodeMCU是一款基于ESP8266芯片(ESP-12E)的开源物联网开发板,集成2.4GHzWiFi收发器,支持MicroUSB上传程序。特点开源、交互式、可编程、低成本;内置JSON、定时器、PWM、IIC、SPI、1-Wire、Net、MQTT等,兼容ArduinoIDE。注意:D0(GPIO16)只能用作GPIO读/写,不支持中断,也不支持PWM/IIC/OW;ADC0为10位精度。图5-13NodeMCU实物板上设有Reset复位键、Flash固件更新键与MicroUSB端口(上传程序/充电)。5.4.1NodeMCU引脚定义NodeMCU提供了丰富的GPIO引脚,用于连接传感器、执行器等外部设备;常用引脚为D0~D8对应GPIO16、5、4、0、2、14、12、13、15。板载资源MicroUSB上传/充电、Reset复位、Flash更新固件、ADC0(10位)模拟输入。多数引脚支持IIC、SPI、1-Wire、PWM复用;D0例外。右侧为官方引脚定义图,注意丝印D编号与GPIO号的对应。图5-14NodeMCU引脚定义5.4.1用ArduinoIDE开发NodeMCU①连接:USB连接NodeMCU,通电蓝色板载LED闪烁(不保持点亮)。②驱动:安装CP2102或CH340串口驱动;③安装ArduinoIDE1.6.4以上。④索引:在"附加开发板管理器网址"添加ESP8266索引地址(见右图)。⑤安装:开发板管理器搜索"ESP8266"点击安装,网络耗时较长,报错则重试。⑥选板:重启IDE,在"工具"中选择NodeMCU板型并配置端口;注意会擦除原NodeMCU固件。图5-15添加ESP8266索引文件图5-16打开开发板管理器5.4.1NodeMCU:安装ESP8266库在开发板管理器中选择最新版本并点击"安装"图5-17安装ESP8266库步骤:工具→开发板→开发板管理器→搜索esp8266→安装。5.4.1NodeMCU:设置开发环境选择开发板型号与端口,并在首选项中配置网址图5-18设置ESP8266环境文件→首选项:添加开发板管理器网址要点:先添加开发板管理器网址,再通过开发板管理器安装库,最后选择端口下载。5.4.2ESP32开发板简介ESP32-DevKitC采用ESP32-WROOM-32模组,主频高达240MHz,集成传统蓝牙、低功耗蓝牙与2.4GHzWi-Fi。版本与接口提供30引脚与38引脚两种版本,可选配MicroUSB或Type-C接口。34~39引脚仅用于输入,内部无上拉电阻ADC12位精度;使用Wi-Fi时不能使用ADC2引脚EN键复位;BOOT键按下为下载模式36/39引脚内置霍尔传感器图5-19ESP32开发板实物标感叹号的引脚与内部闪存共享,不能作为常规GPIO使用。5.4.2ESP32引脚与ArduinoIDE安装图5-20ESP32开发板30引脚定义引脚图标注了GPIO复用功能:ADC、Touch、SPI、I2C、UART、DAC等,便于按需选用。用ArduinoIDE开发ESP32/dl/package_esp32_index.jsonhttps://espressif.github.io/arduino-esp32/package_esp32_index.json/espressif/.../package_esp32_index.json在"附加开发板管理器网址"中可添加多个索引地址,然后搜索"ESP32"并安装。ESP32库比ESP8266更大、安装更久;若中断,重复点"安装"至完成。安装完成后在"工具"中选择ESP32开发板类型与端口。5.4.2ESP32:添加开发板索引在首选项附加开发板管理器网址,添加ESP32索引图5-21添加ESP32索引文件步骤:首选项→附加开发板管理器网址→填入ESP32索引→确定。5.4.2ESP32:安装开发板库在开发板管理器中搜索esp32并安装图5-22安装ESP32库要点:ESP32与ESP8266安装方式一致,均在开发板管理器中完成。5.4.3MQTT协议简介MQTT通过发布/订阅模式实现设备间高效通信,运行MQTT的设备有三种角色发布者Publisher向MQTT代理(Broker)发送消息的客户端。代理Broker消息中转站(云服务器),接收发布者的消息并分发给订阅者。订阅者Subscriber从MQTT代理接收消息的客户端。→→角色可重叠同一设备可同时具备多种角色:既能发布消息,也能订阅其他主题,实现双向通信与远程控制。主题Topic(核心概念)标识消息类别或传输路径;发布者发布到特定主题,订阅者订阅特定主题即可接收;内容可为字符串或JSON格式。5.4.3MQTT库安装与程序框架安装PubSubClient库ArduinoIDE→库管理器→搜索"PubSubClient"→安装;需同时安装ESP8266/ESP32开发板支持。程序一般包含6个部分引入库文件:PubSubClient.h、ESP8266WiFi.h连接Wi-Fi(ssid/password)定义MQTT服务器地址与主题创建PubSubClient并连接服务器回调函数处理订阅到的消息loop中循环收发消息MQTT程序骨架(以mqtt_esp8266为例)#include<ESP8266WiFi.h>#include<PubSubClient.h>constchar*ssid="你的WiFi";constchar*password="你的密码";constchar*mqtt_server="";WiFiClientespClient;PubSubClientclient(espClient);voidsetup(){Serial.begin(115200);setup_wifi();client.setServer(mqtt_server,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论