yangqiang29 发表于 2012-7-12 20:54:10

远程控制LED灯

功能:
通过运行电脑上的代码,控制两个远程LED灯的开关。

硬件需求:
1、Arduino 控制板
2、ENC28J60 模块
3、220欧电阻2个
4、LED灯*2
5、连接线若干

电路:
1、ENC28J60模块与Arduino控制板接线

2、两个LED灯分别接在控件板7、8接口,各串联一个220欧电阻后接地。


Arduino服务端代码:
#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network.
// gateway and subnet are optional:
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[]={192,168,2, 177};

// telnet defaults to port 23
Server server(23);


void setup() {
// initialize the ethernet device
Ethernet.begin(mac, ip);
// start listening for clients
server.begin();
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);   
Serial.begin(9600);

Serial.print("Chat server address:");
Serial.println("192.168.2.177");
}

void loop() {
// wait for a new client:
Client client = server.available();

if (client)
{
      if (client.available() > 0)
      {
      // read the bytes incoming from the client:
      char thisChar = client.read();
      if(thisChar=='b')
      {
            digitalWrite(7, HIGH);
            digitalWrite(8, LOW);
      }
      else if(thisChar=='c')
      {
            digitalWrite(7, LOW);
            digitalWrite(8, HIGH);
      }
      else
      {
            digitalWrite(7, LOW);
            digitalWrite(8, LOW);
      }

      Serial.println(thisChar);
      client.flush();   //每次接收完数据后必须清除,不然会出错。
      }
      client.stop();
}
}


电脑控制端代码:
#include <winsock2.h>
#pragma comment(lib,"WS2_32")
#include <stdio.h>

//封装一个类,用于载入和释放Winsock库
class CInitSock
{
public:
        CInitSock(BYTE minorVer=2,BYTE majorVer=2)
        {
                WSADATA wsaData;
                WORD sockVersion=MAKEWORD(minorVer,majorVer);
                if(::WSAStartup(sockVersion,&wsaData)!=0)
                {
                        exit(0);
                }
        }
        ~CInitSock()
        {
                ::WSACleanup();
        }
};
CInitSock initSock;
int main()
{

        char buff;
        int chose;
       printf("==================\n");
        printf("||远程LED控制程序||\n");
        printf("==================\n");
        printf("输入1,一号灯亮。\n");
        printf("输入2,二号灯亮。\n");
        printf("输入3,两灯全灭。\n");
        printf("输入其它,程序退出。\n");
        printf("请输入一个字符:\n");
        while(true)
        {
                SOCKET s=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

                if(s==INVALID_SOCKET)
                {
                        printf("Failed socket()\n");
                        return 0;
                }

                sockaddr_in servAddr;
                servAddr.sin_family=AF_INET;
                servAddr.sin_port=htons(23);
                servAddr.sin_addr.S_un.S_addr=inet_addr("192.168.2.177");

                if(::connect(s,(LPSOCKADDR)&servAddr,sizeof(servAddr))==-1)
                {
                        printf("Failed connect()\n");
                        return 0;
                }

               
                chose=getchar();getchar();//接收选择字符和回车
               
                if(chose=='1')
                        buff='b';
                else if(chose=='2')
                        buff='c';
                else if(chose=='3')
                        buff='a';
                else
                        break;
                int n_Send=::send(s,&buff,1,0);
                ::closesocket(s);
        }
        return 0;
       
}

Randy 发表于 2012-7-13 09:07:26

可以算是远程控制的智能家居的一部分了!小部分!!!呵呵!加油!

yyy_zc 发表于 2012-7-13 12:22:34

网页方式好,仅一方ARDUINO编程即可实现

yangqiang29 发表于 2012-7-13 19:57:05

Randy 发表于 2012-7-13 09:07 static/image/common/back.gif
可以算是远程控制的智能家居的一部分了!小部分!!!呵呵!加油!

是啊,刚开始接触这个,还要加强学习才行。

yangqiang29 发表于 2012-7-13 19:57:35

yyy_zc 发表于 2012-7-13 12:22 static/image/common/back.gif
网页方式好,仅一方ARDUINO编程即可实现

嗯,网页方式的控制也准备学习一下。

Randy 发表于 2012-7-13 22:09:29

yangqiang29 发表于 2012-7-13 19:57 static/image/common/back.gif
是啊,刚开始接触这个,还要加强学习才行。

有志者事竟成!

麽麽茶㊣ 发表于 2012-7-15 21:06:09

本帖最后由 麽麽茶㊣ 于 2012-7-15 21:08 编辑

刚写完TCP IP这一块~ 哈哈~
我看完后,又看了看自己这边Server端,是不是可以这样改?
SOCKET监听这一边得到 arduino的个数。然后指向性发出char或int信号~       
       int SendMessageAll(const char* buf, int iLen);

        int SendMessageSingle(const char* buf, int iLen, string iID);

        int GetMessage(int iMaxLen);

        int GetClientNum();arduino这一块有Serial.read 得到Server这一端的信号~ 还有Serial.write发送一个字符串,让Server端知道是哪个ID~

这样既可以控制,还可以选择控制。
主要是Server不用规定发送什么,只要发送char,arduino来判断char的信息是否有if语句满足就好了~

erjiang 发表于 2012-7-15 21:50:31

有空的时候,试试Yeelink的web页面控制方式吧
http://blog.yeelink.net/?p=94

Jerry 发表于 2012-7-25 14:27:05

这是W5100的网板代码,不是28J60的

michael5251 发表于 2015-3-15 22:52:13

在VS编译完成后不能从键盘中输入是什么原因?
页: [1]
查看完整版本: 远程控制LED灯