본문 바로가기

3D Printer/OctoPrint

Chamber Manager Board 제작 #13 (설정값 전송 기능 추가)

【 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(), 11, temp));
        bOK = true;
        break;
      case 202// Ambient temperature
        if(cmd.Status == READ) {
          Serial.printf(F("OK O%d %s"), cmd.Object, dtostrf(g_fAmbentTemp, 11, 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;
      defaultbreak;
    }
 
    return bOK;
}
cs