2015/06/29 - [IT / Development/mbed] - mbed로 auto LED 만들어 보자. - 1


이전글에서 완성 했던 auto LED에 Ethernet Shield를 연결해서 Ethernet을 연결해 보았다.


위 사진과 같이 보드를 결합하고 코딩을 시작했다.

auto_LED_Ethernet 이라는 새로운 프로그램을 생성하고 main.cpp를 생성하고,  mbed 라이브러리를 import 했다.

그리고 추가로 WIZnet_Library도 추가를 해야한다.

"Import"에서 WIZnet으로 검색을 해서 WIZnet_Library를 선택하고 Import를 클릭한다.


Import 경로를 확인하고 Update를 체크하고 OK를 클릭한다.


auto_LED_Ethernet안에 WIZnet_Library가 추가 된것을 확인 할수 있다.


이제 코딩을 해보았다. 현재의 상태를 Server로 전송하는 Client를 구현해 보았다.

LED의 상태, 움직임 상태, 주위의 밝기 를 Sever로 전송한다.

[코드]

#include "mbed.h"
#include "WIZnetInterface.h"

#define USE_DHCP    0

#define PORT    5000

const char * IP_Addr    = "192.168.11.194";
const char * IP_Subnet  = "255.255.255.0";
const char * IP_Gateway = "192.168.11.1";
const char * Target_IP  = "192.168.11.227";
unsigned char MAC_Addr[6] = {0x00,0x08,0xDC,0x12,0x34,0x56};

Serial pc(USBTX, USBRX);

//#ifdef TARGET_FRDM-KL25Z
SPI spi(D11,D12,D13);
WIZnetInterface ethernet(&spi,D10,D2);
//#endif

Timer t;

DigitalOut ledR0(LED_RED);
DigitalOut ledG0(LED_GREEN);
//DigitalOut ledB0(LED_BLUE);

DigitalOut led0(D5);
DigitalOut led1(D6);

DigitalIn PIR(D8);
AnalogIn CDS(A0);

#define PLED_ON      led0 = led1 = 1
#define PLED_OFF     led0 = led1 = 0

int CDS_data;
int PIR_sensor;

int CDS_check()
{
    CDS_data = CDS.read()*1000;
    return CDS_data;
}

int PIR_check()
{
    PIR_sensor = PIR;
    return PIR_sensor;
}
int main()
{
    ledR0 = ledG0 = 1;
    PLED_OFF;
    //PIR.mode(PullDown);
    unsigned char flag = 1;
    int csd_int = 2;
    int pir_int0 = 2;
    int pir_int1 = 2;
    int pir_status = 0;

    pc.baud(115200);
    wait(0.5f);
    pc.printf("Hello mbed!\n\r");
    pc.printf("===========================================\n\r");
    
    #if USE_DHCP
    int ret = ethernet.init(MAC_Addr);
    #else
    int ret = ethernet.init(MAC_Addr,IP_Addr,IP_Subnet,IP_Gateway);
    #endif
    
    if (!ret) {
        pc.printf("Initialized, MAC: %s\r\n", ethernet.getMACAddress());
        ret = ethernet.connect();
        if (!ret) {
            pc.printf("IP: %s, MASK: %s, GW: %s\r\n",
                      ethernet.getIPAddress(), ethernet.getNetworkMask(), ethernet.getGateway());
        } else {
            pc.printf("Error ethernet.connect() - ret = %d\r\n", ret);
            exit(0);
        }
    } else {
        pc.printf("Error ethernet.init() - ret = %d\r\n", ret);
        exit(0);
    }
    
    //TCPSocketServer server;
//    server.bind(PORT);
//    server.listen();
    
    //pc.printf("\nWait for new connection...\r\n");
    TCPSocketConnection client;
    
    //server.accept(client);
    //client.set_blocking(false, 0); // Timeout=0.
    //pc.printf("Connection from: %s\r\n", client.get_address());
    client.connect(Target_IP,5000);
    
    if(client.is_connected() == 1){
        pc.printf("Connected success : %s\r\n", client.get_address());
        client.send("Hello server!\r\n", 15);
        PLED_ON;
        wait(0.2f);
        PLED_OFF;
        wait(0.2f);
        PLED_ON;
        wait(0.2f);
        PLED_OFF;
    }
    else {
        pc.printf("Connected fail : %s\r\n", client.get_address());
        PLED_ON;
        wait(0.4f);
        PLED_OFF;
    }
    
    while (true) {
        //printf("%d\r\n",CDS_check());
        if(CDS_check() > 600){
            if(csd_int != 0){
                pc.printf("Now is dark.\r\n");
                client.send("Now is dark.\r\n", 14);
                csd_int = 0;
            }
            ledG0 = 0;
            flag = 1;
            while(flag){
                if(PIR_check()){
                    if(pir_int0 != 0){
                        pc.printf("The movement is detected.\r\n");
                        pc.printf("Power LED is turned on.\r\n");
                        client.send("The movement is detected.\r\n", 27);
                        client.send("Power LED is turned on.\r\n", 25);
                        pir_int0 = 0;
                    }
                    t.stop();
                    t.reset();
                    t.start();
                    pir_status = 1;
                    ledR0 = 0;
                    PLED_ON;
                }
                if(pir_status == 0) {
                    flag = 0;
                }
                if(t.read_ms() > 5000 && pir_status == 1){
                    if(pir_int0 != 1){
                        pc.printf("The movement is not detected.\r\n");
                        pc.printf("Power LED is turned off.\r\n");
                        client.send("The movement is not detected.\r\n", 31);
                        client.send("Power LED is turned off.\r\n", 26);
                        pir_int0 = 1;
                    }
                    t.stop();
                    t.reset();
                    pir_status = 0;
                    ledR0 = 1;
                    PLED_OFF;
                    flag = 0;
                    wait(0.1f);
                }
            }
        }
        else{
            if(csd_int != 1){
                pc.printf("Now is brighter.\r\n");
                client.send("Now is brighter.\r\n", 18);
                csd_int = 1;
            }
            
            ledG0 = 1;
            if(PIR_check()){
                if(pir_int1 != 0){
                    pc.printf("The movement is detected.\r\n");
                    client.send("The movement is detected.\r\n", 27);
                    pir_int1 = 0;
                }
                ledR0 = 0;
            }
            else{
                if(pir_int1 != 1){
                    pc.printf("The movement is not detected.\r\n");
                    client.send("The movement is not detected.\r\n", 31);
                    pir_int1 = 1;
                }
                ledR0 = 1;
            }
        }
        
        //pc.printf("===========================================\n\r");
        //ledB0 = !ledB0;
        //wait(1);
    }
}


위와 같이 코딩을 완료 했다. 내가 원했던 동작은 양호하게 동작을 한다.

공유한 URL : https://developer.mbed.org/users/nanjsk/code/auto_LED_Ethernet/

아래 영상은 동작이 되는 영상이다. Server는 임시로 PC로 설정을 하고 터미널 창에서 auto_LED_Ethernet에서 보내온 메세지를 확인 할수 있다.




+ Recent posts