最近在研究如何搭建一个 WIFI HTTP Server ,本打算使用ESP8266,但是购买了板子才发现资料比较少,联系卖家也没有结果。后来只得入手了一块 CC3000 的 WIFI 板子。这个芯片是 Arduino IDE 原生自带的,所以资料方面不是问题。入手的是 DFRobot 出品的 WiDo,主控芯片是 32U4,这意味着有足够的串口可供Debug之类使用, 更具体的说:主控芯片用 SPI 和 WIFI芯片CC3000打交道,然后多出来一个串口,USB上还有一个串口。
根据【参考1】编写一个简单的程序,控制板子上 Pin 13 上面的LED亮灭。【参考1】的程序会向浏览器端发送一个 HTTP 的页面,上面有2个按钮,能够通过按下按钮控制亮灭。经过我的测试发现浏览器打卡会很慢,很多时候会卡死,并且打开之后页面是错乱的。我猜测原因可能是HTTP代码并不标准,有兼容性问题(我用的Chrome),另外用浏览器访问有可能会负载过高,比如,我偶然发现浏览器打开网站之后还有 GET favorite.ico 的动作。因此,我对程序做了一下简单的修改。修改之后HTTP页面只是简单显示一行字符。使用 http://ip/open 打开 LED,http://ip/close关闭LED。
1.直接访问 http://192.168.0.103 可以看到下面的信息
具体的控制可以用 http://192.168.1.103/open 点亮,http://192.168.1.103/close 熄灭。
2.此外,还可以用 curl 工具在控制台进行操作,和方法1 相比,这样的更简单可靠,避免浏览器“暗箱操作”
#include <Adafruit_CC3000.h> #include <SPI.h> #include "utility/debug.h" #include "utility/socket.h" // These are the interrupt and control pins #define ADAFRUIT_CC3000_IRQ 7 // MUST be an interrupt pin! // These can be any two pins #define ADAFRUIT_CC3000_VBAT 5 #define ADAFRUIT_CC3000_CS 10 // Use hardware SPI for the remaining pins // On an UNO, SCK = 13, MISO = 12, and MOSI = 11 Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT, SPI_CLOCK_DIVIDER); // you can change this clock speed #define WLAN_SSID "ChinaNet-73" //这里填写你的 WIFI 名称 #define WLAN_PASS "adminp1988" //这里填写你的 WIFI 密码 // Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2 #define WLAN_SECURITY WLAN_SEC_WPA2 #define LISTEN_PORT 80 // What TCP port to listen on for connections. Adafruit_CC3000_Server webServer(LISTEN_PORT); boolean led_state; // void setup(void) { //简单起见,我们只用板载的 13pin 上的 LED 演示 pinMode (13, OUTPUT); //默认是灭的 digitalWrite (13, LOW); //使用串口输出Debug信息 Serial.begin(115200); Serial.println(F("Hello, CC3000!\n")); //while (!Serial); //Serial.println ("Input any key to start:"); //while (!Serial.available ()); //输出当前可用内存 Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC); /* Initialise the module */ Serial.println(F("\nInitializing...")); if (!cc3000.begin()) { Serial.println(F("Couldn't begin()! Check your wiring?")); while(1); } Serial.print(F("\nAttempting to connect to ")); Serial.println(WLAN_SSID); if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) { Serial.println(F("Failed!")); while(1); } Serial.println(F("Connected!")); //使用 DHCP 分配的IP Serial.println(F("Request DHCP")); while (!cc3000.checkDHCP()) { delay(100); // ToDo: Insert a DHCP timeout! } //显示当前的IP信息 /* Display the IP address DNS, Gateway, etc. */ while (! displayConnectionDetails()) { delay(1000); } // Start listening for connections webServer.begin(); Serial.println(F("Listening for connections...")); } // void loop(void) { // Try to get a client which is connected. Adafruit_CC3000_ClientRef client = webServer.available(); if (client) { //处理输入的 GET 信息,对于 GET 方法来说,Url中既有传递的信息 processInput (client); //对发送 HTTP 请求的浏览器发送HTTP代码 sendWebPage (client); } client.close(); } //分析收到的 GET 方法的参数 void processInput (Adafruit_CC3000_ClientRef client) { char databuffer[45]; //安全起见,保证截断 databuffer[44]=’\0’; while (client.available ()) { client.read (databuffer, 40); //下面这个代码是查找PC端发送的数据中的换行,以此作为字符串的结尾 char* sub = strchr (databuffer, '\r'); if (sub > 0) *sub = '\0'; Serial.println (databuffer); //下面是解析 GET 方法提供的参数 //如果是 open 命令,那么点亮 LED if (strstr (databuffer, "open") != 0) { Serial.println (F("clicked open")); digitalWrite (13, HIGH); led_state = true; } //如果是 close 命令,那么熄灭 LED else if (strstr (databuffer, "close") != 0) { Serial.println (F("clicked close")); digitalWrite (13, LOW); led_state = false; } break; } } void sendWebPage (Adafruit_CC3000_ClientRef client) { //为了节省空间,这里只发送简单的提示字符 webServer.write ("Waiting for command"); delay (20); client.close(); } //输出当前WIFI 设备通过 DHCP 取得的基本信息 bool displayConnectionDetails(void) { uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv; if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv)) { Serial.println(F("Unable to retrieve the IP Address!\r\n")); return false; } else { Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress); Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask); Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway); Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv); Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv); Serial.println(); return true; } }
最后,对于初学者来说个人强烈不推荐使用“深圳四博智联科技有限公司开发的一款基于乐鑫ESP8266的各种板子“,原因是:资料很少,基本上没有Support,初学者使用的话很可能走很多弯路。
对于WiDo 来说,因为使用的是 CC3000,这也是 Arduino 官方用的 Wifi 使用的芯片,因此资料很全。不得不承认一点,国内Arduino方面的硬件价格便宜,但是软件还是很弱,特别是基础性的研究。如果你的项目比较急,或者对于稳定性要求高,首选官方支持的设备。
参考:
1. 通过网页按钮控制台灯,wido做服务器http://www.dfrobot.com.cn/community/forum.php?mod=viewthread&tid=10001&highlight=wido
用安信可的ESP8266 应该会好点 。
不会写C , 我还在用 micropython 的固件去玩ESP8266 。
中断都中不到好无奈。
最开始我选择的就是 8266 价格便宜......问题是资料不多,另外,估计需要特别的固件才可以支持。最后还是放弃了,没搞定。