
wowow
Dependencies: C12832 ESP-call FXOS8700Q
Revision 1:e34e9d7420a0, committed 2022-06-13
- Comitter:
- 201710861
- Date:
- Mon Jun 13 13:43:28 2022 +0000
- Parent:
- 0:851ebdb20ae7
- Commit message:
- The program used during demo; This is the program used on the board with Esp attached
Changed in this revision
ESP-call.lib | Show annotated file Show diff for this revision Revisions of this file |
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ESP-call.lib Mon Jun 13 13:43:28 2022 +0000 @@ -0,0 +1,1 @@ +http://os.mbed.com/users/dshin/code/ESP-call/#11487122965a
--- a/main.cpp Mon Jun 13 13:12:46 2022 +0000 +++ b/main.cpp Mon Jun 13 13:43:28 2022 +0000 @@ -1,16 +1,937 @@ #include "mbed.h" +#include "C12832.h" +#include "ESP-call.h" #include "communication.h" -#include "string" + +//================================================================ Serial pc(USBTX, USBRX, 115200); -DigitalOut D (D0); -AnalogIn sensor(A0); -//int test; -extern int interval; + +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 -int main() { - send(D,sensor); - return 0; +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(); - \ No newline at end of file + thread_sleep_for(500); + + while(true){ + + } +} \ No newline at end of file