
wowow
Dependencies: C12832 ESP-call FXOS8700Q
main.cpp
- Committer:
- 201710861
- Date:
- 2022-06-13
- Revision:
- 1:e34e9d7420a0
- Parent:
- 0:851ebdb20ae7
File content as of revision 1:e34e9d7420a0:
#include "mbed.h" #include "C12832.h" #include "ESP-call.h" #include "communication.h" //================================================================ Serial pc(USBTX, USBRX, 115200); using namespace std; char esp_data; char esp_arr[20]; char arr_time[20] = "0:0:0"; int index = 0; int mbedMode = 0; int tempMode = 2; bool trans_status = 0; PwmOut led_r(D5); PwmOut led_g(D9); AnalogIn sensor(A0); DigitalOut led(D3); Thread thread_led; Thread thread_lcd; Ticker ticker; void ledSet(); #define MAIN 0 #define COM 1 #define ALARM 2 #define ALARM_SET 29 #define PERM 3 #define ALARM_SOUND 21 #define ALARM_LED 22 #define ALARM_SOUND_LED 23 #define ALARM_ERROR 24 #define PERM_SOUND 31 #define PERM_LED 32 #define PERM_SOUND_LED 33 #define PERM_ERROR 34 int send_count = 0; //================================ LCD ================================ C12832 lcd(D11, D13, D12, D7, D10); // lcd = (MOSI, SCK, RESET, A0, nCS) bool alarm_stop_lcd = 0; // LCD 초기화 void lcdInit(); // LCD의 x, y 좌표에 str을 출력 void writeLcdCLS(const char*, int, int); // LCD의 x, y 좌표에 str을 출력 cls (x) void writeLcd(const char*, int, int); // LCD에 digital clock 출력 void writeTime(); // LCD에 alarm 출력 void writeAlarm(); //================================ Alarm ================================ Thread thread_Alarm; Timer timer; Timer trans_timer; int a_time = 0; // alarm 시간 int a_time_temp = 0; int a_tm = 0; int a_hour = 0; int a_mins = 0; int a_sec = 0; int start_alarm = 0; int end_alarm = 0; int a_temp = 0; int a_temp_h = 0; int a_temp_m = 0; int a_temp_s = 0; // Timer 동작(thread) void timerSet(); // Timer 초기화 void timerReset(); // alarm 설정 void alarmSet(); void alarmStart(); void alarmCount(); //================================ Clock ================================ Thread thread_Clock; int c_hour = 0; int c_mins = 0; int c_sec = 0; //digital clock 초기화 void clockInit(); //현재 시각 가져옴 void getTime(); //digital clock 출력 void writeTime(); //================================ Joystick ================================ InterruptIn up(A2); InterruptIn down(A3); InterruptIn left(A4); InterruptIn rite(A5); InterruptIn center(D4); InterruptIn sw2(SW2); InterruptIn sw3(SW3); // permanent 중지 void ISR_center(); void ISR_up(); void ISR_down(); void ISR_left(); void ISR_rite(); void ISR_sw2(); void perm_Stop(); //main bool main_center = 0; //communication bool com_left = 0; bool com_right = 0; bool com_center = 0; //alarm set (알람 설정) bool alarm_set_up = 0; bool alarm_set_down = 0; bool alarm_set_left = 0; bool alarm_set_right = 0; bool alarm_set_center = 0; //alarm(다음 선택) bool alarm_left = 0; bool alarm_right = 0; bool alarm_center = 0; //permanent bool perm_left = 0; bool perm_right = 0; bool perm_center = 0; //common (마지막 layer들 뒤로가기 기능 통일) bool button_back = 0; //sw2 //permanent 송신 중단 bool perm_stop = 0; //================================ Communication ================================ bool alarm_trans_status = 0; int alarm_trans_mode = 0; bool perm_trans_status = 0; int perm_trans_mode = 0; //===================================== //LCD void lcdPrint(){ switch(mbedMode){ case MAIN: writeLcd("COMMUNICATION DEVICE", 0, 6); writeTime(); if(main_center){ mbedMode = COM; tempMode = ALARM_SET; main_center = 0; lcd.cls(); } break; case COM: if(alarm_stop_lcd){ writeLcdCLS("Alarm Mode is finished...", 0, 6); thread_sleep_for(1500); alarm_stop_lcd = 0; lcd.cls(); } writeLcd("COMMUNICATION DEVICE", 0, 6); writeLcd("Select", 0, 16); if(com_left || com_right){ if(tempMode == ALARM_SET){ writeLcd("Select Permanent ", 0, 16); tempMode = PERM; }else{ writeLcd("Select Alarm ", 0, 16); tempMode = ALARM_SET; } com_left = 0; com_right = 0; }else if(com_center){ mbedMode = tempMode; if(tempMode == ALARM_SET){ if(perm_trans_status){ mbedMode = COM; writeLcdCLS("Permanent mode is running...", 0, 6); thread_sleep_for(500); lcd.cls(); }else if(alarm_trans_status){ mbedMode = alarm_trans_mode; }else{ tempMode = ALARM_SET; } }else if(tempMode == PERM){ if(alarm_trans_status){ mbedMode = COM; writeLcdCLS("Alarm mode is running...", 0, 6); thread_sleep_for(500); lcd.cls(); }else if(perm_trans_status){ mbedMode = perm_trans_mode; }else{ tempMode = PERM_SOUND; } } lcd.cls(); com_center = 0; }else if(button_back){ lcd.cls(); mbedMode = MAIN; button_back = 0; } break; case ALARM_SET: // alarm_set_~ writeLcd("Alarm Set Mode", 0, 6); alarmSet(); a_temp_h = a_temp / 3600; a_temp %= 3600; a_temp_m = a_temp / 60; a_temp %= 60; a_temp_s = a_temp; lcd.locate(0, 16); lcd.printf("Time = %d : %d : %d ", a_temp_h, a_temp_m, a_temp_s); if(alarm_set_center){ mbedMode = ALARM; tempMode = ALARM_SOUND; alarm_set_center = 0; lcd.cls(); }else if(button_back){ mbedMode = COM; tempMode = ALARM_SET; button_back = 0; lcd.cls(); } break; case ALARM: // alarm_~ writeLcd("Alarm Mode", 0, 6); writeLcd("Select", 0, 16); if(alarm_left){ if(tempMode == ALARM_SOUND){ writeLcd("Select Sound+Led ", 0, 16); tempMode = ALARM_SOUND_LED; }else if(tempMode == ALARM_LED){ writeLcd("Select Sound ", 0, 16); tempMode = ALARM_SOUND; }else if(tempMode == ALARM_SOUND_LED){ writeLcd("Select Led ", 0, 16); tempMode = ALARM_LED; } alarm_left = 0; }else if(alarm_right){ if(tempMode == ALARM_SOUND){ writeLcd("Select Led ", 0, 16); tempMode = ALARM_LED ; }else if(tempMode == ALARM_LED){ writeLcd("Select Sound+Led ", 0, 16); tempMode = ALARM_SOUND_LED; }else if(tempMode == ALARM_SOUND_LED){ writeLcd("Select Sound ", 0, 16); tempMode = ALARM_SOUND; } alarm_right = 0; }else if(alarm_center){ alarmStart(); mbedMode = tempMode; alarm_center = 0; lcd.cls(); }else if(button_back){ mbedMode = ALARM_SET; tempMode = ALARM_SET; button_back = 0; lcd.cls(); } break; case PERM: writeLcd("Permanent Mode ", 0, 6); writeLcd("Select", 0, 16); if(button_back){ mbedMode = COM; tempMode = PERM; trans_status = 0; button_back = 0; lcd.cls(); }else if(perm_left){ if(tempMode == PERM_SOUND){ writeLcd("Select Sound+Led ", 0, 16); tempMode = PERM_SOUND_LED; }else if(tempMode == PERM_LED){ writeLcd("Select Sound ", 0, 16); tempMode = PERM_SOUND; }else if(tempMode == PERM_SOUND_LED){ writeLcd("Select Led ", 0, 16); tempMode = PERM_LED; } perm_left = 0; }else if(perm_right){ if(tempMode == PERM_SOUND){ writeLcd("Select Led ", 0, 16); tempMode = PERM_LED; }else if(tempMode == PERM_LED){ writeLcd("Select Sound+Led ", 0, 16); tempMode = PERM_SOUND_LED; }else if(tempMode == PERM_SOUND_LED){ writeLcd("Select Sound ", 0, 16); tempMode = PERM_SOUND; } perm_right = 0; }else if(perm_center){ mbedMode = tempMode; lcd.cls(); perm_center = 0; } break; case ALARM_SOUND: writeLcd("Alarm Sound Mode ", 0, 6); writeAlarm(); if(!alarm_trans_status){ alarm_trans_status = 1; alarm_trans_mode = ALARM_SOUND; thread_sleep_for(1000); writeLcdCLS("Not Supported", 0, 6); alarmStart(); } if(button_back){ mbedMode = COM; tempMode = ALARM_SET; lcd.cls(); button_back = 0; } break; case ALARM_LED: writeLcd("Alarm Led Mode ", 0, 6); writeAlarm(); if(!alarm_trans_status){ alarm_trans_status = 1; alarm_trans_mode = ALARM_LED; alarmStart(); //send_count = 1; //if(!send_count){ //mutex.lock(); //send_count=1; send(led, sensor); //mutex.unlock(); //} } if(button_back){ mbedMode = COM; tempMode = ALARM_SET; lcd.cls(); button_back = 0; } break; case ALARM_SOUND_LED: writeLcd("Alarm Sound+Led Mode ", 0, 6); writeAlarm(); if(!alarm_trans_status){ alarm_trans_status = 1; alarm_trans_mode = ALARM_SOUND_LED; alarmStart(); thread_sleep_for(1000); writeLcdCLS("Not Supported ", 0, 6); } if(button_back){ mbedMode = COM; tempMode = ALARM_SET; lcd.cls(); button_back = 0; } break; case ALARM_ERROR: writeLcd("Error ", 0, 6); writeLcd("Please Push Back Button", 0, 16); if(button_back){ tempMode = ALARM_SET; mbedMode = COM; button_back = 0; } break; case PERM_SOUND: writeLcd("Permanent Sound Mode ", 0, 6); if(!perm_trans_status){ perm_trans_status = 1; perm_trans_mode = PERM_SOUND; writeLcd("Not Supported ", 0, 16); } if(button_back){ mbedMode = COM; tempMode = PERM; button_back = 0; lcd.cls(); } if(perm_stop){ perm_Stop(); perm_stop = 0; } break; case PERM_LED: writeLcd("Permanent Led Mode ", 0, 6); if(!perm_trans_status){ perm_trans_status = 1; perm_trans_mode = PERM_LED; mutex.lock(); writeLcd("Receiving... ", 0, 16); recv(led, sensor); mutex.unlock(); } if(button_back){ mbedMode = COM; tempMode = PERM; button_back = 0; lcd.cls(); } if(perm_stop){ perm_Stop(); perm_stop = 0; } break; case PERM_SOUND_LED: writeLcd("Permanent Sound+Led Mode ", 0, 6); if(!perm_trans_status){ perm_trans_status = 1; perm_trans_mode = PERM_SOUND_LED; writeLcd("Not Supported ", 0, 16); } if(button_back){ mbedMode = COM; tempMode = PERM; button_back = 0; lcd.cls(); } if(perm_stop){ perm_Stop(); perm_stop = 0; } break; case PERM_ERROR: writeLcd("Error ", 0, 6); writeLcd("Please Push Back Button", 0, 16); if(button_back){ tempMode = PERM; mbedMode = COM; button_back = 0; } break; default: break; } } void writeLcdCLS(const char* str, int x, int y){ lcd.locate(x, y); lcd.cls(); lcd.printf("%s", str); } void writeLcd(const char* str, int x, int y){ lcd.locate(x, y); lcd.printf("%s", str); } void lcdStart(){ while(true){ lcdPrint(); } } //===================================== //ALARM void alarmSet(){ a_temp = a_time; if(alarm_set_up){// +1시간 if(a_time < 82800){ a_time += 3600; }else{ a_time -= 86400; a_time += 3600; } alarm_set_up = 0; }else if(alarm_set_down){// -1시간 if(a_time >= 3600){ a_time -= 3600; }else{ a_time += 86400; a_time -= 3600; } alarm_set_down = 0; }else if(alarm_set_left){// +1분 if(a_time < 86340){ a_time += 60; }else{ a_time -= 86400; a_time += 60; } alarm_set_left = 0; }else if(alarm_set_right){// -1분 if(a_time >= 60){ a_time -= 60; }else{ a_time += 86400; a_time -= 60; } alarm_set_right = 0; } } void alarmReset(){ a_time = 0; a_hour = 0; a_mins = 0; a_sec = 0; a_tm = 0; a_temp = 0; a_time_temp = 0; end_alarm = 0; start_alarm = 0; send_count = 0; alarm_trans_status = 0; alarm_trans_mode = 0; mbedMode = COM; tempMode = ALARM_SET; alarm_stop_lcd = 1; timer.stop(); timer.reset(); } void alarmCount(){ while(true){ if(alarm_trans_status){ a_tm = timer.read(); a_time_temp = a_time - a_tm - (end_alarm - start_alarm); if(a_time_temp > 0 && alarm_trans_status){ a_hour = a_time_temp / 3600; a_time_temp = a_time_temp % 3600; a_mins = a_time_temp / 60; a_time_temp = a_time_temp % 60; a_sec = a_time_temp; thread_sleep_for(1000); }else if(a_time_temp == 0 && alarm_trans_status){ alarmReset(); } } } } void alarmStart(){ timer.reset(); timer.start(); thread_sleep_for(100); thread_Alarm.start(alarmCount); } void writeAlarm(){ lcd.locate(0, 16); lcd.printf("Time Left: %d:%d:%d ", a_hour, a_mins, a_sec); } //===================================== //CLOCK void clockInit(){ //thread_Clock.start(getTime); } int i; int j; void getTime(){ PC.printf("%s\r\n", esp_arr); for(i = 0; i < 10; i++){ if(esp_arr[i] == 't' && esp_arr[i+1] == 'i' && esp_arr[i+2] == 'm' && esp_arr[i+3] == 'e'){ j = 0; while(esp_arr[i] != 'H' && esp_arr[i] !='\0' && i != 20){ arr_time[j++] = esp_arr[i++]; } arr_time[j] = '\0'; break; } } PC.printf("%s\r\n", arr_time); } void writeTime(){ getTime(); lcd.locate(0, 16); lcd.printf("%s", arr_time); thread_sleep_for(500); } //===================================== //JOYSTICK void ISR_center(){ switch(mbedMode){ case MAIN: main_center = 1; break; case COM: com_center = 1; break; case ALARM: alarm_center = 1; break; case ALARM_SET: alarm_set_center = 1; break; case PERM: perm_center = 1; break; default: break; } } void ISR_up(){ switch(mbedMode){ case ALARM_SET: alarm_set_up = 1; break; default: break; } } void ISR_down(){ switch(mbedMode){ case ALARM_SET: alarm_set_down = 1; break; default: break; } } void ISR_left(){ switch(mbedMode){ case COM: com_left = 1; break; case ALARM: alarm_left = 1; break; case ALARM_SET: alarm_set_left = 1; break; case PERM: perm_left = 1; break; default: break; } } void ISR_rite(){ switch(mbedMode){ case COM: com_right = 1; break; case ALARM_SET: alarm_set_right = 1; break; case ALARM: alarm_right = 1; break; case PERM: perm_right = 1; break; default: break; } } void ISR_sw2(){ switch(mbedMode){ case COM: case ALARM: case ALARM_SET: case ALARM_SOUND: case ALARM_LED: case ALARM_SOUND_LED: case PERM: case PERM_SOUND: case PERM_LED: case PERM_SOUND_LED: button_back = 1; break; default: break; } } void ISR_sw3(){ switch(mbedMode){ case PERM_SOUND: case PERM_LED: case PERM_SOUND_LED: perm_stop = 1; break; default: break; } } void joyInit(){ up.rise(&ISR_up); down.rise(&ISR_down); left.rise(&ISR_left); rite.rise(&ISR_rite); center.rise(&ISR_center); sw2.fall(&ISR_sw2); sw3.fall(&ISR_sw3); } void perm_Stop(){ mbedMode = COM; tempMode = PERM; perm_stop = 1; writeLcdCLS("Permanent Stop...", 0, 16); perm_trans_status = 0; perm_trans_mode = 0; thread_sleep_for(1500); lcd.cls(); } //================================ NodeMCU program ================================ NodeMCU_PGM http_server[] = { "", 1, "wifi.setmode(wifi.STATION)", 1, "", 1, "station_cfg={}", 1, "station_cfg.ssid=\"IP_S\"", 1, "station_cfg.pwd=\"1kokrjg3un7i4\"", 1, "station_cfg.save=false", 1, "wifi.sta.config(station_cfg)", 1, "", 1, "wifi.sta.connect()", 80, "", 1, "print(wifi.sta.status())", 1, "print(wifi.sta.getip())", 1, "", 1, "", 1, "http_resp = \"HTTP/1.0 200 OK\\r\\nContent-Type: text/html\\r\\n\\r\\n\"", 1, "html_1 = \"<!DOCTYPE html>\"", 1, "html_2 = \"<html lang=\\\"ko\\\">\"", 1, "html_3 = \"<head>\"", 1, "html_4 = \" <meta charset=\\\"UTF-8\\\">\"", 1, "html_5 = \" <title>clock1</title>\"", 1, "html_6 = \"</head>\"", 1, "html_7 = \"<body>\"", 1, "html_8 = \" <h1 id=\\\"clock\\\" style=\\\"color:black;\\\">clock</h1>\"", 1, "", 1, "html_9 = \" <script>\"", 1, "html_10 = \" function clock() {\"", 1, "html_11 = \" var time = new Date();\"", 1, "", 1, "html_12 = \" var hours = time.getHours();\"", 1, "html_13 = \" var minutes = time.getMinutes();\"", 1, "html_14 = \" var seconds = time.getSeconds();\"", 1, "", 1, "html_text = \" Target.innerText = `${hours < 10 ? `0${hours}` : hours}:${minutes < 10 ? `0${minutes}` : minutes}:${seconds < 10 ? `0${seconds}` : seconds}`;\"", 1, "html_15 = \" location.replace(\\\"http://172.20.10.6\\\"+\\\"/?time=\\\"+hours.toString()+\\\":\\\"+minutes.toString()+\\\":\\\"+seconds.toString());\"", 1, "", 1, "html_16 = \" }\"", 1, "html_17 = \" setInterval(clock, 1000);\"", 1, "html_18 = \" </script>\"", 1, "html_19 = \"</body>\"", 1, "html_20 = \"</html>\"", 1, "", 1, "", 1, "srv = net.createServer(net.TCP)", 1, "srv:listen(80, function(conn)", 1, " conn:on(\"receive\", function(sck, payload)", 1, " print(payload)", 1, " sck:send(http_resp)", 1, " sck:send(html_1)", 1, " sck:send(html_2)", 1, " sck:send(html_3)", 1, " sck:send(html_4)", 1, " sck:send(html_5)", 1, " sck:send(html_6)", 1, " sck:send(html_7)", 1, " sck:send(html_8)", 1, " sck:send(html_9)", 1, " sck:send(html_10)", 1, " sck:send(html_11)", 1, " sck:send(html_12)", 1, " sck:send(html_13)", 1, " sck:send(html_14)", 1, //" sck:send(html_text)", 1, " sck:send(html_15)", 1, " sck:send(html_16)", 1, " sck:send(html_17)", 1, " sck:send(html_18)", 1, " sck:send(html_19)", 1, " sck:send(html_20)", 1, " end)", 1, " conn:on(\"sent\", function(sck) sck:close() end)", 1, "end)", 1, NULL, 0, }; void receive_Data(){ esp_data = ESP.getc(); if(index < 20){ esp_arr[index++] = esp_data; }else if(index == 20){ esp_arr[index] = '\0'; } } void time_get(){ index = 0; } void ledSet(){ while(true){ while(perm_trans_status || alarm_trans_status){ led_r = 1; led_g = 0; thread_sleep_for(100); led_g = 1; thread_sleep_for(100); } led_r = 0; led_g = 1; } } //========================================================================== //main int main(){ writeLcdCLS("Starting... ", 24, 6); ESP.baud(115200); PC.baud(115200); pc.printf("\r\nReset ESP...\r\n"); ESP_reset(); PC.printf("Setup ESP noecho...\r\n"); ESP_noecho(); PC.printf("Execute a NodeMCU program...\r\n"); ESP_call_multi(http_server); PC.printf("\r\nESP receive mode...\r\n"); ESP.attach(receive_Data, Serial::RxIrq); ticker.attach(&time_get, 1.0); clockInit(); thread_led.start(ledSet); thread_lcd.start(lcdStart); joyInit(); thread_sleep_for(500); while(true){ } }