【 3D 프린터 챔버 만들기 】
[ Control Board 제작 #13 : 설정값 전송 기능 추가 ]
□ 필요 사항
- rbase64 library 사용
: 데이터 전송시 Binary값이 아닌 Base64로 인코딩된 Ascii Code로 변환하여 전송
[ 설정값을 저장할 구조체 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | typedef struct { // Length 27 char firstRun; int Temp_ControlMode; int Temp_Target; int Door_Ventil_Pos_Max; int Door_Ventil_Pos_Min; int Door_Filter_Pos_Max; int Door_Filter_Pos_Min; int Door_Ventil_Angle; int Door_Filter_Angle; int Door_Ventil_Speed; int Door_Filter_Speed; int Light_ControlMode; int Light_Sensitivity; int Light_InitailStatus; } DEVICEPARAM, *pDEVICEPARAM; | cs |
[ ChamberManager.ino Execute 함수 수정 ]
: 설정값은 g_Param으로 선언하여 사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 | bool Execute(CMD cmd) { char temp[10]; bool bOK = false; switch(cmd.Object) { case 0: // Hello Serial.println(F("OK O0 R0")); return true; case 10: // Write settings to eeprom break; case 20: // Setting load & save if(cmd.Status == WRITE) { if(rbase64.decode(cmd.Msg) == 0) { memcpy(&g_Param, rbase64.result(), sizeof(g_Param)); applyParams(&g_Param); testSetting(); } Serial.printf(F("OK O%d %d\n"), cmd.Object, cmd.Value); bOK = true; } else if(cmd.Status == READ) { if(rbase64.encode((uint8_t*)&g_Param, sizeof(g_Param))==0) { Serial.print(F("OK O"));Serial.print(cmd.Object);Serial.print(F(" "));Serial.println(rbase64.result()); bOK = true; } } break; case 111: // Ventil Servo Max position if(cmd.Status == WRITE) { g_DoorVentil.setMaxPos(cmd.Value); g_Param.Door_Ventil_Pos_Max = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_DoorVentil.getMaxPos()); bOK = true; break; case 112: // Ventil Servo Min position if(cmd.Status == WRITE) { g_DoorVentil.setMinPos(cmd.Value); g_Param.Door_Ventil_Pos_Min = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_DoorVentil.getMinPos()); bOK = true; break; case 113: // Filter Servo Max position if(cmd.Status == WRITE) { g_DoorFilter.setMaxPos(cmd.Value); g_Param.Door_Filter_Pos_Max = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_DoorFilter.getMaxPos()); bOK = true; break; case 114: // Filter Servo Mix position if(cmd.Status == WRITE) { g_DoorFilter.setMinPos(cmd.Value); g_Param.Door_Filter_Pos_Min = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_DoorFilter.getMinPos()); bOK = true; break; case 200: // Temp Control mode if(cmd.Status == WRITE) { switch(cmd.Value) { case 1: // ON/OFF g_TempControl.setCtrlMode(ONOFF); break; case 2: // PID g_TempControl.setCtrlMode(PID); break; default: // MANUAL g_TempControl.setCtrlMode(MANUAL); break; } g_Param.Temp_ControlMode = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_TempControl.getCtrlMode()); bOK = true; break; case 201: // Temperature target if(cmd.Status == WRITE) { g_TempControl.setAmbientTarget(cmd.Value); g_Param.Temp_Target = cmd.Value; } Serial.printf(F("OK O%d %s"), cmd.Object, dtostrf(g_TempControl.getAmbientTarget(), 1, 1, temp)); bOK = true; break; case 202: // Ambient temperature if(cmd.Status == READ) { Serial.printf(F("OK O%d %s"), cmd.Object, dtostrf(g_fAmbentTemp, 1, 1, temp)); bOK = true; } break; case 300: // FanEnable if(cmd.Status == WRITE) { if(cmd.Value == 1) { g_FanVentil.FanOn(); g_FanFilter.FanOn(); g_Param.Door_Ventil_Speed = 100; g_Param.Door_Filter_Speed = 100; } else { g_FanVentil.FanOff(); g_FanFilter.FanOff(); g_Param.Door_Ventil_Speed = 0; g_Param.Door_Filter_Speed = 0; } Serial.printf(F("OK O%d"), cmd.Object); bOK = true; } break; case 311: // Doors angle if(cmd.Status == WRITE) { g_DoorVentil.setAngle(cmd.Value); g_DoorFilter.setAngle(cmd.Value); g_Param.Door_Ventil_Angle = cmd.Value; g_Param.Door_Filter_Angle = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_DoorVentil.getAngle()); bOK = true; break; case 312: // Fans speed if(cmd.Status == WRITE) { g_FanVentil.setSpeed(cmd.Value); g_FanFilter.setSpeed(cmd.Value); g_Param.Door_Ventil_Speed = cmd.Value; g_Param.Door_Filter_Speed = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_FanVentil.getSpeed()); bOK = true; break; case 321: // Ventil door angle if(cmd.Status == WRITE) { g_DoorVentil.setAngle(cmd.Value); g_Param.Door_Ventil_Angle = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_DoorVentil.getAngle()); bOK = true; break; case 322: // Ventil fan speed if(cmd.Status == WRITE) { g_FanVentil.setSpeed(cmd.Value); g_Param.Door_Ventil_Speed = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_FanVentil.getSpeed()); bOK = true; break; case 331: // Filter door angle if(cmd.Status == WRITE) { g_DoorFilter.setAngle(cmd.Value); g_Param.Door_Filter_Angle = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_DoorFilter.getAngle()); bOK = true; break; case 332: // Filter fan speed if(cmd.Status == WRITE) { g_FanFilter.setSpeed(cmd.Value); g_Param.Door_Filter_Speed = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_FanFilter.getSpeed()); bOK = true; break; case 400: // Light control mode if(cmd.Status == WRITE) { g_LightControl.setControlMode(cmd.Value); g_Param.Light_ControlMode = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_LightControl.getControlMode()); bOK = true; break; case 401: // Light on/off if(cmd.Status == WRITE) { g_LightControl.setCurrentStatus(cmd.Value); g_Param.Light_InitailStatus = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_LightControl.getCurrentStatus()); bOK = true; break; case 411: // Light sensitivity if(cmd.Status == WRITE) { g_LightControl.setSensitivity(cmd.Value); g_Param.Light_Sensitivity = cmd.Value; } Serial.printf(F("OK O%d %d"), cmd.Object, g_LightControl.getSensitivity()); bOK = true; break; case 421: // Read light sensor value if(cmd.Status == READ) { Serial.printf(F("OK O%d %d"), cmd.Object, g_LightControl.getCurrentSensing()); bOK = true; } break; default: break; } return bOK; } | cs |