精华内容
下载资源
问答
  • ESP8266开发之旅 基础篇① 走进ESP8266的世界

    万次阅读 多人点赞 2019-06-19 13:44:33
        欢迎大家来到ESP8266的世界,从现在开始,笔者将带领大家慢慢揭开ESP8266神秘的面纱。 1. 简介     从笔者的角度来说,ESP8266这个词可以理解为ESP8266EX芯片(当然,后面也有可能出现了其他芯片,...

    基于Arduino的ESP8266开发技术全系列教程

    一、基础篇

    1. ESP8266开发之旅 基础篇① 走进ESP8266的世界
    2. ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境
    3. ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明
    4. ESP8266开发之旅 基础篇④ ESP8266与EEPROM
    5. ESP8266开发之旅 基础篇⑤ ESP8266 SPI通信和I2C通信
    6. ESP8266开发之旅 基础篇⑥ Ticker——ESP8266定时库

    二、网络篇

    1. ESP8266开发之旅 网络篇① 认识一下Arduino Core For ESP8266
    2. ESP8266开发之旅 网络篇② ESP8266 工作模式与ESP8266WiFi库
    3. ESP8266开发之旅 网络篇③ Soft-AP——ESP8266WiFiAP库的使用
    4. ESP8266开发之旅 网络篇④ Station——ESP8266WiFiSTA库的使用
    5. ESP8266开发之旅 网络篇⑤ Scan WiFi——ESP8266WiFiScan库的使用
    6. ESP8266开发之旅 网络篇⑥ ESP8266WiFiGeneric——基础库
    7. ESP8266开发之旅 网络篇⑦ TCP Server & TCP Client
    8. ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网
    9. ESP8266开发之旅 网络篇⑨ HttpClient——ESP8266HTTPClient库的使用
    10. ESP8266开发之旅 网络篇⑩ UDP服务
    11. ESP8266开发之旅 网络篇⑪ WebServer——ESP8266WebServer库的使用
    12. ESP8266开发之旅 网络篇⑫ 域名服务——ESP8266mDNS库
    13. ESP8266开发之旅 网络篇⑬ SPIFFS——ESP8266 Flash文件系统
    14. ESP8266开发之旅 网络篇⑭ web配网
    15. ESP8266开发之旅 网络篇⑮ 真正的域名服务——DNSServer
    16. ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新
    17. ESP8266开发之旅 网络篇⑰ NTP——时间服务
    18. ESP8266开发之旅 网络篇⑱ WebSocket——全双工通信

    三、应用篇

    1. ESP8266开发之旅 应用篇① 局域网应用 ——炫酷RGB彩灯
    2. ESP8266开发之旅 应用篇② OLED显示天气屏
    3. ESP8266开发之旅 应用篇③ 简易版WiFi小车
    4. ESP8266开发之旅 应用篇④ WiFi广告机
    5. ESP8266开发之旅 应用篇⑤ WiFi探针
    6. ESP8266开发之旅 应用篇⑥ 检测周边WiFi杀手
    7. ESP8266开发之旅 应用篇⑦ WiFi自动考勤机
    8. ESP8266开发之旅 应用篇⑦ 简易版本在线获取特定省份新型冠状病毒情况
    9. ESP8266开发之旅 应用篇⑧Arduino版本 WiFi杀手
    10. ESP8266开发之旅 应用篇⑨ 小白半小时轻松接入百度天工IOT
    11. ESP8266开发之旅 应用篇⑩ 小白半小时轻松接入阿里云MQTT
    12. ESP8266开发之旅 应用篇⑪ 基于ESP8266的人流量简单统计系统
    13. ESP8266开发之旅 应用篇⑫ 基于ESP8266的校园图书馆学习时长排行榜(记录思路,尚未实现)

    四、高级篇

    1. ESP8266开发之旅 进阶篇① 代码优化 —— ESP8266内存管理
    2. ESP8266开发之旅 进阶篇② 闲聊Arduino IDE For ESP8266配置
    3. ESP8266开发之旅 进阶篇③ 闲聊 ESP8266 Flash
    4. ESP8266开发之旅 进阶篇④ 常见问题 —— 解决困扰
    5. ESP8266开发之旅 进阶篇⑤ 代码规范 —— 像写文章一样优美
    6. ESP8266开发之旅 进阶篇⑥ ESP-specific APIs说明
    7. ESP8266开发之旅 进阶篇⑦ 如何尽量做到一套代码兼容esp8266和esp32
    8. ESP8266开发之旅 进阶篇⑧ 认识 PROGMEM on ESP8266
    9. ESP8266开发之旅 进阶篇⑨ 深入了解 802.11 无线协议(非常重要)
    10. ESP8266开发之旅 进阶篇⑩ sniffer混杂模式,监听802.11帧,黑科技基础
    11. ESP8266开发之旅 进阶篇⑪ 深入了解 Esp8266 Https访问

    五、阿里云篇

    1. ESP8266开发之旅 阿里云物联网平台篇① 了解阿里云物联网平台(纯理论,了解概念即可)
    2. ESP8266开发之旅 阿里云物联网平台篇② MQTT.FX客户端模拟 调试 MQTT LED智能灯控制系统
    3. ESP8266开发之旅 阿里云物联网平台篇③ LED智能灯控制系统(MQTT客户端直连)
    4. ESP8266开发之旅 阿里云物联网平台篇④ LED智能灯控制系统(MQTTS客户端直连)
    5. ESP8266开发之旅 阿里云物联网平台篇⑤ LED智能灯控制系统(使用HTTPS认证再连接)
    6. ESP8266开发之旅 阿里云物联网平台篇⑥ LED智能灯控制系统 全面讲解,上手一个小项目(MQTT客户端直连 + Web配网 + WebSocket局域网通信))

    六、小程序篇

    1. ESP8266开发之旅 小程序之阿里云篇① “IOT菜鸟”小程序,小白简单配置就可以玩起来
    2. ESP8266开发之旅 小程序之阿里云篇② “IOT菜鸟”小程序,源码分析,创作自己的小程序

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。

    快速导航
    单片机菜鸟的博客快速索引(快速找到你要的)

    如果觉得有用,麻烦点赞收藏,您的支持是博主创作的动力。

        欢迎大家来到ESP8266的世界,从现在开始,笔者将带领大家慢慢揭开ESP8266神秘的面纱。

    1. 简介

        从笔者的角度来说,ESP8266这个词可以理解为ESP8266EX芯片(当然,后面也有可能出现了其他芯片,这里首推ESP8266EX)以及依赖ESP8266EX芯片开发的系列模组的简称。
        ESP8266EX是由乐鑫信息科技公司(Espressif)出品的一款应用于物联网编程的WiFi芯片。从它被设计出来,就引起了物联网开发的热潮,获得了业界同行的肯定。芯片的具体相关介绍,笔者这里就不占用章节篇幅,请读者自行查看乐鑫官网详细介绍。
        ESP8266系列模组是深圳安信可(Ai-thinker)公司开发的一系列基于乐鑫ESP8266EX的超低功耗的UART-WiFi模块的模组,可以方便地进行二次开发,接入云端服务,实现手机3/4G全球随时随地的控制,加速产品原型设计。
        从厂商角度来看,乐鑫是ESP8266的芯片厂商,安信可是依赖ESP8266生产模组,在ESP8266芯片的基础上,完善了外围器件布局和优化天线,并提供一系列开发方案的厂家。网上各种盗版模块居多,笔者推荐大家购买安信可官方正版模块。

    温馨提示

        请注意,笔者后面章节提到的ESP8266均指ESP8266系列模组。

    2. 特性

        其典型特征如下:

    • 802.11 b/g/n
    • 内置Tensilica L106 超低功耗 32 位微型 MCU,主频支持 80 MHz 和160 MHz,支持 RTOS
    • 内置10 bit高精度ADC
    • 内置TCP/IP协议栈
    • 内置TR 开关、balun、LNA、功率放大器和匹配网络
    • 内置PLL、稳压器和电源管理组件,802.11b 模式下+20 dBm的输出功率
    • A-MPDU 、 A-MSDU 的聚合和 0.4 s的保护间隔
    • WiFi @ 2.4 GHz,支持 WPA/WPA2 安全模式
    • 支持AT远程升级及云端OTA升级
    • 支持 STA/AP/STA+AP 工作模式
    • 支持 Smart Config 功能(包括 Android 和 iOS 设备)
    • HSPI 、UART、I2C、I2S、IR Remote Control、PWM、GPIO
    • 深度睡眠保持电流为 10 uA,关断电流小于 5 uA
    • 2 ms 之内唤醒、连接并传递数据包
    • 待机状态消耗功率小于1.0 mW (DTIM3)
    • 工作温度范围:-40℃- 125℃

    3. 系列模组

        据笔者了解,目前安信可生产的ESP8266系列模组主要有:

    1. ESP-01S
      image

    2. ESP-07S
      在这里插入图片描述

    3. ESP-12E
      在这里插入图片描述

    4. ESP-12F

    在这里插入图片描述

    1. ESP-12S
      image

    温馨提示

        1.以上5张图均引用安信可官网,如有侵权,麻烦告知。
        2.模组之间的区别在哪里?
        不同系列之间的差别更多的是封装工艺以及Flash闪存大小不同,具体差别情况下表1:

    型号 封装 flash大小 天线 可用IO
    ESP-01S DIP-8 8Mbit(1MB) PCB天线 2
    ESP-07S SMD-16 32Mbit(4MB) IPEX 9
    ESP-12E SMD-22 32Mbit(4MB) PCB天线 9
    ESP-12F SMD-22 32Mbit(4MB) PCB天线 9
    ESP-12S SMD-16 32Mbit(4MB) PCB天线 9

        请注意,flash芯片是外接在ESP8266芯片外面,通过SPI与8266芯片通信。虽然有些系列模组flash比较大,但是不意味着全部flash空间都可以用来装载固件代码。一般来说,我们开发的业务代码不能超过1MB,剩下的flash空间可以用来做文件系统,笔者后面章节会讲解。
        从性价比角度来说,目前开发最常用的就是ESP12F,迷你尺寸,IO口多,flash空间大,价格可以低于10元。具体更多的型号介绍可以参考安信可官网 。

    4. 使用原因

        之所以采用 ESP8266 做为研发平台,主要是因为其超低成本,并且将处理器和 WiFi 芯
    片精致集成在一起,具有 GPIO、PWM、I2C、1‐Wire、ADC 等功能,为开发者提供一套极具性价
    比的开发平台。ESP8266 是一个完整且自成体系的 Wi‐Fi 网络解决方案,能够搭载软件应
    用,也就是说可以将应用直接在 ESP8266 上运行,或通过另一个应用处理器进行业务逻辑处
    理,而仅使用 ESP8266 的 Wi‐Fi 网络功能(通常做为串口透传使用,目前淘宝上销售的大部
    分已经写入基于 AT 指令的串口转 wifi 固件的模块,方便直接连接原有单片机系统)。
        综合来说,大众选择ESP8266的主要原因有:

    1. 作为WiFi模块来用,价格实惠(批发价可以低于10元)。同时,从初学者角度来看,就算购买了ESP8266开发板,价格也是在20-30元左右,学习成本低。所以,前期入门学习,笔者建议初学者可以考虑购买一个ESP8266开发板,可以绕过不少弯路,达到快速学习ESP8266的目的,比如NodeMcu开发板;
    2. 除了作为WiFi模块来用,其自身内置了32位处理器,也可以进行二次开发。读者可以把ESP8266当做Arduino+WiFi功能来开发;
    3. 基本的ESP8266开发体系形成,其自身的SDK不断迭代开发、基于LUA的NodeMcu模式、基于Arduino的生态移植、论坛社区上众多的参考资料,都使得ESP8266开发速度加快;
    4. ESP8266有三种工作模式:Station模式、Soft-AP模式、Station兼Soft-AP模式,可以满足大部分场合开发需求;
    5. 对于习惯用AT指令的同学,也支持给ESP8266烧写AT固件,可以当做Uart转WiFi使用,不过这不是本书的重点,需要研究的同学可以参考笔者写的一个技术帖子(https://www.arduino.cn/thread-44963-1-1.html) 。

    5. 使用场景

        作为一款WiFi芯片,可以毫不夸张地说,只要需要使用无线网络环境的都可以应用它。
        简单来说,就是通过WiFi控制的各类设备。比如,现在比较流行的词,物联网、智能插座、智能家居、智能家电、可穿戴电子产品、WiFi定位、WiFi探针、WiFi彩灯等等。只有你想不到的,没有你做不到的。当然,虽然目前市面上没有看到智能产品的广泛应用,但是不要慌,总有一天会实现的,而我们就是实现这个路途的奠基石。

    6. 总结

        本章作为本书的开篇,主要带领读者走进ESP8266的世界,简单介绍了ESP8266是什么,有什么特性,为什么我们要使用它,以及它能帮助我们做什么。作为纯描述性的章节,笔者只是简单一笔带过,不希望花费读者太多时间在这上面,更希望大家形成这么一个概念即可——ESP8266是个WiFi模块,可以联网,可以基于Arduino平台开发。下面就是进入真真正正的基于Arduino平台的ESP8266开发之旅,旅途愉快,Hello Arduino ESP8266!

    展开全文
  •     在网络篇①中,博主主要讲解了Arduino上开发ESP8266的插件库 Arduino Core For ESP8266。但是,并没有讲到关于这个模块的工作模式,所以本篇讲着重讲解ESP8266的三种工作模式: Station模式; AP模式; ...

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。

    共同学习成长QQ群 622368884,不喜勿加,里面有一大群志同道合的探路人

    快速导航
    单片机菜鸟的博客快速索引(快速找到你要的)

    如果觉得有用,麻烦点赞收藏,您的支持是博主创作的动力。

        在网络篇①中,博主主要讲解了Arduino上开发ESP8266的插件库 Arduino Core For ESP8266。但是,并没有讲到关于这个模块的工作模式,所以本篇讲着重讲解ESP8266的三种工作模式:

    1. Station模式;
    2. AP模式;
    3. AP兼Station模式;

        重点来了,8266编程开发,都是基于以上三种模式中的一种模式来进行开发。所以,开发ESP8266的时候,需要首先确定工作模式。

    1. ESP8266工作模式

    1.1 Station模式 —— 我想连上谁

        Station(STA)模式用于将ESP8266模块连接到由接入点(Access Point,理解为热点)建立的Wi-Fi网络。请查看下图:
    image
        Station模式有几个特点,以方便管理的Wi-Fi连接。

    • 在连接丢失的情况下,一旦WiFi再次可用,ESP8266将自动重新连接到最近使用的接入点(Access Point,理解为热点),往往这一点容易出问题(有时路由器重启了,会发现ESP8266一直连接不上路由)。
    • 模块重启也会发生同样的情况。
    • 因为ESP8266将最后使用的接入点认证信息(ssid账号,psw密码)保存到Flash(非易失性)存储器中。
    • 如果在Arduino IDE修改代码,但代码不更改Wi-Fi工作模式或接入点认证信息(ssid账号,psw密码),则ESP8266使用保存在Flash上数据来重新连接。

    1.2 AP模式(soft-AP)—— 谁想连上我

        AP(Access Point)模式可以理解为Station模式的相反面,用于将ESP8266模块作为接入点建立Wi-Fi网络,供其他Station模式的模块连接进来。请查看下图:

    image

    • AP模式可以用于Station模式的模块之间交互的中转站(让所有模块处于同一个WiFi网络中);
    • 在将ESP8266模块(Station模式)连接到wifi之前,一般我们是不知道当前wifi网络的ssid账号和psw密码,那么我们怎么告诉ESP8266呢?
      在AP模式下,我们可以使用手机或者笔记本连接到它,然后我们就可以给ESP8266模块发送连接网络的ssid和psw。一旦完成,ESP8266自动切换到Station 模式,就可以连接到目标wifi接入点。

    1.3 AP兼Station模式

        该模式是以上两种模式的整合。请查看下图:
    image

    1.4 核心点

        牢牢记住,WiFi有三种工作模式:Station模式、AP模式、AP兼Station模式,这样就足够了。每个ESP8266模块肯定工作于这三种模式之一,当然除非你没用WIFI功能,把它当做arduino开发版用。

    2. ESP8266WiFi库

        前面我们总体上介绍了ESP8266工作模式,同时我们也了解到 Arduino IDE上主要通过 Arduino Core For ESP8266这个核心库来开发ESP8266功能,并且也谈论到这个核心库其实包含了众多小核心库,包括ESP8266WiFi、ESP8266WebServer、ESP8266HTTPClient、ESP8266mDNS等等。虽然我们实际开发中并不会说全部库都会使用起来,但是至少需要形成一个意识,那就是:Arduino core for ESP8266库,在8266 sdk基础上给我们提供了很多操作方式。
        其中,博主觉得最核心最重要的一个库就是ESP8266WiFi(后面我们代码中你会经常看到 #inclue<ESP8266WiFi.h>,那时你就应该知道这个库具体是用来做什么的)

    2.1 ESP8266WiFi库源码结构

        如果你是按照博主之前说的方式去clone Arduino core for 8266的代码的话,然后把libraries目录导入到源码查看IDE(这里我推荐大家安装webstorm)的话,然后打开ESP8266WiFi那个目录,你就会发现如下代码结构:

        没错,你会发现很多成双成对的h头文件和cpp源文件,有点组cp的感觉。
    image

        众多文件,先不要纠结。
        在这里,博主可以先告诉你几个知识点:

    1. 名字里面带Secure、SSL、TLS的,跟安全校验有关,俗称https(不要告诉我你没用过);
    2. 名字里面带Client的,跟客户端有关;
    3. 名字里面带Server的,跟服务端有关;
    4. 名字里面带8266的,你可以理解为针对ESP8266的代码封装;
    5. 名字里面带Scan的,跟wifi扫描有关;
    6. 名字里面带STA的,跟ESP8266 Station模式有关;
    7. 名字里面带AP的,跟ESP8266 AP模式有关;
    8. ESP8266WiFiType.h文件,主要是用来定义各种配置选项,比如wifi工作模式(WiFiMode),wifi睡眠模式(WiFiSleepType),wifi物理模式(WiFiPhyMode),wifi事件(WiFiEvent),wifi断开原因(WiFiDisconnectReason)等等;
    9. ESP8266WiFiGeneric(8266模块通用库),esp8266的sdk提供了一些功能,但在arduino wifi库中没有。包括处理程序来管理wi-fi事件,如连接,断开连接或获得ip,wi-fi模式的变化,管理模块睡眠模式的功能,以ip地址解析的hostName等;
    10. ESP8266WiFi库不仅仅局限于ESP8266WiFi.h和ESP8266WiFi.cpp这两个文件,只不过说它们是最核心的统一入口;
    11. WiFiUdp库,在ESP8266WiFi功能的基础上包装了UDP广播协议,适用于UDP通信,需要另外添加头文件;

        记住这11点,基本上整个ESP8266WiFi库你就了解一半了,剩下就是看各个具体使用(引入使用一步到位 #include<ESP8266WiFi.h>,当然你也可以一个个include,so easy)。

    #include<ESP8266WiFi.h>
    

    2.2 ESP8266WiFi.h 和 ESP8266WiFi.cpp 详解

        在这里,博主给读者讲解用得最多的两个文件
        可以看到ESP8266WiFi类,继承了ESP8266WiFiGenericESP8266WiFiSTAESP8266WiFiScanESP8266WiFiAP,同时引入了WiFiClientWiFiServerWiFiServerSecureWiFiClientSecure等等,所谓集合了诸子百家的功能于一身。

    • ESP8266WiFiGeneric:8266模块通用库,包括处理程序来管理wi-fi事件,如连接,断开连接或获得ip,wi-fi模式的变化,管理模块睡眠模式的功能,以ip地址解析的hostName等;
    • ESP8266WiFiSTA:Station模式下使用的代码功能;
    • ESP8266WiFiScan:wifi扫描功能(处于Station模式);
    • ESP8266WiFiAP:wifi网络接入点功能(AP热点);
    • WiFiClient:tcp 客户端(发送端);
    • WiFiServer:tcp 服务端(接收端);

        为了让大家更加清晰了解到各个具体内容,博主也花了点时间做了一个初略的百度脑图,以供大家参考:

    在这里插入图片描述

        脑图相对来说比较大,烦请读者自行下载保存下来放大查看。本篇不详细介绍每个函数怎么用,等到后面用到的时候,博主再陆续给大家介绍一下用法。

    3. 总结

        这节要记住的重点是,核心库ESP8266WiFi到底有什么功能可以提供给我们使用。理解它是后续开发的基本。

    展开全文
  • ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明

    万次阅读 多人点赞 2019-06-19 13:47:50
        笔者本书的主题是基于Arduino平台来开发ESP8266。那么从另外一个角度来看待这句话,可以理解为:把ESP8266当作一款类似于Arduino UNO型号(为什么不是Mega2560呢?可以从硬件资源方向考虑)的Arduino开发板...

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。

    共同学习成长QQ群 622368884,不喜勿加,里面有一大群志同道合的探路人

    快速导航
    单片机菜鸟的博客快速索引(快速找到你要的)

    如果觉得有用,麻烦点赞收藏,您的支持是博主创作的动力。

        笔者本书的主题是基于Arduino平台来开发ESP8266。那么从另外一个角度来看待这句话,可以理解为:把ESP8266当作一款类似于Arduino UNO型号(为什么不是Mega2560呢?可以从硬件资源方向考虑)的Arduino开发板,用Arduino平台的开发方式来开发项目,只不过ESP8266是在Arduino UNO的基础上加了网络功能
        本章将介绍ESP8266作为Arduino UNO开发板的一些重要开发知识点。
        主要分为8个部分:
        1.ESP8266 Arduino程序结构
        2.计时和延时(Timing and delays)
        3.NodeMcu 端口映射
        4.数字IO(Digital IO)
        5.中断功能
        6.模拟输入(ADC)
        7.模拟输出(PWM)
        8.串口通信(Serial)

    1. Arduino程序结构

        在第2章中,笔者提供了一个测试用例,让我们来回顾一下,代码如下:

    /**
     * Demo:
     *    测试ESP8266 demo
     *    打印ESP8266模块信息
     *    1.打印Arduino Core For ESP8266 版本,笔者是2.4.2版本
     *    2.打印Flash的唯一性芯片id(读者可以思考一下是否可以用来做点什么唯一性参考)
     *    3.打印Flash实际大小
     *    4.打印IDE配置的使用Flash大小
     *    5.打印IDE配置的Flash连接通信的频率
     *    6.打印Flash连接模式:QIO QOUT DIO DOUT,可以理解为Flash传输速率
     * @author 单片机菜鸟
     * @date 2018/10/22
     */
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(115200);
      //使能软件看门狗的触发间隔
      ESP.wdtEnable(5000);
    }
    
    void loop() {
      //喂狗
      ESP.wdtFeed();
      FlashMode_t ideMode = ESP.getFlashChipMode();
      String coreVersion = ESP.getCoreVersion();
      Serial.print(F("Arduino Core For ESP8266 Version: "));
      Serial.println(coreVersion);
      Serial.printf("Flash real id(唯一标识符):   %08X\n", ESP.getFlashChipId());
      Serial.printf("Flash 实际大小: %u KBytes\n", ESP.getFlashChipRealSize()/1024);
      Serial.printf("IDE配置Flash大小: %u KBytes,往往小于实际大小\n", ESP.getFlashChipSize()/1024);
      Serial.printf("IDE配置Flash频率 : %u MHz\n", ESP.getFlashChipSpeed()/1000000);
      Serial.printf("Flash ide mode:  %s\n\n", (ideMode == FM_QIO ? "QIO" : ideMode == FM_QOUT ? "QOUT" : ideMode == FM_DIO ? "DIO" : ideMode == FM_DOUT ? "DOUT" : "UNKNOWN"));
      
      delay(1000);
    }
    

        去掉代码细节,会得到类似于Arduino编程的代码结构:

    /**
     * ESP8266 Arduino程序结构
     * @author 单片机菜鸟
     * @date 2018/10/24
     */
    void setup() {
      // 这里开始写初始化代码,只会执行一次
      
    }
    
    void loop() {
      //这里写运行代码,重复执行
    }
    

        对于习惯c语言编程的读者,以上代码又可以抽象成以下伪代码结构:

    /**
     * ESP8266 Arduino程序伪代码结构
     * @author 单片机菜鸟
     * @date 2018/10/24
     */
    void main(){
      watchdogEnable();//启动看门狗
      setup();//初始化函数
      while(1){
        loop();//业务代码函数
      }
    }
    

    代码解析

    1.在ESP8266 Arduino编程中,默认会开启看门狗功能,也就是对应伪代码的watchdogEnable(),意味着我们需要适当喂狗,不然会触发看门狗复位;
    2.setup()方法:初始化函数,只会运行一次,所以一般情况下,我们都会在这里配置好初始化参数,比如IO口模式、串口波特率设置等等;
    3.loop()方法:不断重复执行,这里编写我们的业务代码,同时要注意执行喂狗操作。

    2. 计时和延时(Timing and delays)

        时间控制,基本上可以说存在于每一个项目代码中。目前在Arduino中跟时间控制有关的方法包括以下几个:
        delay(ms)
        暂停一个给定的毫秒数的时间间隔。
        delayMicroseconds(us)
        暂停一个给定的微秒数的时间间隔。
        millis()
        返回重启(reset)后所经过的毫秒数。
        micros()
        返回重启(reset)后所经过的微秒数

    温馨提示

        通常,我们控制LED灯闪烁都会加上一个delay延时来达到切换亮灭时间长度。但是delay有个缺点就是:在给定的时间间隔内是不能做其他操作,这样对于一些需要响应按键操作的场景就不适用了。那么有没有什么办法既能延时又能不影响其他操作呢?当然,这就是millis()的妙用,通过获取两个时间点的毫秒数,然后计算它们的差值,差值时间间隔内是可以执行其他操作的。代码片段如下:

    long debouncdDelay = 60;//延时间隔
    long lastDebounceTime = 0; //最近记录的一次时间
    
    // 判断时间间隔是否大于设定的时间间隔。
    if(millis()-lastDebounceTime>debouncdDelay){
        lastDebounceTime = millis();
    }
    

    3. NodeMcu 端口映射

        在前面,笔者有说到,本书的实验案例是基于NodeMcu这块ESP8266开发板来进行的,其中NodeMcu的核心芯片是ESP8266-12F。要想知道ESP8266-12F给我们提供了什么功能模块,首先了解一下它有什么引脚端口以及NodeMcu与它之间的引脚端口映射关系。

    3.1 ESP8266-12F

        首先,认识一下ESP8266-12F的引脚定义,通常会隐藏pin6-pin11,如下图:
    image
        当然,笔者也会提供完整的引脚图以便对比,如下图:
    image
        分析引脚图,可以得出几个结论:
        1.ESP8266-12F总共有22个引脚,对应了第1章选型表的SMD-22封装工艺,同时有GPIO0-GPIO16共17个通用IO口,但是得注意有些IO口还可以完成其他功能(也叫做引脚复用),诸如Serial、I2C、SPI,由相应的函数库完成;
        2.ESP8266具有一个可用的单通道ADC;
        3.GPIO6-GPIO11(复用引脚CS、MISO、MOSI、SCK)用于连接外部flash,对用户不可用,试图使用这些引脚作为IO将会导致程序奔溃;
        4.支持SPI总线通信,对应引脚为GPIO12-GPIO15;
        5.支持I2C总线,对应引脚为GPIO4-GPIO5;
        6.支持串口通信Serial、Serial1,默认对应引脚GPIO1-GPIO3;

    3.2 NodeMcu

        接下来,先了解一下NoodeMcu的实物图,如下图:

    image

        同时,读者也需要知道ESP8266-12F与NodeMcu的端口映射关系,如下图:
    image

        可以看出:
        1.中间的DEVKIT部分,就是NodeMcu提供给外界的端口,对应实物图上标注的端口名称;
        2.除开中间部分,其他部分基本上对应ESP8266引脚,以不同颜色块来区分不同功能;

    温馨提示

        NodeMcu上的CLK、SD0、CMD、SD1、SD2引脚,是用于连接外接flash芯片,不应该用于连接其他模块,悬空即可,以防程序奔溃。

        或许笔者会觉得看图有点复杂,所以笔者总结了下面的GPIO引脚映射表,以供参考:

    NodeMCU的引脚名称 ESP8266内部GPIO引脚号 可复用功能 备注
    D0 GPIO16 可用,只能用作GPIO读/写,不支持特殊功能
    D1 GPIO5 I2C总线的SCL 可用
    D2 GPIO4 I2C总线的SDA 可用
    D3 GPIO0 不可用,烧录固件或者运行模式控制端口
    D4 GPIO2 Serial1的TX Serial1没有RX
    D5 GPIO14 SPI总线的SCLK 可用
    D6 GPIO12 SPI总线的MISO 可用
    D7 GPIO13 SPI总线的MOSI、Serial的RX 可用
    D8 GPIO15 SPI总线的CS、Serial的TX 可用
    D9 GPIO3 Serial的RX 可用
    D10 GPIO1 Serial的TX 可用
    SD2 GPIO9 尽量不用
    SD3 GPIO10 尽量不用

        从上面表格可以看出,我们大约11个GPIO引脚可用。而11个中的2个引脚通常被保留用于RX和TX,以便进行串口通信。因此最后,只剩下8个通用I / O引脚,即D0到D8(除开D3特殊用途)。

    温馨提示

        请注意,D0 / GPIO16引脚只能用作GPIO读/写,不支持特殊功能。

    4. 数字IO(Digital IO)

        上面说到,ESP8266-12F(也可以大胆说ESP8266-12系列)最终只剩下8个通用的I/O引脚以供我们使用,即是NodeMcu上的D0-D8(除D3之外)。
        Arduino中的引脚号直接与ESP8266 GPIO的引脚号对应通信。pinMode/digitalRead/digitalWrite函数不变,所以要读取GPIO2,可调用digitalRead(2)。除了D0可以设置为INPUT(输入)、OUTPUT(输出)或者INPUT_PULLDOWN(输入,默认下拉,也就是低电平),剩余的数字IO引脚可以设置为INPUT(输入)、OUTPUT(输出)或者INPUT_PULLUP(输入,默认上拉,也就是高电平)。
        下面,将在NodeMcu的D1引脚上写一个LED Blink的Arduino草图:

    /**
     * LED灯闪烁实验
     */
    void setup() {
        pinMode(D1, OUTPUT);   // 初始化D1引脚为输出引脚
    }
     
    void loop() {
        digitalWrite(D1, LOW); // 亮灯
        delay(1000); // 延时1s
        digitalWrite(D1, HIGH);// 灭灯
        delay(1000); // 延时1s
    }
    

    注意

        某些开发板和模块,仍将使用第9和第11引脚(如果闪存芯片工作于DIO模式,与默认的QIO模式相反),它们可用于IO。

    5. 中断功能

        中断可以理解为在正常的运行流程中突然插入的操作,这就像你在忙于工作的时候,领导突然叫你去买个下午茶,然后你就去把下午茶买回来,再继续工作。基于ESP8266的NodeMcu的数字IO的中断功能是通过attachInterruptdetachInterrupt函数所支持的。除了D0/GPIO16,中断可以绑定到任意GPIO的引脚上。所支持的标准中断类型有:CHANGE(改变沿,电平从低到高或者从高到低)、RISING(上升沿,电平从低到高)、FALLING(下降沿,电平从高到低)。
        首先,我们来看看Arduino IDE中用于中断的函数。
        1.attachInterrupt()
        该功能用于在将指定引脚设置为响应中断。
        函数: attachInterrupt(pin, function, mode);
        参数:
            pin:要设置中断编号,注意,这里不是引脚编号。
            function:中断发生时运行的函数, 这个函数不带任何参数,不返回任何内容。
            Interrupt type/mode:它定义中断被触发的条件方式。
                CHANGE:改变沿,引脚电平从低变为高或者从高变为低时触发中断。
                RISING:上升沿,引脚电平从低变为高时触发中断。
                FALLING:下降沿,引脚电平从高变为低时触发中断。
        返回值: 无;

        2.detachInterrupt()
        该功能用于禁用指定GPIO引脚上的中断。
        函数: detachInterrupt(pin)
        参数:
            pin:要禁用的中断的GPIO引脚。
        返回值: 无;

        3.digitalPinToInterrupt()
        该功能用于获取指定GPIO引脚的中断号。
        函数: digitalPinToInterrupt(pin)
        参数:
            pin:要获取中断号的GPIO引脚。

    例子
        将NodeMcu的D2引脚设置为上升沿中断。在D2上外接一个按键,按键通过电阻下拉到地。当发生中断的时候,我们在串口监视器上打印“Hello ESP8266”。

    image

    例子代码

    /**
     * 功能描述:ESP8266中断演示
     */ 
    void setup() {
     Serial.begin(115200);//设置串口波特率
     attachInterrupt(digitalPinToInterrupt(D2), InterruptFunc, RISING);//设置中断号、响应函数、触发方式
    }
     
    void loop() {
    }
    
    /**
     * 中断响应函数
     */ 
    ICACHE_RAM_ATTR void InterruptFunc(){
     Serial.println("Hello ESP8266");
    }
    

    6. 模拟输入(ADC)

        学过模拟电路或者数字电路的人都会听过ADC,它又叫做模数转换器,用于将模拟信号转换成可视化的数字形式。ESP8266具有内置的10位ADC,只有一个ADC通道,即只有一个ADC输入引脚可读取来自外部器件的模拟电压。
        ESP8266上的ADC通道和芯片供电电压复用,也就是说我们可以将其设置为测量系统电压或者外部电压。

    6.1 测量外部电压

        相关方法
            analogRead(A0),用于读取施加在模块的ADC引脚上的外部电压;
        输入电压范围
            0 - 1.0V之间;
        测量精度
            由于ADC具有10位分辨率,因此会给出0-1023的值范围;
        注意点
            为了支持外部电压范围(0-3.3v),NodeMcu做了一个电阻分压器,如图所示:

    image

        例程
        编写一个读取NodeMcu的ADC引脚上的模拟电压。我们这里使用电位器在ADC引脚上提供0-3.3V的可变电压。如下图连接线:
    image
        代码如下:

    /**
     * 功能描述:ESP8266 ADC 读取外部电压
     * 在串口调试器查看效果
     */
    void setup() {
      Serial.begin(115200);//配置波特率
    }
     
    void loop() {
      Serial.print("ADC Value: ");
      Serial.println(analogRead(A0));//输出0-1023 对应 外部输入电压 0-1.0v
      //延时1s
      delay(1000);
    }
    

    6.2 测量系统电压

        相关方法
            ESP.getVcc(),读取NodeMCU模块的VCC电压,单位是mV;
        注意点
            ADC引脚必须保持悬空;在读取VCC电源电压之前,应更改ADC模式以读取系统电压。
    要ADC_MODE(mode)在#include行后面改变ADC模式。
    模式是ADC_TOUT(对于外部电压),ADC_VCC(对于系统电压)。默认情况下,它读取外部电压。
        例程
        编写ESP8266读取系统电压,代码如下:

    /**
     * 功能描述:ESP8266 ADC 读取系统电压
     * 在串口调试器查看效果
     */
    ADC_MODE(ADC_VCC);//设置ADC模式为读取系统电压
     
    void setup() {
      Serial.begin(115200);
    }
     
    void loop() {
      Serial.print("ESP8266当前系统电压(mV): ");
      Serial.println(ESP.getVcc());
      delay(1000);
    }
    

    7. 模拟输出(PWM)

        PWM(Pulse Width Modulation,脉宽调制),是在保持波的频率不变的同时改变脉宽的技术。当我们需要连续控制电压变化,实现呼吸灯或者电机转速的时候,就要用到PWM,如下图。
    image
        首先,我们来理解一下占空比。一个脉冲周期由一个ON周期(VCCC)和一个OFF周期(GND)组成。一段时间内ON周期占据脉冲周期的比例就叫做占空比。

    DutyCycle(percentage)=Ton/TotalPeriodX100

        例如,一个10ms的脉冲保持ON 2ms,那么根据公式,占空比是20%。

    注意点

        脉冲频率一般都是固定的,跟占空比没有关系。

    NodeMcu PWM引脚

        如下图,标注PWM引脚。

    image

        基本上数字IO都可以作为PWM复用引脚,除了D0。不过需要注意的是,D3尽量不用,它内部连接ESP8266 GPIO0。

    NodeMcu PWM有关Arduino函数

        1.analogWrite()
        该功能用于在指定的引脚上启用软件PWM。
        函数: analogWrite(pin,val)
        参数:
            pin:要启用软件PWM的GPIO引脚。
            val:数值,一般在0到PWMRANGE范围,默认PWMRANGE是1023。
        返回值: 无;
        注意点:
            analogWrite(pin, 0)用于禁用指定引脚上的PWM。
        2.analogWriteRange()
        该功能用于改变PWMRANGE数值。
        函数: analogWriteRange(new_range)
        参数:
            new_range:新的PWMRANGE数值。
        返回值: 无;
        注意点:
            可以理解为PWM精度范围。同样的PWM频率下,默认占空数值0-123。如果你改变PWMRANGE为2047,那么占空数值就变成0-2047。精度高了一倍。
        3.analogWriteFreq()
        该功能用于改变PWM频率。
        函数: analogWriteFreq(new_frequency)
        参数:
            new_frequency:新PWM频率,默认是1kHZ。
        返回值: 无;
        注意点:
            百度上很多资料都说PWM频率范围为1-1KHz。但是通过查看源码,如下:

    static uint16_t analogFreq = 1000;
    
    extern void __analogWriteFreq(uint32_t freq) {
      if (freq < 100) {
        analogFreq = 100;
      } else if (freq > 40000) {
        analogFreq = 40000;
      } else {
        analogFreq = freq;
      }
    }
    

        可以看出,Arduino For ESP8266的PWM频率范围应该是100Hz-40KHz

    PWM例程

        呼吸灯,LED灯明暗连续变化。代码如下:

    /**
     * 功能描述:ESP8266 PWM演示例程
     * @author 单片机菜鸟
     * @date 2018/10/25
     */
     
    #define PIN_LED D6
     
    void setup() {
      // 这里开始写初始化代码,只会执行一次
      pinMode(PIN_LED,OUTPUT);
      analogWrite(PIN_LED,0);
    }
    
    void loop() {
      //这里写运行代码,重复执行
      for(int val=0;val<1024;val++){
         //占空比不断增大  亮度渐亮
    	 analogWrite(PIN_LED,val);
    	 delay(2);
      }
      
      for(int val=1023;val>=0;val--){
         //占空比不断变小  亮度渐暗
    	 analogWrite(PIN_LED,1023);
    	 delay(2);
      }
    }
    

    8. 串口通信(Serial)

        ESP8266的串口通信与传统的Arduino设备完全一样。除了硬件FIFO(128字节用于TX和RX)之外,硬件串口还有额外的256字节的TX和RX缓存。发送和接收全都由中断驱动。当FIFO/缓存满时,write函数会阻塞工程代码的执行,等待空闲空间。当FIFO/缓存空时,read函数也会阻塞工程代码的执行,等待串口数据进来。
        NodeMcu上有两组串口,Serial和Serial1。
        Serial使用UART0,默认对应引脚是GPIO1(TX)和GPIO3(RX)。在Serial.begin执行之后,调用Serial.swap()可以将Serial重新映射到GPIO15(TX)和GPIO13(RX)。再次调用Serial.swap()将Serial重新映射回GPIO1和GPIO3。不过,一般情况下,默认就好。

    串口映射例程

    /**
     * 功能描述:ESP8266 Serial映射例程
     * @author 单片机菜鸟
     * @date 2018/10/25
     */
     
    void setup() {
      // 这里开始写初始化代码,只会执行一次
      Serial.begin(115200);
      Serial.println("GPIO1(TX),GPIO3(RX)");
      //调用映射方法
      Serial.swap();
      Serial.println("GPIO15(TX),GPIO13(RX)");
      //重新映射回来
      Serial.swap();
      Serial.println("GPIO1(TX),GPIO3(RX)");
    }
    
    void loop() {
      //这里写运行代码,重复执行
    }
    

        Serial1使用UART1,默认对应引脚是GPIO2(TX)。Serial1不能用于接收数据,因为它的RX引脚被用于flash芯片连接。要使用Serial1,请调用Serial.begin(baudrate)。代码如下:

    /**
     * 功能描述:ESP8266 串口例程
     * @author 单片机菜鸟
     * @date 2018/10/25
     */
     
    void setup() {
      // 这里开始写初始化代码,只会执行一次
      Serial.begin(115200);
      Serial.println("Hello Serial");
      Serial1.begin(115200);
      Serial1.println("Hello Serial1");
    }
    
    void loop() {
      //这里写运行代码,重复执行
    }
    

        如果不使用Serial1并且不映射串口,可以将UART0的TX映射到GPIO2,具体操作是:在Serial.begin()之后调用Serial.set_tx(2)或者直接调用Serial.begin(baud,config,mode,2)。
        默认情况下,当调用Serial.begin后,将禁用WiFi库的诊断输出。要想再次启动调试输出,请调用Serial.setDebugOutput(true)。要将调试输出映射到Serial1时,需要调用Serial1.setDebugOutput(true)。
        调用Serial.setRxBufferSize(size_t size)允许定义接收缓冲区的大小,默认值是256(缓冲区也是使用内存,意味着不能一味地去增大这个值)。
        Serial和Serial1对象都支持5,6,7,8个数据位,奇数(O)、偶数(E)和无(N)奇偶校验,以及1或者2个停止位。要设置所需的模式,请调用Serial.begin(baudrate, SERIAL_8N1), Serial.begin(baudrate, SERIAL_6E2)等。
        Serial和Serial1都实现了一种新方法用来获取当前的波特率设置。要获取当前的波特率,请调用Serial.baudRate(),Serial1.baudRate()。代码如下:

    /**
     * 功能描述:ESP8266 串口波特率例程
     * @author 单片机菜鸟
     * @date 2018/10/25
     */
     
    void setup() {
      // 这里开始写初始化代码,只会执行一次
      // 设置当前波特率为57600
      Serial.begin(57600);
      // 获取当前波特率
      int br = Serial.baudRate();
      // 将打印 "Serial is 57600 bps"
      Serial.printf("Serial is %d bps", br);
    }
    
    void loop() {
      //这里写运行代码,重复执行
    }
    

        Serial和Serial1都属于硬件串口(HardwareSerial)的实例,如果读者需要使用ESP8266 软件串口的功能,请参考以下库:https://github.com/plerup/espsoftwareserial。
        为了检测进入Serial的未知波特率的数据,可以调用Serial.detectBaudrate(time_t timeoutMillis)。这个方法尝试在timeoutMillis ms的时间内检测波特率,检测成功返回波特率,检测失败返回0。detectBaudrate()方法在Serial.begin()被调用之前调用(因为它不需要用到接收缓冲区或者串口配置),并且它不能检测数据位位数或者停止位。这个检测过程不会去改变数据的波特率,所以可以在检测成功之后,调用Serial.begin(detectedBaudrate)。

    串口用处

        一般来说,串口通信用在两个方面:
        1.与外围串口设备传输数据,比如蓝牙模块、Arduino等等;
        2.开发过程中用来调试代码,通过串口输出Debug信息了解程序运行信息。例程如下:

    /**
     * Demo1:
     *    statin模式下,创建一个连接到可接入点(wifi热点),并且打印IP地址
     * @author 单片机菜鸟
     * @date 2019/09/02
     */
    #include <ESP8266WiFi.h>
     
    #define AP_SSID "xxxxx" //这里改成你的wifi名字
    #define AP_PSW  "xxxxx"//这里改成你的wifi密码
    //以下三个定义为调试定义
    #define DebugBegin(baud_rate)    Serial.begin(baud_rate)
    #define DebugPrintln(message)    Serial.println(message)
    #define DebugPrint(message)    Serial.print(message)
     
    void setup(){
      //设置串口波特率,以便打印信息
      DebugBegin(115200);
      //延时2s 为了演示效果
      delay(2000);
      DebugPrintln("Setup start");
      //启动STA模式,并连接到wifi网络
      WiFi.begin(AP_SSID, AP_PSW);
     
      DebugPrint(String("Connecting to ")+AP_SSID);
      //判断网络状态是否连接上,没连接上就延时500ms,并且打出一个点,模拟连接过程
      //笔者扩展:加入网络一直都连不上 是否可以做个判断,由你们自己实现
      while (WiFi.status() != WL_CONNECTED){
        delay(500);
        DebugPrint(".");
      }
      DebugPrintln("");
     
      DebugPrint("Connected, IP address: ");
      //输出station IP地址,这里的IP地址由DHCP分配
      DebugPrintln(WiFi.localIP());
      DebugPrintln("Setup End");
    }
     
    void loop() {
    }
    

    9. 总结

        总体上讲,本章基础内容比较多,笔者介绍ESP8266在Arduino平台上的一些基础知识点,包括程序结构、NodeMcu端口映射、ESP8266 数字IO、PWM、ADC、串口通信等等。
    本章目的很简单,就是为了告诉读者,ESP8266到底给我们提供了什么可利用硬件资源,以方便我们项目开发。

    展开全文
  • 基于Arduino平台开发ESP8266,我们至少要分别准备好硬件和软件开发环境:     1. 硬件     ESP8266模块,或者ESP8266开发板,笔者建议初学者直接使用开发板;     2. 软件     Arduino IDE开发...

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。

    共同学习成长QQ群 622368884,不喜勿加,里面有一大群志同道合的探路人

    快速导航
    单片机菜鸟的博客快速索引(快速找到你要的)

    如果觉得有用,麻烦点赞收藏,您的支持是博主创作的动力。

        俗话说,工欲善其事必先利其器。基于Arduino平台开发ESP8266,我们至少要分别准备好硬件和软件开发环境:
        1. 硬件
        ESP8266模块,或者ESP8266开发板,笔者建议初学者直接使用开发板;
        2. 软件
        Arduino IDE开发环境;

    1. 硬件

        硬件环境主要分为两种:
        1. ESP8266开发板 + USB线
        笔者建议入门初学者直接入手一块开发板,开发板的一个好处就是板子设计者已经给初学者排查了硬件连接错误,可以使初学者专注于软件开发,加快学习进度。目前比较火的一款ESP8266开发板就是NodeMcu,其核心芯片是ESP8266-12F,如下图所示(图片引用自安信可官网):

    在这里插入图片描述

        不过,笔者本书也使用了另外一款开发板——ESP202测试板,其核心芯片也是ESP8266-12F,如下图所示:

    [外链图片转存失败(img-Poj7txt9-1569023067024)(https://raw.githubusercontent.com/tingyouwu/Arduino/master/%E7%AC%AC2%E7%AB%A0_%E5%9B%BE7_ESP202%E6%B5%8B%E8%AF%95%E6%9D%BF.jpg)]

        笔者选择它的理由很简单——既有NodeMcu的功能,又可以作为ESP8266-01系列模组的烧写器,这样就不用手动搭建ESP01的烧写环境。

        2. ESP8266模块 + USB转TTL线
        如果WiFi模块是ESP8266-01系列,首先请看一下以下引脚接口说明:

    引脚编号 引脚定义 引脚描述
    1 TX 1)UART_TX发送端;2)通用IO口:GPIO1;
    2 GND GND
    3 CH_PD 1)高电平工作;2)低电平模块供电关掉;
    4 GPIO2 开机上电时必须为高电平,禁止硬件下拉,内部默认已拉高;
    5 GPIO16 外部Reset信号,低电平复位,高电平工作(默认应该是高电平);
    6 GPIO0 接地进入烧录固件模式,悬空为正常运行模式;
    7 VCC 3.3V(切记不要供5V!!!)
    8 RX 1)UART_RX接收端;2)通用IO口:GPIO3;

        其余引脚悬空即可。 从引脚介绍表可以看出,关键引脚GPIO0决定了模块当前处于什么工作模式。

    烧录固件模式

        请按照下图连接ESP8266-01和USB转TTL线,进入烧录模式:

    image

        如果WiFi模块是ESP8266-12系列,按照下图对应引脚接线:

    image

    温馨提示

    • 从Arduino IDE角度来看,ESP8266工作模式包括:
      1.烧录固件模式
      下载代码的时候,需要将GPIO0口接地;
      2.正常工作模式
      下载完代码,需要将GPIO0口悬空;
      有电路经验的读者可以安装拨码开关来切换工作模式。
    • 注意ESP8266安全工作电压是3.3V,不要直接连接5v;
    • 手动切换工作模式之后,最好重新启动一下ESP8266模块(通断电);
    • 有时ESP8266下载失败,有可能是供电问题,可以尝试独立供电,不直接连到TTL Vcc;
    • 烧录固件,我们需要了解的是,我们的固件是以下哪一种:AT固件、自己编写的SDK固件(基于ESP8266 SDK开发或者Lua)以及本书基于Arduino平台开发的ESP8266固件(笔者成为 ESP8266 Arduino固件)。

    2. 软件开发环境

        软件安装需要分成两个步骤:
        1.安装Arduino IDE
        Arduino IDE开发环境主要用于Arduino Uno/Mini/Mega2560等平台的项目开发。而ESP8266也可以基于该IDE来开发, 所以我们首先需要安装它;
        2.配置Arduino Core For ESP8266
        Arduino Core For ESP8266可以理解为能在Arduino IDE上开发ESP8266的插件;

    2.1 安装Arduino IDE

        由于某些原因,Arduino官网网站(https://www.arduino.cc/en/Main/Software) 经常打不开或者下载速度极慢,导致下载IDE非常困难,读者可以通过以下两种方式下载安装:

    1. 笔者提供了百度网盘链接(https://pan.baidu.com/s/1QGAbBAsP4-VNQfT-bV46aA) 以供大家下载,长期有效,请注意英文大小写。
    2. 通过Arduino中文社区链接地址(https://www.arduino.cn/thread-5838-1-1.html) 去下载。

        如果你下载的是windows安装版(exe后缀),那么直接安装即可,其他则直接解压即可使用,注意路径不要存在中文目录。笔者写本书的时候所用的Arduino IDE版本是1.8.5,启动Arduino,会出现如下图所示界面:

    image

    2.2 安装ESP8266开发环境

        安装好Arduino IDE环境后,就得在它基础上配置Arduino Core For ESP8266。以window版本为例,读者可以安装以下顺序安装:

    1. 打开Arduino IDE->菜单项文件->首选项,然后会看到附加开发版管理器网址,填入http://arduino.esp8266.com/stable/package_esp8266com_index.json,重启IDE;
      image
    2. 重启IDE之后->菜单项工具->开发板->点击开发板管理器->滚动找到ESP8266平台;
      image
    3. 从下拉选项中选择你想下载的版本,点击安装,需要等待一段时间安装完毕。笔者建议下载最新的版本,笔者写本书的时候最新版本是2.4.2,后续章节都是基于这个版本来讲解。
    4. 安装成功的话,会可以看到下图所示。

    image

        到此,整个软件开发环境搭建完毕。

    温馨提示

    • 如果安装失败,一般都是因为网络问题,可以尝试多次重新安装;多次安装失败之后,可能需要翻墙;
    • Arduino Core For ESP8266库版本之间是有区别,有些版本可能没有某些方法,比如笔者刚开始的时候安装了2.0.0版本,但是编译代码不通过,提示client.peekBytes方法不存在,安装最新版本完美无bug。
    • Arduino IDE界面相对比较简单,笔者觉得代码提示功能、自动补全不够友好,推荐使用Visual Studio、Eclipse等更为专业的开发环境进行开发。这些第三方的开发环境都需要下载对应的Arduino插件进行配置,笔者这里就不具体讲解,有兴趣的可以自行查阅资料解决。

    当然如果你还是安装不成功,可以到博主技术群去寻找一键安装exe文件
    在这里插入图片描述

    3. 烧录ESP8266

        实验是检验真理的唯一标准,配置好硬件和软件环境之后,笔者就给读者提供一个实例代码,并且告诉读者如何配置烧录以及提及一些烧录配置注意点。

    3.1实例代码

        首先,请读者不用在意代码细节问题,请先拷贝如下代码到Arduino IDE,然后点击编译:

    /**
     * Demo:
     *    测试ESP8266 demo
     *    打印ESP8266模块信息
     *    1.打印Arduino Core For ESP8266 版本,笔者是2.4.2版本
     *    2.打印Flash的唯一性芯片id(读者可以思考一下是否可以用来做点什么唯一性参考)
     *    3.打印Flash实际大小
     *    4.打印IDE配置的使用Flash大小
     *    5.打印IDE配置的Flash连接通信的频率
     *    6.打印Flash连接模式:QIO QOUT DIO DOUT,可以理解为Flash传输速率
     * @author 单片机菜鸟
     * @date 2018/10/22
     */
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(115200);
      //使能软件看门狗的触发间隔
      ESP.wdtEnable(5000);
    }
    
    void loop() {
      //喂狗
      ESP.wdtFeed();
      FlashMode_t ideMode = ESP.getFlashChipMode();
      String coreVersion = ESP.getCoreVersion();
      Serial.print(F("Arduino Core For ESP8266 Version: "));
      Serial.println(coreVersion);
      Serial.printf("Flash real id(唯一标识符):   %08X\n", ESP.getFlashChipId());
      Serial.printf("Flash 实际大小: %u KBytes\n", ESP.getFlashChipRealSize()/1024);
      Serial.printf("IDE配置Flash大小: %u KBytes,往往小于实际大小\n", ESP.getFlashChipSize()/1024);
      Serial.printf("IDE配置Flash频率 : %u MHz\n", ESP.getFlashChipSpeed()/1000000);
      Serial.printf("Flash ide mode:  %s\n\n", (ideMode == FM_QIO ? "QIO" : ideMode == FM_QOUT ? "QOUT" : ideMode == FM_DIO ? "DIO" : ideMode == FM_DOUT ? "DOUT" : "UNKNOWN"));
      
      delay(1000);
    }
    

    代码讲解
        1.setup函数里面,主要设置了串口通信波特率115200(串口调试器的波特率需要设置成一致),同时设置了软件看门狗WatchDog的触发间隔5s(看门狗的作用就是如果不喂狗就会在触发时间到达的时候自动复位,很多);
        2.在loop函数中,会不断循环执行,所以需要喂狗,然后就打印ESP8266 Arduino Core的当前版本、芯片id、flash实际大小、Arduino IDE配置Flash大小、通信频率以及flash的连接模式(这些信息都可以称为ESP8266模块的物理信息)。

    温馨提示
        如果以上代码编译不通过,原因一般是以下两个之一:
        1.烧录配置没改成ESP8266(请看下小节讲解),当前可能是Arduino Uno、Mega等平台;
        2.Arduino Core For ESP8266软件环境没有配置成功,请重新检查一遍;
        3.上面例子的看门狗属于软件看门狗,作用是:如果在规定时间内不进行喂狗操作,那么系统就会在看门狗的作用下复位。默认情况下,软件看门狗是开启的,很多读者的代码运行之所以不稳定或者抛出各种异常,其中一大原因就是没有喂狗。关于这一个,笔者后面的章节会有具体讲解。

    3.2 烧录配置

        笔者的开发板是ESP202测试板,核心芯片是ESP8266-12F,Flash大小是4MB,Flash芯片是W25Q32,适用下图配置:

    image

    烧录代码
        ESP8266进入烧录固件模式,点击上传,等待上传结果。
        如果显示下图,表示上传成功。
    image

        如果显示下图,表示上传失败。

    image

    温馨提示

        上传失败原因可能有以下几点,请逐一排除:
        1.烧录过程还没有显示任何进度就立刻提示失败,原因如下:

    • ESP8266的COM端口没选对,请确认ESP8266对应端口;

    • ESP8266 Upload Speed选择不对,默认应该是115200;

    • ESP8266还没有进入到烧录固件模式,重新进入烧录模式;

    • Flash Mode没选对,比如有些NodeMcu需要选择为DIO/DOUT,Flash Mode有如下选型:
      image
      那么它们之间的区别在哪里呢?
      1)QIO , for flash that support quad r/w operation(e.g. W25Q flash芯片)
      2)QOUT, for flash that support quad read operation(e.g. W25Q flash芯片)
      3)DIO, for flash that support dual r/w operation(e.g. W25Q &W25X flash芯片)
      4)DOUT, for flash that support dual read operation(e.g. W25Q &W25X flash芯片)
      它们之间的区别可以简单理解为传输速率的区别,quad是四倍传输速率,dual是两倍传输速率。
      经测试:
      Winbond 25Q32B 可工作于 DIO / DOUT / QIO /QOUT (Noduino Falcon);
      BergMicro 25Q32A 只可工作于 DIO / DOUT (NodeMCU V1.0 可能是 ESP-12E 接线的问题);
      MXIC 25L80 (小 K mini)只可工作于 DOUT;

    • Flash Size大于Flash实际大小,最好改成往下兼容Flash实际大小,也就是不能大于Flash实际大小,Flash Size有多种选型,请看下图:

    image

    切记:配置时,请查阅ESP8266 选型表(笔者在第1章有讲解过)。
    2.烧录过程显示一定进度就提示失败,原因如下:

    • ESP8266供电不稳定,请尝试独立供电;
    • ESP8266模块接线接触不良;

    3.3 测试结果

        烧录完上面测试固件之后,笔者的测试结果如下(正常情况下读者的结果也会跟笔者一样大同小异):

    image

    4. 本章总结

        在这一章,笔者给读者讲解了硬件环境的配置以及Arduinio IDE环境的配置,并且提供了一个获取ESP8266物理信息的测试例子,同时也讲解了烧录固件的配置工作以及常见问题。可以这么说,这章属于配置环境基础,属于我们成功的第一步。

    展开全文
  • 1、 Esp8266之 搭建开发环境,开始一个“hellow world”串口打印。 2、 Esp8266之 利用GPIO开始使用按钮点亮你的“第一盏灯”。 3、 Esp8266之 利用 “软件定时器 ” 定时0.5秒闪烁点亮一盏LED。 4 、Esp8266之 ...
  • ESP8266

    千次阅读 2019-07-27 12:34:46
    ESP8266EX 的工作温度范围大,且能够保持稳定的性能,能适应各种操作环境。 2.低功耗 ESP8266EX 专为移动设备、可穿戴电子产品和物联网应用而设计,通过多项专有技术实现了超低功耗。ESP8266EX 具有的省电模式适用...
  • ESP8266开发之旅 网络篇⑥ ESP8266WiFiGeneric——基础库

    万次阅读 多人点赞 2019-06-20 08:54:15
    ESP8266WiFi库不仅仅局限于 ESP8266WiFi.h 和 ESP8266WiFi.cpp 这两个文件,只不过它们是最核心的统一入口。     而在这些库中,有个8266模块通用库 ESP8266WiFiGeneric库,ESP8266WiFiSTA/ESP8266WiFiAP/ESP82...
  • ESP8266】基于ESP8266的MicroPython入门笔记

    万次阅读 多人点赞 2017-01-01 16:36:29
    本文是ESP8266运行MicroPython入门笔记,记录自己在探索MicroPython所见所思的同时,也顺便简单评估该开发方式的优缺点。 开发环境 ESP8266开发板: ESP-LAUNCHER(4 MB Flash) 操作系统:Win10 64位 ...
  • 51单片机通过ESP8266模块与手机进行通讯(单片机)

    万次阅读 多人点赞 2018-02-08 18:29:43
    Step1:配置ESP8266 通过USB转TTL模块把ESP8266模块和电脑连接起来,如图 把ESP8266模块的VCC,GND,CH_PD,UTXD,URXD口分别接USB转TTL模块的3.3v,地,3.3v,RXD,TXD 连接好后,就准备用电脑用串口调试助手向ESP8266...
  • 打开arduino 打开file ->... 将这个链接http://arduino.esp8266.com/stable/package_esp8266com_index.json填入’Additional Boards Manager URls’中 打开tool->board->boards manage,在其...
  • ESP8266_11 ESP8266的UDP广播

    千次阅读 2019-08-29 23:58:48
    ESP8266_01搭建开发环境 ESP8266_02程序的编译与下载 ESP8266_03SDK与Makefile的基本用法 ESP8266_04管脚控制与软件定时器 ESP8266_05 ESP8266有几个串口? ESP8266_06硬件定时器与IO中断 ESP8266_07基于PWM的...
  •     博主的 ESP8266开发之旅 专栏主要分为三个部分: 基础篇 网络篇 应用篇     从这一篇开始,博主将会带领各位读者在基础篇的基础上进入网络的世界。在此,博主认为各位读者已经具备以下前提: ...
  • ESP8266_10 ESP8266的STATION模式

    千次阅读 2019-08-28 00:02:16
    ESP8266_01搭建开发环境 ESP8266_02程序的编译与下载 ESP8266_03SDK与Makefile的基本用法 ESP8266_04管脚控制与软件定时器 ESP8266_05 ESP8266有几个串口? ESP8266_06硬件定时器与IO中断 ESP8266_07基于PWM的...
  •     在前面的篇章中,博主给大家讲解了ESP8266的软硬件配置以及基本功能使用,目的就是想让大家有个初步认识。并且,博主一直重点强调 ESP8266 WiFi模块有三种工作模式: Station模式,也叫站点模式; Soft-...
  • 2 相关工具及原理介绍2.1 硬件介绍——ESP8266WIFI模块ESP8266 系列模组是安信可(Ai-thinker)公司采用乐鑫ESP8266芯片开发的一系列wifi 模组模块。其硬件图如下: 图1 ESP8266硬件图2.1.1 ESP8266WIFI模块的...
  • 该文件为百度云连接,...ESP8266 wifi模块 ESP8266无线开发板 8266 SDK开发 wifi模块 视频和资料。以及源码demo案例 和几个简单视频的案例教程 完全适合喜欢esp8266 sdk开发的同学 支持esp8266 专门的eclipse 进行开发
  • 51单片机通过WIFI模块ESP8266控制LED灯

    万次阅读 多人点赞 2018-06-16 18:47:40
    手机APP通过ESP8266 WIFI模块与51单片机通信控制LED灯的开关。下位机由单片机、ESP8266模块和LED灯组成,上位机由Android手机APP承担。我们在APP上发送LED灯的开关控制指令,ESP8266将收到的数据发送给单片机,从而...
  • ESP8266_21基于ESP8266的一键配网

    千次阅读 2019-11-07 18:39:16
    ESP8266_01搭建开发环境 ESP8266_02程序的编译与下载 ESP8266_03SDK与Makefile的基本用法 ESP8266_04管脚控制与软件定时器 ESP8266_05 ESP8266有几个串口? ESP8266_06硬件定时器与IO中断 ESP8266_07基于PWM的...
  • ESP8266 WIFI串口通信模块应该是使用最广泛的一种WIFI模块之一了。为什么呢? 因为ESP8266模块是一款高性能的WIFI串口模块,可以不用知道太多WIFI相关知识就可以很好的上手。说白了,只是个WIFI转串口的设备,你...
  • ESP8266_01搭建开发环境 ESP8266_02程序的编译与下载 ESP8266_03SDK与Makefile的基本用法 ESP8266_04管脚控制与软件定时器 ESP8266_05 ESP8266有几个串口? ESP8266_06硬件定时器与IO中断 ESP8266_07基于PWM的...
  • ESP8266-Websocket, 用于 ESP 8266的web socket库 web socket客户端和ESP-8266服务器这是一个实现 web socket客户端和运行在ESP-8266上的服务器的简单库。正在启动应该从你可以访问的任何web服务器中提供示例 ...
  • ESP8266_05 ESP8266有几个串口?

    千次阅读 2019-07-29 22:39:30
    ESP8266_01搭建开发环境 ESP8266_02程序的编译与下载 ESP8266_03SDK与Makefile的基本用法 ESP8266_04管脚控制与软件定时器 ESP8266_05 ESP8266有几个串口? ESP8266_06硬件定时器与IO中断 ESP8266_07基于PWM的...
  • 编译代码提示缺少ESP8266WiFi库(原因之一就是选择了非ESP8266板子编译,比如Arduino UNO); ESP8266烧录失败(原因之一就是配置了错误的烧录选项,比如目标板是NodeMcu但是选择了其他板子); ESP8266烧录成功,...
  •     在前面的篇章中,博主给大家讲解了ESP8266的软硬件配置以及基本功能使用,目的就是想让大家有个初步认识。并且,博主一直重点强调 ESP8266 WiFi模块有三种工作模式: Station模式,也叫站点模式; Soft-...
  • 1. 前言     在前面章节的博客中,博主介绍了ESP8266WiFi库 Tcp client的用法,并模拟了Http请求。...答案肯定是有的,这就是博主本篇需要跟大家讲述的知识——ESP8266HTTPClient库。     请注意...
  • ESP8266WiFi.h&gt; #include &lt;ESP8266HTTPClient.h&gt; #include &lt;DHT.h&gt; #define DHTTYPE DHT11 // DHT type (DHT11, DHT22) #define DHTPIN 5 // Broche du DH...
  • linux(ubuntu)esp8266编译环境搭建。最新ESP8266_RTOS_SDK,V3.3
  • 分为以下部分: 1:接线并使用AT指令验证连接 2:使用软串口 3:搭建/配置/测试MQTT服务端 4:在Arduino实现MQTT的PUB客户端 5:总结 接线并使用AT指令验证连接 需要各种线+10k电阻*1 ...ESP8266的GN
  • esp8266怎么配置 esp8266和USB转TTL连接 esp8266简单介绍 esp8266连接路由器 esp8266通过路由器连接在同一局域网中的电脑,建立TCP连接 esp8266使用串口发送数据到电脑上的网络调试助手 esp8266使用串口通过局域网...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,774
精华内容 8,709
关键字:

esp8266