既然是中国十大最有影响力的芯片之一 一定要有个好开发板

网友投稿 2018-09-13 23:22

要评选中国影响力十大芯片,ESP8266必在其中。虽然开发文档有些混乱,各种生态纷杂,但它的低价,给了开发者更低门槛,也让更多人都参与到WiFi的开发体验中来。 从这种意义上来说,ESP8266是一款伟大的SoC!可能生态太繁茂了,所以官方开发板显得并不重要,曝光度也不高。但是我们还是想要尝试一下它的开发体验。下面正文开始

ESP8266系列产品是Espressif Systems生产的WiFi芯片,主要应用在物联网设备上。ESP8266系列目前包括ESP8266EX和ESP8285芯片及ESP32等。

ESP8266EX,简称为ESP8266是片上系统(SoC),集成了32位Tensilica微控制器,标准数字外设接口,天线开关,RF巴伦,功率放大器,低噪声接收放大器,滤波器和电源管理模块,体积小巧但功能强大。它提供2.4 GHz Wi-Fi(802.11 a/b/gn,支持WPA / WPA2),通用输入/输出(16 GPIO),内部集成电路(I²C),模数转换功能,串行外设接口(SPI),带有DMA的I²S接口(与GPIO共用引脚),UART(在专用引脚上,在GPIO2上可以使能仅发送UART)和脉冲宽度调制(PWM)。Espressif称为“L106”的处理器内核基于Tensilica' s Diamond Standard 106Micro 32位处理器控制器内核,运行频率为80 MHz(或超频至160 MHz)。它具有64 KiB引导ROM,32 KiB指令RAM和80 KiB用户数据RAM。(另外还包含32 KiB指令高速缓存RAM和16 KiB ETS系统数据RAM)。可以通过SPI访问外部闪存。芯片本身采用5 mm×5 mm Quad Flat No-Leads封装,带有33个连接焊盘 - 每侧有8个焊盘。

ESP-LAUNCHER是官方推出的功能评估板,然而奇怪的是,在林林总总的ESP8266开发板中,该板曝光频率并不高,倒是各种小型ESP8266模块频繁出现在开发者的视野中。ESP-LAUNCH接口丰富,使用方便;在开发环境方面,除了支持SDK开发模式之外,还支持使用Arduino,支持MicroPython等各种丰富的平台。

https://cdn.china-scratch.com/timg/180915/2322003125-0.jpg

开发板由两大块组成。一个ESP_TEST Board,上面包含ESP8266EX及4MB的SPI FLASH存储器,另外该子板还提供了一个天线接口,套件还提供了天线;另外一块是底板,提供了丰富的板载外设及接口。

https://cdn.china-scratch.com/timg/180915/2322004R8-1.jpg

装上天线的效果图,看起来高大上,是真高!

https://cdn.china-scratch.com/timg/180915/2322003441-2.jpg

ESP-LAUNCHER提供了丰富的板载资料及接口,如图所示。

ESP系列产品的核心是Tensilica微控制器,该产品并不开源,但是提供了SDK供用户访问及硬件硬件资源。ESP8266 SDK包括两种类型:支持OS的SDK及裸机SDK。

非OS SDK不基于操作系统。它支持IOT_Demo和AT命令的编译。非OS SDK使用计时器和回调作为执行各种功能的主要方式,例如由特定条件触发的嵌套事件和函数。非OS SDK使用espconn网络接口; 用户需要根据espconn接口的使用规则开发软件。

FreeRTOS SDK基于FreeRTOS,一个多任务操作系统。您可以使用标准接口来实现资源管理,回收操作,执行延迟,任务间消息传递和同步以及其他面向任务的流程设计方法。 RTOS SDK中的网络操作接口是标准的lwIP API,RTOS SDK提供了一个启用BSD Socket API接口的包,用户可以直接使用socket API开发软件应用程序; 并使用套接字API将ESP8266的其他应用程序移植到其他平台,有效降低了学习成本。

除此之外,官方还提供了其它一些配套的工具,如烧写程序可以用来将编译好的二进制代码写入到开发板;编译程序将用户编写的代码编译成二进制代码等。

https://cdn.china-scratch.com/timg/180915/2322011609-3.jpg

这里还可以查看设备的MAC地址,可以看到包括两个MAC,一个是AP地址,另一个是STA地址。

使用SDK方式来开发,步骤略复杂。官方还提供了虚拟机,直接下载官方的虚拟机(Linux)就可以直接使用官方的SDK来进行程序开发工作了,好在万能的Arduino也提供了esp8266支持,使用起来也简单得多!

接下来的工作都是在Arduino中完成,实际上是使用Visual Studio 2017结合vMicro来完成的。

第一个程序是Hello, world,嗯,点灯!

第一步添加ESP8266硬件支持,在Boards Manager管理器里,安装esp8266支持

https://cdn.china-scratch.com/timg/180915/232201D96-4.jpg

接下来在Arduino中选择硬件类型,不过不幸的是,支持列表里找不到ESP-LAUNCHER的型号,很奇怪!既然找不到,就直接选择Generic ESP8266 Module

https://cdn.china-scratch.com/timg/180915/23220130X-5.jpg

然后就是配置ESP8266的一些具体参数,如SPI存储的大小,时钟频率等信息

https://cdn.china-scratch.com/timg/180915/2322016213-6.jpg

这些设置要参考实际的模块型号来选择,这里有趣的一个设置是Builtin Led: 2这个选项!我们都知道Arduino的LED灯是连接在13号引脚,但是在其它平台,这就不一定了,像在ESP-LAUNCHER开发板上,就没有默认的LED,怎么办,设置这里就可以了

https://cdn.china-scratch.com/timg/180915/2322022332-7.jpg

参考官方原理图,这里可以使用GPIO12来做试验。

接下来就可以使用ARDUINO的blink程序来测试了,代码太常见,不上了!

说下插曲,按官方的文档,直接将GPIO0开关拔下来,就可以下载代码了,但是实际使用的时候没用,非得先关闭电源开关,然后再上电,刷刷刷的就开刷了!

第二个程序要来体验一下WIFI连接及测试情况,这个也简单,参考官方代码并精简一下,得到如下代码

// Visual Micro is in vMicro>General>Tutorial Mode
// 
/*
    Name:       wificlient.ino
    Created:   2018/8/17 17:43:41
    Author:     DESKTOPhnlsm
*/
// Define User Types below here or use a .h file
//
#include 
const char* ssid = "xxxx";
const char* password = "xxxx";
// Define Function Prototypes that use User Types below here or use a .h file
//
// Define Functions below here or use other .ino or cpp files
//
// The setup() function runs once each time the micro-controller starts
void setup()
{
     Serial.begin(115200);
     delay(10);
     Serial.println("Connecting to Local WiFi.");
     WiFi.mode(WIFI_STA);
     WiFi.begin(ssid, password);
     while (WiFi.status() != WL_CONNECTED) {
         delay(500);
         Serial.print(".");
     }
     Serial.println("");
     Serial.println("WiFi connected");
     Serial.println("IP address: ");
     Serial.println(WiFi.localIP());
}
// Add the main program code into the continuous loop() function
void loop()
{
}

默认使用DHCP方式从路由器获取IP地址,然后使用串口打印出来,loop()里什么也不干!

得到串口输出如下

https://cdn.china-scratch.com/timg/180915/232202E44-8.jpg

成功获取到IP地址,至此,已成功加入网络世界!

然而,这样并没有什么用!物联的魅力在于远程信息的获取及控制,所以咱得再来点个灯,不同的是,这一次点灯是通过网络来进行控制的。

网络通信的方式很多,低级一点的直接socket来进行,高级的则可以使用http来实现,不过这里咱们要来体验一把mqtt方式通信。

mqtt是专门用于物联网通信的协议,底层基于TCP/IP协议。mqtt通信效率高,可靠并且非常容易实现。Arduino平台有许多现成可用的,如PubSubClinet就是Arduino平台上使用频率非常高的一个组件。

关于mqtt,有兴趣的可以网上找找资料,非常好的一款物联网通信协议,这里不多介绍,上一段最精简的代码,实现网络点灯。

// Visual Micro is in vMicro>General>Tutorial Mode
// 
/*
Name:       wificlient.ino
Created:  2018/8/17 17:43:41
Author:     DESKTOPhnlsm
*/
// Define User Types below here or use a .h file
//
#include
#include
const char* ssid = "xxxx";
const char* password = "xxxx";
const char* mqtt_server = "192.168.88.22";
#define LED 12
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
// Define Function Prototypes that use User Types below here or use a .h file
//
// Define Functions below here or use other .ino or cpp files
//
// The setup() function runs once each time the micro-controller starts
void setup()
{
     pinMode(LED, OUTPUT);
     Serial.begin(115200);
     delay(10);
     //setup wifi client
     Serial.println("Connecting to Local WiFi.");
     WiFi.mode(WIFI_STA);
     WiFi.begin(ssid, password);
     while (WiFi.status() != WL_CONNECTED) {
         delay(500);
         Serial.print(".");
     }
     Serial.println("");
     Serial.println("WiFi connected");
     Serial.println("IP address: ");
     Serial.println(WiFi.localIP());
     //setup mqtt client
     mqttClient.setServer(mqtt_server, 1883);
     mqttClient.setCallback(callback);
}
void callback(char* topic, byte* payload, unsigned int length) {
     //for test only
     char temp[40];
     int i;
     for (i = 0; i < length; i++) {
         temp[i] = payload[i];
     }
     temp[i] = '';
     Serial.println(topic);
     Serial.println(temp);
     //program logic goes here
     if (strcmp(topic, "led") == 0) {
         if ((char)payload[0] == '1') {
              digitalWrite(LED, LOW);
         }
         else {
              digitalWrite(LED, HIGH);
         }
     }
}
void reconnect() {
     while (!mqttClient.connected()) {
         if (!mqttClient.connect("ESP8266Client")) {
              delay(5000);
         }
         mqttClient.subscribe("led");
     }
}
// Add the main program code into the continuous loop() function
void loop()
{
     if (!mqttClient.connected()) {
         reconnect();
     }
     mqttClient.loop();
}

mqtt需要一个服务器,服务器的作用是检查用户发布的消息,并将之发布到订阅了相关主题(topic)的用户,在程序的开头,除了指定WIFI配置相关参数,还指定了mqtt服务器,mqtt服务器默认的port号为1883。

reconnect()函数检查是否连接正常,如果正常,向用服务器订阅topic为led的消息,如果其它结点发布消息到该主题,esp8266就会接收到相关的消息。

代码的核心在callback函数里,当接收到一个订阅消息,先检查其主题是否为led,如果是,检查消息负载是0还是1,如果接收到的消息是0,灭灯,否则点亮灯!就这么简单,程序做了精简,只是为了演示功能,并没有考虑容错处理。

现在可以在另一个结点上发布消息来控制LED灯的亮灭。这里使用mosquitto来测试,如下

https://cdn.china-scratch.com/timg/180915/23220222A-9.jpg

mosquitto_pub命令的-t参数指定topic,-m参数指定消息,执行命令后在ESP8266的串口可以看到相关的内容输出

https://cdn.china-scratch.com/timg/180915/2322024338-10.jpg

当然,GPIO12对应的LED灯也会相应的点亮或熄灭!

程序中也可以将采集到的传感器如温度、湿度等信息publish出去,供其它设备读取,从而实现ESP-LAUNCHER真正的物联功能!

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com