通过网页按钮控制台灯,wido做服务器

2014-11-144.7万
AI 快速预览详细 收起
本项目通过WiDo WiFi物联网主控器和普通台灯,实现了远程网络控制台灯的开关。硬件清单包括WiDo WiFi物联网主控器和一个普通的台灯。最终效果是用户可以通过浏览器输入台灯的IP地址,打开控制页面进行开关操作。难度等级适中,适合智能家居爱好者和初学者。


本帖用到之前做的插座:https://mc.dfrobot.com.cn/thread-2631-1-1.html

结合目前很火的WiDo WiFi物联网主控器https://www.dfrobot.com.cn/goods-997.html

和一个普通的台灯,即可实现远程网络控制台灯的开关,不需要APP,不要命令,只需要知道“台灯”的IP地址,用浏览器打开,就可以出现控制页面,目前页面上只有两个按钮,open和close。


  1. /*
  2. * Copyright (C) 2014 DFRobot                                                  
  3. *                                                                             
  4. */
  5. /*
  6. *        Author:                                lisper <lisper.li@dfrobot.com>
  7. *        Date:                                2014-08-21
  8. *        official website:                http://www.dfrobot.com
  9. *        Description:                        control led by web button
  10. */
  11. #include <Adafruit_CC3000.h>
  12. #include <SPI.h>
  13. #include "utility/debug.h"
  14. #include "utility/socket.h"
  15. // These are the interrupt and control pins
  16. #define ADAFRUIT_CC3000_IRQ   7  // MUST be an interrupt pin!
  17. // These can be any two pins
  18. #define ADAFRUIT_CC3000_VBAT  5
  19. #define ADAFRUIT_CC3000_CS    10
  20. // Use hardware SPI for the remaining pins
  21. // On an UNO, SCK = 13, MISO = 12, and MOSI = 11
  22. Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
  23. SPI_CLOCK_DIVIDER); // you can change this clock speed
  24. #define WLAN_SSID       "yourssid"           // cannot be longer than 32 characters!
  25. #define WLAN_PASS       "password"
  26. // Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
  27. #define WLAN_SECURITY   WLAN_SEC_WPA2
  28. #define LISTEN_PORT           80   // What TCP port to listen on for connections.
  29. Adafruit_CC3000_Server webServer(LISTEN_PORT);
  30. boolean led_state;
  31. //
  32. void setup(void) {
  33.         pinMode (11, OUTPUT);
  34.         pinMode (12, OUTPUT);
  35.         pinMode (13, OUTPUT);
  36.         //pin normal state
  37.         digitalWrite (11, LOW);  
  38.         digitalWrite (12, HIGH);
  39.         digitalWrite (13, LOW);
  40.         Serial.begin(115200);
  41.         Serial.println(F("Hello, CC3000!\n"));
  42.         //while (!Serial);
  43.         //Serial.println ("Input any key to start:");
  44.         //while (!Serial.available ());
  45.         Serial.print("Free RAM: ");
  46.         Serial.println(getFreeRam(), DEC);
  47.         /* Initialise the module */
  48.         Serial.println(F("\nInitializing..."));
  49.         if (!cc3000.begin()) {
  50.                 Serial.println(F("Couldn't begin()! Check your wiring?"));
  51.                 while(1);
  52.         }
  53.         Serial.print(F("\nAttempting to connect to "));
  54.         Serial.println(WLAN_SSID);
  55.         if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
  56.                 Serial.println(F("Failed!"));
  57.                 while(1);
  58.         }
  59.         Serial.println(F("Connected!"));
  60.         Serial.println(F("Request DHCP"));
  61.         while (!cc3000.checkDHCP()) {
  62.                 delay(100); // ToDo: Insert a DHCP timeout!
  63.         }  
  64.         /* Display the IP address DNS, Gateway, etc. */
  65.         while (! displayConnectionDetails()) {
  66.                 delay(1000);
  67.         }
  68.         // Start listening for connections
  69.         webServer.begin();
  70.         Serial.println(F("Listening for connections..."));
  71. }
  72. //
  73. void loop(void) {
  74.         // Try to get a client which is connected.
  75.         Adafruit_CC3000_ClientRef client = webServer.available();
  76.         if (client) {
  77.                 processInput (client);
  78.                 sendWebPage (client);
  79.         }
  80.         client.close();
  81. }
  82. //
  83. void processInput (Adafruit_CC3000_ClientRef client) {
  84.         char databuffer[45];
  85.         while (client.available ()) {
  86.                 client.read (databuffer, 40);
  87.                 char* sub = strchr (databuffer, '\r');
  88.                 if (sub > 0)
  89.                         *sub = '\0';
  90.                 Serial.println (databuffer);
  91.                 sub = strstr (databuffer, "control");
  92.                 if (!sub) {
  93.                         //Serial.println ("no control");                        
  94.                         break;
  95.                 }
  96.                 sub = strstr (sub, "led");
  97.                 if (!sub) {
  98.                         //Serial.println ("no led");                        
  99.                         break;
  100.                 }
  101.                 sub += 4;
  102.                 if (strncmp (sub, "open", 4) == 0) {
  103.                         Serial.println ("clicked open");
  104.                         digitalWrite (11, HIGH);  
  105.                         digitalWrite (12, LOW);  
  106.                         digitalWrite (13, HIGH);
  107.                         led_state = true;
  108.                 }
  109.                 else if (strncmp (sub, "close", 5) == 0) {
  110.                         Serial.println ("clicked close");
  111.                         digitalWrite (11, LOW);  
  112.                         digitalWrite (12, HIGH);
  113.                         digitalWrite (13, LOW);
  114.                         led_state = false;
  115.                 }
  116.                 break;
  117.         }
  118. }
  119. void sendWebPage (Adafruit_CC3000_ClientRef client) {
  120.         webServer.write ("<!DOCTYPE html>");
  121.         webServer.write ("<html>");
  122.         webServer.write ("<body  style="font-size:50px">");
  123.         webServer.write ("<form action="control" method="get">");
  124.         webServer.write ("<button name="led" style="height:200px;width:400px;font-size:50px"");
  125.         webServer.write ("type="submit" value="open">Open</button>");
  126.         webServer.write ("<br><br>");
  127.         webServer.write ("<button name="led" style="height:200px;width:400px;font-size:50px"");
  128.         webServer.write ("type="submit" value="close">Close</button>");
  129.         webServer.write ("</form>");
  130.         webServer.write ("<br><br><p>Pin11 status: ");
  131.         webServer.write (led_state ? "HIGH" : "LOW");        
  132.         webServer.write ("<br><p>Pin12 status: ");
  133.         webServer.write (led_state ? "LOW" : "HIGH");               
  134.         webServer.write ("</p></body>");
  135.         webServer.write ("</html>");
  136.         delay (20);
  137.         client.close();
  138. }
  139. //
  140. bool displayConnectionDetails(void) {
  141.         uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
  142.         if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv)) {
  143.                 Serial.println(F("Unable to retrieve the IP Address!\r\n"));
  144.                 return false;
  145.         }
  146.         else {
  147.                 Serial.print(F("\nIP Addr: "));
  148.                 cc3000.printIPdotsRev(ipAddress);
  149.                 Serial.print(F("\nNetmask: "));
  150.                 cc3000.printIPdotsRev(netmask);
  151.                 Serial.print(F("\nGateway: "));
  152.                 cc3000.printIPdotsRev(gateway);
  153.                 Serial.print(F("\nDHCPsrv: "));
  154.                 cc3000.printIPdotsRev(dhcpserv);
  155.                 Serial.print(F("\nDNSserv: "));
  156.                 cc3000.printIPdotsRev(dnsserv);
  157.                 Serial.println();
  158.                 return true;
  159.         }
  160. }
复制代码

该例由于使用的是动态IP,第一次运行要先通过串口查看wido的IP,然后在浏览器地址输入框中输入其IP,就可显示控制页面

IMG_20141114_111714.jpg (115.9 KB, 下载次数: 15309)

WiDo WiFi物联网主控器 · 远程网络控制台灯_image_3.webp

Screenshot_2014-11-14-11-38-35.png (50.47 KB, 下载次数: 15225)

WiDo WiFi物联网主控器 · 远程网络控制台灯_image_6.webp

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(16)
老刘
老刘
我按照你的代码上传上去了,打开页面的时候,第一次能打开,但只要点击按钮或者再次刷新。就卡住不动了。请教解决办法
北京麦克
北京麦克
我用了,很好,可以控制灯亮、灯灭。D11, D12 可以作为输出,控制灯。只不过要问楼主:我只实现了网页或者手机网页控制灯。怎样实现远程控制呢?
lisper
lisper
作者
回复北京麦克
远程控制需要有服务器,比如物联网服务器,本论坛就有这个功能
Joyce
Joyce
网页界面呢,有网页代码就好了
lisper
lisper
作者
回复Joyce
。。。。。。上面有。。。。。
Joyce
Joyce回复lisper
图呢,图呢
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
tyjjr
tyjjr
不太明白但是好像很厉害的样子
lisper
lisper
作者
回复tyjjr
http协议
Osin
Osin
看了和没看一样,完全不懂啊
lisper
lisper
作者
回复Osin
没区别对待啊,你能看懂就行
Osin
Osin回复lisper
你这是区别对待啊,不应该哦
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
Youyou
Youyou
大神,你的MK2烧写器能炫一下嘛?我还在用MK20烧写器呢。
lisper
lisper
作者
回复Youyou
MK20烧写器?有这货吗?
lisper
lisper
作者
有,但很少发生
Grey
Grey
有掉线的现象吗?
Grey
Grey
大神好厉害!
lisper
lisper
作者
回复Grey
为什么?
Jane
Jane
楼主这是来炫代码的吗~除了代码还是代码
lisper
lisper
作者
回复Jane
不知道怎么接继电器的没必要看这个帖子,不知道怎么接VCC,GND,数字口的没必要看这个帖子
Jane
Jane回复lisper
好吧 怎么连接的呢?貌似光有个代码也不够啊。此帖太深奥,我们普通人看不懂啊。劳驾楼主能否写再详细点啊~中间省略10000字的习惯不好啊~
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
R2D2
R2D2
图啊,连线图呢?
lisper
lisper
作者
回复R2D2
随后补充
冰渕
冰渕
貌似wido最近很火嘛~~
lisper
lisper
作者
回复冰渕
为什么要买?
冰渕
冰渕回复lisper
哦哦,买起来撒~~
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
ejiyuan1
ejiyuan1
使用wido写了不到200行的代码,内存空间就快用完了,有没有解决的办法
lisper
lisper
作者
回复Youyou

高级货,没用过啊
Youyou
Youyou回复lisper
话说,用USBasp烧写器也可以的吧,价格便宜啊
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
lisper
lisper
作者
串电阻还是并电阻?“当使用2560和wido时不用并电阻就可以读取转速吗?”为什么这么问?串电阻是因为Uno的io电压是5V,驱动器是3.3V,因为串联分压,所以Uno需要串电阻给io口降压,uno,mega2560,wido的io口都是5V,所以。。。
ejiyuan1
ejiyuan1
把连接服务器的程序放在loop里是不是更好些,要不然断线的怎么办
lisper
lisper
作者
回复hdc
可以的~
hdc
hdc回复lisper
能不能固定IP的? 然后还可以加上定时功能?
共4条回复,已加载2条,点击查看更多共4条回复,已加载全部
微笑的rockets
微笑的rockets
敢不敢在geeker一些
太直接了吧
有这样就直接进入主体的吗?
lauren
lauren回复lisper
我支持你!
lisper
lisper
作者
回复微笑的rockets
你不懂。。。
- 没有更多了 -