JZ_TempControl.c
8.5 KB
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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
/* Includes ------------------------------------------------------------------*/
#include "JZ_TempControl.h"
#include "JZ_lamp.h"
#include "JZ_widget.h"
/* Private constants ---------------------------------------------------------*/
/* Private types -------------------------------------------------------------*/
/* Private values -------------------------------------------------------------*/
TempControlData *tempData;//存放温度、亮度数据
int InitialLumen;//最初亮度
int tempControlFlag = TEMP_NOTTRIGGER;//判断当前温度是否执行过温控
int light_mode = LIGHT_OFF; //探照灯模式
int tempMax = 70;//限制温度
int Initialflag = DEFAULT_STATUS;
/* Private functions declaration ---------------------------------------------*/
/* Exported functions definition ---------------------------------------------*/
/************************************
*温度控制线程
*函数名:TempControl_Task
*函数参数:
*返回值:
*函数作者:wzy
*************************************/
static void* TempControl_Task(void *arg)
{
int OutTime;//输出的调控时间
while (1)
{
Jz_LampTempControl(tempData->InputTemp,tempData->InputLumen,&InitialLumen,&OutTime,&tempData->OutLumen);
// printf("触发调控,输入温度%d,输入亮度%d,设置亮度%d,调控时间%d\n",tempData->InputTemp,tempData->InputLumen,InitialLumen,OutTime);
if(OutTime > 0)
{
tempControlFlag = TEMP_TRIGGER;
printf("触发调控,输入温度%d,输入亮度%d,设置亮度%d,调控时间%d\n",tempData->InputTemp,tempData->InputLumen,InitialLumen,OutTime);
usleep(OutTime*1000);
}
else
{
usleep(1*1000);
}
OutTime = 0;
}
}
/************************************
*温度控制任务创建
*函数名:TempControl_Task
*函数参数:
@serFd:串口文件描述符
*返回值:
*函数作者:wzy
*************************************/
int Jz_TempControlTaskCreate(void)
{
//需确保拿到亮度数据后再开启任务
usleep(1000*1000);
pthread_t pthread;
pthread_attr_t pthread_attr;
pthread_attr_init(&pthread_attr);
pthread_attr_setdetachstate(&pthread_attr, PTHREAD_CREATE_DETACHED); //设置线程分离属性
int ret = pthread_create(&pthread,&pthread_attr,TempControl_Task,NULL);
if(ret !=0)
{
printf("线程创建失败\n");
return -1;
}
pthread_t pthread1;
ret = pthread_create(&pthread1,&pthread_attr,TempControl_TempChangeTask,NULL);
if(ret !=0)
{
printf("线程创建失败\n");
return -1;
}
return 0;
}
/************************************
*温度调控
*函数名:LampTempControl
*函数参数:
@InputTemp:当前温度
@InputLumen: 当前亮度
@InitialLumen: 当前设置的亮度
@OutTime: 调控时间
@OutLumen: 调控后亮度
*返回值:
*函数作者:wzy
*************************************/
int Jz_LampTempControl(float InputTemp, int InputLumen,int *InitialLumen,int *OutTime,int *OutLumen)
{
int ControlFlag = DEFAULT_STATUS; //无变化为0, 升温为1,降温为2
//限制温度高于当前温度
if(tempMax >= InputTemp)
{
if(*InitialLumen > InputLumen) //输入亮度低于设置的初始亮度
{
*OutTime = Jz_LampGetTempControlTime(tempMax - InputTemp);
ControlFlag = LUMEN_UP;//亮度提高
}
else//输入亮度已达到设置的亮度,无需操作
{
*OutTime = 0;
*OutLumen = InputLumen;
ControlFlag = DEFAULT_STATUS;
return 0;
}
}
else if(tempMax < InputTemp)//限制温度低于当前温度
{
*OutTime = Jz_LampGetTempControlTime(InputTemp - tempMax);
ControlFlag = LUMEN_DOWN;//亮度降低
}
//改变输出亮度,在输入亮度基础上
switch (ControlFlag)
{
case LUMEN_UP:
*OutLumen = InputLumen + 1;
Initialflag = LUMEN_UP;
break;
case LUMEN_DOWN:
*OutLumen = InputLumen - 1;
//如果在亮度回升期间,需要降低亮度
if (Initialflag == LUMEN_UP)
{
//由于温度需要下降,说明初值亮度还是太高了
//将初值亮度降低1点
*InitialLumen -= 1;
Initialflag = LUMEN_DOWN;
}
break;
}
return 0;
}
/************************************
*获取温控时间
*函数名:LampGetTempControlTime
*函数参数:
@value: 当前温度与限制温度的差值
*返回值:
*函数作者:wzy
*************************************/
static int Jz_LampGetTempControlTime(float value)
{
//如果范围在0.4度以内
if (value <= 0.4)
{
return 5000; //延时5000ms
}
//0.4~1.0
else if ( (value > 0.4) && (value <= 1.0))
{
return 4600;
}
//1.0~1.8
else if ( (value > 1.0) && (value <= 1.8))
{
return 4100;
}
//1.8~2.8
else if ( (value > 1.8) && (value <= 2.8))
{
return 3500;
}
//2.8~4.0
else if ( (value > 2.8) && (value <= 4.0))
{
return 2800;
}
//4.0~5.4
else if ( (value > 4.0) && (value <= 5.4))
{
return 2000;
}
//5.4~7.0
else if ( (value > 5.4) && (value <= 7.0))
{
return 1100;
}
//7.0~9.8
else if ( (value > 7.0) && (value <= 9.8))
{
return 200;
}
else
{
return 100;
}
}
/************************************
*控件修改时,修改亮度初值
*函数名:LampGetTempControlTime
*函数参数:
@value
*返回值:
*函数作者:wzy
*************************************/
void JZ_LightSetInitialLumen(int value)
{
if(value >= 0 && value <= 100)
{
InitialLumen = value;
Initialflag = DEFAULT_STATUS;
}
}
/************************************
*结构体初始化
*函数名:LampGetTempControlTime
*函数参数:
@tempdata:温控结构体变量
*返回值:
*函数作者:wzy
*************************************/
void JZ_TempStructInit(void)
{
tempData = (TempControlData *)malloc(sizeof(TempControlData));
InitialLumen = 0;
tempData->InputLumen = 0;
tempData->InputTemp = 0;
tempData->OutLumen = 0;
}
/************************************
*判断灯的温度变化
*函数名:
*函数参数:
@lastTemp:上次温度
@curTemp:当前温度
@ControlFlag:温控标志位
*返回值:
*函数作者:wzy
*************************************/
// static void JZ_TempChangeJudgment(int lastTemp,int curTemp,int *ControlFlag)
// {
// switch (*ControlFlag)
// {
// case LUMEN_UP:
// //亮度提升时温度升高
// if(lastTemp < curTemp)
// { //此时不提升亮度,等到温度平稳
// *ControlFlag = DEFAULT_STATUS;
// }
// break;
// case LUMEN_DOWN:
// if(lastTemp > curTemp)
// {
// *ControlFlag = DEFAULT_STATUS;
// }
// break;
// }
// }
//改变温度部分
/************************************
*温度线程
*函数名: TempControl_TempChangeTask
*函数参数:
*返回值:
*函数作者:wzy
*************************************/
static void *TempControl_TempChangeTask(void *arg)
{
int Lumen = 0; //亮度
int lastLumen;//上一次亮度
while (1)
{
if(tempData->OutLumen < 0)
{
tempData->OutLumen = 0;
}
Lumen = tempData->OutLumen;
//判断是否超出温控范围了
if (tempData->InputTemp > tempMax +10) //超出最大温度10度
{
Jz_set_widget_value(4,0);
Jz_set_widget_value(5,0);
Lumen = 0;
tempData->InputLumen = Lumen;//改变温控输入亮度
JZ_LightSetInitialLumen(Lumen);//改变设置的亮度初值
Jz_LampLumenControl(Lumen,Lumen);
}
if(Lumen != lastLumen)//亮度改变
{
lastLumen = Lumen;
if(tempControlFlag == TEMP_TRIGGER)//触发了温控
{
tempControlFlag = TEMP_NOTTRIGGER;
if(Lumen != 0)
{
//重设亮度
Jz_LampLumenControl(Lumen,Lumen);
tempData->InputLumen = Lumen;
Jz_set_widget_value(4,Lumen);
}
}
}
usleep(200*1000);
}
}