一个项目当中有两个平台,一个多么有趣的下午...
正如我在之前博客中所提及的那样,我在设计ESP8266-03开发板时非常乐观,甚至在投入批量生产前都没有生产原型开发板。今天我收到了几个邮寄过来的开发板,而且网上关于这个模组的信息比比皆是,接下来我具体描述一下开发的第一步...
配置FT230X
开发板上的USB转UART的转换器有四个CBUS管脚,这四个管脚可配置为GPIOs或者status管脚。其中的三个管脚(CBUS0/1/3)可以被连接到绿色LEDs,因此如果你想改变默认配置,可以下载FT_Prog工具(点击下载),编程新的设置,断开/重新连接开发板。
默认固件
以下深受一篇好文的启发而作。
利用微型USB将开发板连接到你的电脑,开发一个你最喜欢的终端程序(这是我用的程序),波特率设置为9600,选择“发送”选项卡,勾选+CR & +LF框,进入不同的指令,点击“发送ASCII”。
检测通信设备
>AT
OK
获取固件版本:
>AT+GMR
0018000902-AI03
将Wifi模式设置为AP+STA,并列出附近的接入点
(APs):
>AT+CWMODE=3
OK
>AT+CWLAP
+CWLAP:(3,"mysuperwifi",-76,"90:xx:xx:xx:xx:xx",1)
+CWLAP:(4,"zak-52122",-79,"a4:xx:xx:xx:xx:xx",3)
+CWLAP:(3,"ZyXEL_133A",-80,"cc:xx:xx:xx:xx:xx",2)
+CWLAP:(3,"somewifi",-81,"e0:xx:xx:xx:xx:xx",4)
+CWLAP:(0,"HP-Print-0C-Photosmart",-82,"6c:xx:xx:xx:xx:xx",4)
+CWLAP:(4,"anotherwifi",-83,"fc:xx:xx:xx:xx:xx",1)
正如你所看到的那样,你会发现接入点名称和MAC地址、RSSIs。第一个数字是加密模式的(0:open, 1:wep, 2:wpa_psk, 3:wpa2_psk, 4:wpa_wpa2_psk)。
连接到你的接入点:
>AT+CWJAP="mysuperwifi","mypassword"
OK
检测一下是否已经连接:
下载运行TCP服务器/终端(由tomeko创建的Bcbserver),将数据发送到你的主计算机上:
> AT+CIPMUX=0
OK
>AT+CIPSTART="TCP","your computer IP",7778
OK
已连接
+IPD,24: 已建立连接
OK
现在已建立TCP连接,要具体列出发送几个字节数位(例如这里是4个)
>AT+CIPSEND=4
> (在此输入4个字节)
发送OK
你应该可以看到显示在BCBcostam的文本。
最后,终止TCP连接:
>AT+CIPCLOSE
OK
取消链接
建立Espressif工具链
直到现在我们一直把ESP8266当作外部设备使用,这意味着我们需要利用电脑/手机/微控制器来操作它。然而,自从ESP8266厂商发布芯片SDK 以来,我们可以用自己的代码对芯片进行编码,这样它就可以当作独立设备运作起来。为了实现这一点,首先我们需要建立一个Espressif工具链。
这恐怕要花一点时间...所以可以有时间再做!我非常推荐要根据此处的指南进行操作。这是针对 linux的指南,针对Windows的指南,可以点击此处。
请注意,在Linux 指南中,我在写入时必须要运行 "mv esp_iot_sdk_v0.9.3/* ESP8266_SDK",而不是"mv esp_iot_sdk_v0.9.3 ESP8266_SDK"。
创建自己的程序
我们举个例子来讲。我花了4-5个小时完成这项有趣的设置:
un sketch on the ESP8266-03 development board
<div class="player-unavailable"><h1 class="message">出现错误。</h1><div class="submessage"><a href="http://www.youtube.com/watch?v=cw2yjEPAaz8">请尝试在 www.youtube.com 上观看此视频</a>,或者在浏览器中启用 JavaScript(如果已在浏览器中停用)。</div></div>
在ESP8266-03开发板上素描
多普勒站
首先,我们需要以内部拉高使能方式将ESP8266管脚设置为输入模式,这样我们就可以只在IO端口和平台之间连接按钮了。
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13); // 设置GPIO13函数
gpio_output_set(0, 0, 0, BIT13); // 设置GPIO13为输入模式
PIN_PULLDWN_DIS(PERIPHS_IO_MUX_MTCK_U); // 关闭拉低使能
PIN_PULLUP_EN(PERIPHS_IO_MUX_MTCK_U); // 使能拉高
由于我们不能看到ESP8266芯片的英文介绍,但又想利用芯片所含有的所有功能,所以我们不得不使用SDK。可以在你喜欢的搜索网站浏览一下"ESP8266EX SDK Programming Guide" 。
在芯片中管脚可由几个控制器驱动,第一行说明我们想在GPIO13上利用GPIO控制器。其余三行...仔细读一下评论。这种使用按钮的方式非常简单而且节能,因为你不需要使用中断的方式来读取数据,只需检测它的状态即可。
ETS_GPIO_INTR_DISABLE(); // 禁用GPIO中断
ETS_GPIO_INTR_ATTACH(doppler_int_handler, 12); // GPIO12中断处理程序
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12); // 设置GPIO12函数
gpio_output_set(0, 0, 0, GPIO_ID_PIN(12)); // 设置GPIO12为输入方式
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(12)); // 清除GPIO状态
gpio_pin_intr_state_set(GPIO_ID_PIN(12), 3); // GPIO12所有边沿中断
ETS_GPIO_INTR_ENABLE(); //GPIO使能中断
多普勒传感器有一个输出频率,输出电压为5V(不要忘记还有一个分压器),这意味着传感器会根据与物体速度成正比的频率,每秒几次切换管脚。在这个简单的固件中,你可以下载以下...我们采用了一个非常简单的方法,即:HB-100 FOUT管脚每切换一次,ESP8266就会产生一次中断,同时就会增加一个计数器。我们每0.5s阅读一次计数器的数值,并将其传送给电脑和其他ESP8266-03模组。
以上有趣的部分是第二行,其中将doppler_int_handler注册为GPIO12中断函数,每调用一次函数,就会增加一个计数器。
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2); // 设置GPIO2函数
gpio_output_set(0, BIT2, BIT2, 0); // 将GPIO2 设置为低输出模式
这两行将GPIO2设置为输出模式来驱动红色LED。由于ESP8266-03开发板已配置限流电阻,所以你可以直接连接LED。正如视频中所看到的那样,红色LED每0.5s闪亮一次。
os_timer_disarm(&led_timer); // 停止led定时器
os_timer_setfn(&led_timer, (os_timer_func_t *)led_timerfunc, NULL); // 设置led定时器
os_timer_arm(&led_timer, 500, 1); // 启动led定时器,每0.5s启动一次
ESP8266‘操作系统’允许你在预定的频率上启动指定的定时器(函数)。我们在此指定应该每0.5s调用一次led_timerfunc函数。
char ssid32 = "mywifissid"; // Wifi SSID
char password64 = "mywifipassord"; // Wifi Password
struct station_config stationConf; // Station conf struct
wifi_set_opmode(0x1); // Set station mode
os_memcpy(&stationConf.ssid, ssid, 32); // Set settings
os_memcpy(&stationConf.password, password, 64); // Set settings
wifi_station_set_config(&stationConf); // Set wifi conf
//wifi_status_led_install(13, PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13); // Wifi LED status
将开发板连接至你家里的Wifi就是如此简单!最后一行说明你可以利用一个指定的LED来显示Wifi的状态。Wifi在试图连接或者连接异常时LED会闪烁,Wifi连接状态下LED不亮。
void ICACHE_FLASH_ATTR network_check_ip(void)
{
struct ip_info ipconfig;
os_timer_disarm(&network_timer); // Disarm timer
wifi_get_ip_info(STATION_IF, &ipconfig); // Get Wifi info
if (wifi_station_get_connect_status() == STATION_GOT_IP && ipconfig.ip.addr != 0)
{
network_start(); // Everything in order
}
else
{
os_printf("Waiting for IP...\n\r");
os_timer_setfn(&network_timer, (os_timer_func_t *)network_check_ip, NULL);
os_timer_arm(&network_timer, 1000, 0);
}
}
平台从你家的DHCP服务器(通常是你的路由器)获取IP地址之前, 这个1s定时器一直处于调用状态。平台获取IP地址之后,可开始与你的电脑以及其他设备进行连接。
global_tcp_connect.type=ESPCONN_TCP; // We want to make a TCP connection
global_tcp_connect.state=ESPCONN_NONE; // Set default state to none
global_tcp_connect.proto.tcp=&global_tcp; // Give a pointer to our TCP var
global_tcp_connect.proto.tcp->local_port=espconn_port(); // Ask a free local port to the API
global_tcp_connect.proto.tcp->remote_port=7778; // Set remote port (bcbcostam)
global_tcp_connect.proto.tcp->remote_ip0=ip1; // Your computer IP
global_tcp_connect.proto.tcp->remote_ip1=ip2; // Your computer IP
global_tcp_connect.proto.tcp->remote_ip2=ip3; // Your computer IP
global_tcp_connect.proto.tcp->remote_ip3=ip4; // Your computer IP
espconn_regist_connectcb(&global_tcp_connect, tcpNetworkConnectedCb); // Register connect callback
espconn_regist_disconcb(&global_tcp_connect, tcpNetworkDisconCb); // Register disconnect callback
espconn_regist_reconcb(&global_tcp_connect, tcpNetworkReconCb); // Register reconnection function
espconn_connect(&global_tcp_connect); // Start connection
建立一个TCP连接并没有那么复杂。建立连接、取消连接或重新连接时可以利用指定的IP/接口调用函数。
global_udp_connect.type=ESPCONN_UDP; // We want to make a UDP connection
global_udp_connect.state=ESPCONN_NONE; // Set default state to none
global_udp_connect.proto.udp=&global_udp; // Give a pointer to our UDP var
global_udp_connect.proto.udp->local_port=2222; // Set local port
global_udp_connect.proto.udp->remote_port=2222; // Set remote port
global_udp_connect.proto.udp->remote_ip0=ip1; // The other ESP8266 IP
global_udp_connect.proto.udp->remote_ip1=ip2; // The other ESP8266 IP
global_udp_connect.proto.udp->remote_ip2=ip3; // The other ESP8266 IP
global_udp_connect.proto.udp->remote_ip3=ip4; // The other ESP8266 IP
if(espconn_create(&global_udp_connect) == 0) // Correctly setup
{
os_printf("UDP connection set\n\r");
udp_conn_ok = TRUE;
}
UDP连接要简单得多,因为在TCP等传送数据那一块不需要添加任何逻辑操作。ESP8266只是把字节发到一个指定的IP地址上。
以上内容已经包含所有基本的操作。接下来我会总结一下固件的功能,以便于你查看源代码:
-设置输入/输出模式
-注册一个0.5s的定时器,用于切换红色LED,读取多普勒频率,并将这一频率发送至你的电脑和ESP8266。
-注册一个1s的定时器来检测ESP8266的连接状态。获取IP地址之后,使你的电脑建立TCP连接,ESP8266建立UDP连接。
指示平台
这里的操作更为简单:
- 连接至你的Wifi
- 为绿色/橙黄色/红色LED将3个管脚设置为输出模式
- 建立UDP连接
- 解析传入的数据,了解LED的开关状态
若想下载资料可以点击doppler sensor code esp8266 client code,想获取更多示例可以点击 this github repository,
可以在freenode上查看有关esp8266的所有内容!
谢谢zarya的帮助和编码!
版权声明:
原文来源:www.limpkinw.com/
原文标题:First Steps with the ESP8266-03 Development Board
原文地址:http://www.limpkin.fr/index.php?post/2014/12/07/First-Steps-with-the-ESP8266-03-Development-Board