既然是中国十大最有影响力的芯片之一 一定要有个好开发板
要评选中国影响力十大芯片,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等各种丰富的平台。
开发板由两大块组成。一个ESP_TEST Board,上面包含ESP8266EX及4MB的SPI FLASH存储器,另外该子板还提供了一个天线接口,套件还提供了天线;另外一块是底板,提供了丰富的板载外设及接口。
装上天线的效果图,看起来高大上,是真高!
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的其他应用程序移植到其他平台,有效降低了学习成本。
除此之外,官方还提供了其它一些配套的工具,如烧写程序可以用来将编译好的二进制代码写入到开发板;编译程序将用户编写的代码编译成二进制代码等。
这里还可以查看设备的MAC地址,可以看到包括两个MAC,一个是AP地址,另一个是STA地址。
使用SDK方式来开发,步骤略复杂。官方还提供了虚拟机,直接下载官方的虚拟机(Linux)就可以直接使用官方的SDK来进行程序开发工作了,好在万能的Arduino也提供了esp8266支持,使用起来也简单得多!
接下来的工作都是在Arduino中完成,实际上是使用Visual Studio 2017结合vMicro来完成的。
第一个程序是Hello, world,嗯,点灯!
第一步添加ESP8266硬件支持,在Boards Manager管理器里,安装esp8266支持
接下来在Arduino中选择硬件类型,不过不幸的是,支持列表里找不到ESP-LAUNCHER的型号,很奇怪!既然找不到,就直接选择Generic ESP8266 Module
然后就是配置ESP8266的一些具体参数,如SPI存储的大小,时钟频率等信息
这些设置要参考实际的模块型号来选择,这里有趣的一个设置是Builtin Led: 2这个选项!我们都知道Arduino的LED灯是连接在13号引脚,但是在其它平台,这就不一定了,像在ESP-LAUNCHER开发板上,就没有默认的LED,怎么办,设置这里就可以了
参考官方原理图,这里可以使用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()里什么也不干!
得到串口输出如下
成功获取到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来测试,如下
mosquitto_pub命令的-t参数指定topic,-m参数指定消息,执行命令后在ESP8266的串口可以看到相关的内容输出
当然,GPIO12对应的LED灯也会相应的点亮或熄灭!
程序中也可以将采集到的传感器如温度、湿度等信息publish出去,供其它设备读取,从而实现ESP-LAUNCHER真正的物联功能!
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com