[일반] 사랑의 독거 노인 도시락 MBED 프로그램 설명

서울 IoT해커톤에 제작하였던 독거노인 도시락 관련하여 김** 소장님 요청이 있어 정리하여 공유 합니다.


MBED는 특이하게 웹 컴파일러를 제공하여 처음에는 무척 편한 느낌 이었으나, 결국은 CLI를 써야 자세한 하부 구조 파악이 가능하다. (통합 툴이 제공하고 있어 검토 해볼만하다) 

a94c88544e3aa8a0ca167628e9d061f4.png


Setup함수 만들고  InterruptIn사용하여 버튼에 대한 인터럽트를 등록 fall은 입력 값이 HIGH->LOW로 값이 변할때 함수가 자동 발동, rise는 입력 값이 LOW->HIGH로 변할때 지정됨 할수가 발생 된다.

    ButtonStart.fall(&ButtonStart_Pressed);

    ButtonStart.rise(&ButtonStart_Released);


    ButtonMsgDefult.fall(&ButtonMsgDefult_Pressed);

    ButtonMsgDefult.rise(&ButtonMsgDefult_Released);

    

    ButtonMsgEat.fall(&ButtonMsgEat_Pressed);

    ButtonMsgEat.rise(&ButtonMsgEat_Released);    


    ButtonVoiceRecord.fall(&ButtonVoiceRecord_Pressed);

    ButtonVoiceRecord.rise(&ButtonVoiceRecord_Released); 


    ButtonVoiceListen.fall(&ButtonVoiceListen_Pressed);

    ButtonVoiceListen.rise(&ButtonVoiceListen_Released);  


Main 함수에서는 아래와 같은 기능을 처리

네트워크 초기화 

무게 센서에서 읽어 글로벌 변수에 입력

도시락 통의 상태에 따른 WebAPI호출

특정 시간 마다 온도/습독 측정 후 WebAPI호출

* 버튼 인터럽트 처리된 함수에서 Web API호출 시 thead동기화 문제로 처리 루틴을 Main에 통함시켰음


int main() {

    

   //--------------------------------------------------------------------------

    //  Digital Output Default is HIGH

    //--------------------------------------------------------------------------

    OutputVoiceDefault      = true;

    OutputVoiceEatSuccess   = true;

    OutputVoiceEatFail      = true;

    OutputVoiceRecordStart  = true;

    OutputVoiceRecordPlay   = true;

    

    //--------------------------------------------------------------------------

    //

    //-------------------------------------------------------------------------- 

    float fCalibration_factor = 1000; //-7050 worked for my 440lb max scale setup       

    int nAverageSamples = 100;

       


    LunchBoxWeight.setScale(0);

    LunchBoxWeight.tare(); //Reset the scale to 0

    

    long zero_factor = LunchBoxWeight.averageValue(nAverageSamples); //Get a baseline reading

        

    //--------------------------------------------------------------------------

    //  Set UP

    //--------------------------------------------------------------------------    

    Setup();


    printf( "**************************************************************\n");

    printf( " Hell Maker - Love Love Lunch Box                             \n"); 

    printf( "**************************************************************\n");        

            

                

    //--------------------------------------------------------------------------

    //  Connect to the network with the default networking interface

    //  if you use WiFi: see mbed_app.json for the credentials

    //--------------------------------------------------------------------------    

    g_pNetwork = connect_to_default_network_interface();

    if (!g_pNetwork) {

        printf("Cannot connect to the network, see serial output\n");

        return 1;

    }


    led3 = true;

   

    

    while (1) {


        LunchBoxWeight.setScale(fCalibration_factor); //Adjust to this calibration factor

        g_fLunchBoxWeight = LunchBoxWeight.getGram() * 10;;


        printf("Reading: %.2f \n", g_fLunchBoxWeight);                



        //----------------------------------------------------------------------

        //  Check the Lunch Box Status

        //----------------------------------------------------------------------      

        switch( g_LunchBoxStatus ) 

        {

        //

        //  

        //

        case LUNCHBOX_READY :   break;

        

        //

        // 도시락 무게 측정 

        //

        case LUNCHBOX_DELIVERED : {

             

                if( CheckLunboxWight() == WIGHT_DEFAULT ) {

                     

                    OutputVoiceDefault = false; 

                    

                    wait(0.5);

                    

                    OutputVoiceDefault = true; 

                    

                    g_LunchBoxStatus = LUNCHBOX_OPEN;                      

                                        

                    g_bLunchBox_Open = true;

                }                      

            }

            break;

                        

            

        //

        //

        //

        case LUNCHBOX_OPEN : 

            {

                       

            }

            break;

                    

                    

        case LUNCHBOX_EATALL : 

            {

                

            }

            break;

            

        case LUNCHBOX_EATLETTLE : 

            {           

                

            }

            break;

                    

        case LUNCHBOX_MAX :

            {

                

            }

            break;    

        default : {

            }

            break;

        }

    

        

        //----------------------------------------------------------------------

        //  Call Web API

        //----------------------------------------------------------------------        

        

        //

        //  LUNCHBOX_DELIVERED 

        //

        if( g_bLunchBox_Deliverd ) {            

            WebAPI( LUNCHBOX_DELIVERED );        

            g_bLunchBox_Deliverd = false;    

        }



        //

        //  Lunch Open

        //

        if( g_bLunchBox_Open ) {

            

            WebAPI( LUNCHBOX_OPEN );            

         

            g_bLunchBox_Open = false;   

        }

        

        

        //

        //  Lunch Eat All

        //

        if( g_bLunchBox_EatAll ) {            

            WebAPI( LUNCHBOX_EATALL );            

            g_bLunchBox_EatAll = false;

        }

        

        //

        //  Lunch Eat little

        //        

        if( g_bLunchBox_EatLittle ) {

            

            WebAPI( LUNCHBOX_EATLETTLE );            

            g_bLunchBox_EatLittle = false;   

        }



        //

        //  Temp & Hume Log

        //

        g_nLoopCount ++;

        

        if( g_nLoopCount >= 100 ) {

            

            sensors_update();

                     

            g_nLoopCount = 0;            

        }


        wait(delay);

    }

}


Web API 함수에서는 Server에 전송될 데이타를 받아서 API Url을 호출

Web의 POST방식으로 JOSN 형태로 전송 (https 사용 별도의 인증서 필요) 

 void WebAPI(int pAction, float pValue1=0.0f,float pValue2=0.0f, float pValue3=0.0f, float pValue4=0.0f) {

       

    HttpRequest* post_req = new HttpRequest(g_pNetwork, HTTP_POST, "http://your_url");

    post_req->set_header("Content-Type", "application/json");


    char body[1024] = "";


    sprintf( body , "{\"id\":\"1\",\"action\":\"%d\",\"value1\":\"%7.2f\",\"value2\":\"%7.2f\",\"value3\":\"%7.2f\",\"value4\":\"%7.2f\"}", 

                pAction, pValue1, pValue2, pValue3, pValue4  );

    


    HttpResponse* post_res = post_req->send(body, strlen(body));

    if (!post_res) {

        printf("HttpRequest failed (error code %d)\n", post_req->get_error());

        return;

    }


    printf("\n----- HTTP POST response -----\n");

    dump_response(post_res);


    delete post_req;   

}


서버의 API에서 독거노인 도시락에서 전송된 JSON데이타 저장

19:03:31 08:19:05 : {"id":"1","action":"2","value1":"   0.00","value2":"   0.00","value3":"   0.00","value4":"   0.00"}

19:03:31 08:19:17 : {"id":"1","action":"1","value1":"   0.00","value2":"   0.00","value3":"   0.00","value4":"   0.00"}

19:03:31 08:19:18 : {"id":"1","action":"2","value1":"   0.00","value2":"   0.00","value3":"   0.00","value4":"   0.00"}

19:03:31 08:19:42 : {"id":"1","action":"100","value1":"  28.00","value2":"  30.10","value3":"   0.00","value4":"   0.00"}

19:03:31 08:27:55 : {"id":"1","action":"100","value1":"  28.10","value2":"  30.30","value3":"   0.00","value4":"   0.00"}

19:03:31 08:28:51 : {"id":"1","action":"100","value1":"  28.20","value2":"  30.50","value3":"   0.00","value4":"   0.00"}

19:03:31 08:29:46 : {"id":"1","action":"100","value1":"  28.20","value2":"  30.50","value3":"   0.00","value4":"   0.00"}

19:03:31 08:31:55 : {"id":"1","action":"1","value1":"   0.00","value2":"   0.00","value3":"   0.00","value4":"   0.00"}

19:03:31 08:32:05 : {"id":"1","action":"2","value1":"   0.00","value2":"   0.00","value3":"   0.00","value4":"   0.00"}

19:03:31 08:32:16 : {"id":"1","action":"100","value1":"  28.10","value2":"  30.20","value3":"   0.00","value4":"   0.00"}


관련 DATA를 DB의 Table에 저장 후 Web Page로 제작 보여주는 정보 

38ae4ddf2a25612e54e1a063fc821642.png
14c104a6ddf3470d063754a282bc69a7.png

 
1
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

메이커 스토리

번호 제목 글쓴이 날짜 조회수
125 아두이노 헬박사님의 로봇팔 살리기 icon 양재동메이커 05-13 4,113
124 일반 레이저 커터 동파 사고 icon 양재동메이커 04-23 4,091
123 일반 기존 고양이 마이크로 파이썬으로 포팅 - 밀린 숙제하기 icon 양재동메이커 01-03 5,790
122 일반 휴식 icon 청계천도사 12-13 5,353
121 일반 기기를 수리한다는 것 icon 청계천도사 09-09 5,865
120 일반 수학 공부 왜 하나요? icon 청계천도사 07-20 6,569
119 아두이노 ESP32 CAM을 활용한 도깨비 자동차 Ver 3.0 icon 양재동메이커 06-12 7,880
118 라즈베리파이 Pupper 시작해서 Mini Pupper로 마무리 - 밀린 숙제하기 icon 양재동메이커 01-08 8,700
117 일반 말벌 인식 및 레이저 타격기 V 2.0 icon 양재동메이커 08-23 10,723
116 아두이노 ESP32 CAM - 도깨비 자동차 2 icon 양재동메이커 07-13 11,642
115 아두이노 ESP32 CAM - 도깨비 자동차 icon 양재동메이커 05-07 13,161
114 일반 급~한~개~발!! icon 청계천도사 04-08 12,177
113 일반 말벌 레이저 타격 테스트 모듈 icon 양재동메이커 03-10 13,340
112 아두이노 로보티즈 다이나믹 셀 MX-12W를 Arduino로 제어하기 (without 3 state buffer) +2 icon 양재동메이커 02-24 17,158
111 일반 2021 피우다 프로젝트 출품작 소개 자료집 icon HellMaker 01-12 12,722
110 일반 서보 모터 관련 여러가지 문제 icon 양재동메이커 11-19 13,550
109 라즈베리파이 Top Maker 해커톤 2021 icon 양재동메이커 08-29 13,088
108 라즈베리파이 라즈베리 파이 4 WiFi 안테나 확장 방법 icon 양재동메이커 08-24 18,557
107 아두이노 Otto Bot Bluetooth 연동하기 icon 양재동메이커 05-14 13,886
106 일반 자이로센서 roll, pitch, yaw 데이터 처리 구조 #2 icon HellMaker 03-01 13,924