lisper 发表于 2014-11-14 11:39:29

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

本帖最后由 lisper 于 2014-11-26 21:05 编辑

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

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

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



/*
* Copyright (C) 2014 DFRobot                                                
*                                                                           
*/

/*
*      Author:                              lisper <lisper.li@dfrobot.com>
*      Date:                              2014-08-21
*      official website:                http://www.dfrobot.com
*      Description:                        control led by web button
*/

#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_VBAT5
#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       "yourssid"         // cannot be longer than 32 characters!
#define WLAN_PASS       "password"
// 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) {
      pinMode (11, OUTPUT);
      pinMode (12, OUTPUT);
      pinMode (13, OUTPUT);

      //pin normal state
      digitalWrite (11, LOW);
      digitalWrite (12, HIGH);
      digitalWrite (13, LOW);

      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!"));

      Serial.println(F("Request DHCP"));
      while (!cc3000.checkDHCP()) {
                delay(100); // ToDo: Insert a DHCP timeout!
      }

      /* 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) {
                processInput (client);
                sendWebPage (client);
      }
      client.close();
}

//
void processInput (Adafruit_CC3000_ClientRef client) {
      char databuffer;
      while (client.available ()) {
                client.read (databuffer, 40);

                char* sub = strchr (databuffer, '\r');
                if (sub > 0)
                        *sub = '\0';
                Serial.println (databuffer);
                sub = strstr (databuffer, "control");
                if (!sub) {
                        //Serial.println ("no control");                        
                        break;
                }
                sub = strstr (sub, "led");
                if (!sub) {
                        //Serial.println ("no led");                        
                        break;
                }
                sub += 4;
                if (strncmp (sub, "open", 4) == 0) {
                        Serial.println ("clicked open");
                        digitalWrite (11, HIGH);
                        digitalWrite (12, LOW);
                        digitalWrite (13, HIGH);
                        led_state = true;
                }
                else if (strncmp (sub, "close", 5) == 0) {
                        Serial.println ("clicked close");
                        digitalWrite (11, LOW);
                        digitalWrite (12, HIGH);
                        digitalWrite (13, LOW);
                        led_state = false;
                }
                break;
      }
}

void sendWebPage (Adafruit_CC3000_ClientRef client) {
      webServer.write ("<!DOCTYPE html>");
      webServer.write ("<html>");
      webServer.write ("<bodystyle=\"font-size:50px\">");
      webServer.write ("<form action=\"control\" method=\"get\">");
      webServer.write ("<button name=\"led\" style=\"height:200px;width:400px;font-size:50px\"");
      webServer.write ("type=\"submit\" value=\"open\">Open</button>");
      webServer.write ("<br><br>");
      webServer.write ("<button name=\"led\" style=\"height:200px;width:400px;font-size:50px\"");
      webServer.write ("type=\"submit\" value=\"close\">Close</button>");
      webServer.write ("</form>");
      webServer.write ("<br><br><p>Pin11 status: ");
      webServer.write (led_state ? "HIGH" : "LOW");      
      webServer.write ("<br><p>Pin12 status: ");
      webServer.write (led_state ? "LOW" : "HIGH");               
      webServer.write ("</p></body>");
      webServer.write ("</html>");
      delay (20);
      client.close();
}

//
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;
      }
}




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

ejiyuan1 发表于 2014-11-14 14:30:04

lisper 发表于 2014-11-14 13:49
wido自己做服务器,它还要连什么服务器?!

前辈问你一下我看到威龙驱动器有一个设置驱动器地址的命令,是不是意味着我用一个串口可以并行控制好几个威龙驱动器,只要将他们的ID地址设置为不同的值就可以

还有就是之前技术给了我一个威龙的库,我想问的是我用串口闭环模式读取转速时,是UNO需要在RX端并上一个电阻,当使用2560和wido时不用并电阻就可以读取转速吗?

lisper 发表于 2014-11-18 17:38:44

Jane 发表于 2014-11-18 17:17
好吧 怎么连接的呢?貌似光有个代码也不够啊。此帖太深奥,我们普通人看不懂啊。劳驾楼主能否写再详细点 ...

不知道怎么接继电器的没必要看这个帖子,不知道怎么接VCC,GND,数字口的没必要看这个帖子

lisper 发表于 2014-11-14 17:19:56

串电阻还是并电阻?“当使用2560和wido时不用并电阻就可以读取转速吗?”为什么这么问?串电阻是因为Uno的io电压是5V,驱动器是3.3V,因为串联分压,所以Uno需要串电阻给io口降压,uno,mega2560,wido的io口都是5V,所以。。。

Rockets 发表于 2014-11-14 12:14:04

敢不敢在geeker一些
太直接了吧
有这样就直接进入主体的吗?

lisper 发表于 2014-11-14 13:00:06

Rockets 发表于 2014-11-14 12:14
敢不敢在geeker一些
太直接了吧
有这样就直接进入主体的吗?

你不懂。。。

ejiyuan1 发表于 2014-11-14 13:14:26

把连接服务器的程序放在loop里是不是更好些,要不然断线的怎么办

lisper 发表于 2014-11-14 13:49:59

ejiyuan1 发表于 2014-11-14 13:14
把连接服务器的程序放在loop里是不是更好些,要不然断线的怎么办

:owido自己做服务器,它还要连什么服务器?!

hdc 发表于 2014-11-15 23:01:56

lisper 发表于 2014-11-14 13:49
wido自己做服务器,它还要连什么服务器?!

能不能固定IP的? 然后还可以加上定时功能?

lisper 发表于 2014-11-17 09:39:06

hdc 发表于 2014-11-15 23:01
能不能固定IP的? 然后还可以加上定时功能?

可以的~

ejiyuan1 发表于 2014-11-17 13:55:23

使用wido写了不到200行的代码,内存空间就快用完了,有没有解决的办法

lisper 发表于 2014-11-17 16:11:23

ejiyuan1 发表于 2014-11-17 13:55
使用wido写了不到200行的代码,内存空间就快用完了,有没有解决的办法

用MK2烧写器,把bootloader占用的空间腾出来用

冰渕 发表于 2014-11-17 17:55:20

貌似wido最近很火嘛~~

Ricky 发表于 2014-11-17 19:54:24

图啊,连线图呢?

Jane 发表于 2014-11-18 17:01:25

楼主这是来炫代码的吗~除了代码还是代码

lisper 发表于 2014-11-18 17:05:16

冰渕 发表于 2014-11-17 17:55
貌似wido最近很火嘛~~

已经火了有一阵子了

Grey 发表于 2014-11-18 17:10:50

大神好厉害!

lisper 发表于 2014-11-18 17:11:01

Jane 发表于 2014-11-18 17:01
楼主这是来炫代码的吗~除了代码还是代码

这是应大量客户的要求发的帖子

Jane 发表于 2014-11-18 17:17:43

lisper 发表于 2014-11-18 17:11
这是应大量客户的要求发的帖子

好吧 怎么连接的呢?貌似光有个代码也不够啊。此帖太深奥,我们普通人看不懂啊。劳驾楼主能否写再详细点啊~中间省略10000字的习惯不好啊~

lisper 发表于 2014-11-18 17:39:36

Grey 发表于 2014-11-18 17:10
大神好厉害!

为什么?

Grey 发表于 2014-11-18 18:13:06

有掉线的现象吗?
页: [1] 2 3
查看完整版本: 通过网页按钮控制台灯,wido做服务器