JZ_SearchLightTemp_calculation.c
5.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
/****************************************************/
#include <stdio.h>
#include "version_choose.h"
typedef enum {
DEFAULT_STATUS = 0x0000, //默认状态
LUMEN_UP = 0x0001, //亮度提高
LUMEN_DOWN =0x0002, //亮度降低
} JZ_TemControl_Code;
// typedef enum {
// JZ_T30 = 0x0000,
// JZ_T60 = 0x0001,
// JZ_T90 = 0x0002,
// JZ_T60S = 0x0003,
// JZ_U3 = 0x0004,
// JZ_A1 = 0x0005,
// } JZ_DeviceModel_Code;
static int InitialLumen = 0; //最初亮度
static int InitialFlag = 0; //最初亮度变化flag
/***
*
* 控件修改时,给温控模块一个亮度初值
*
* ****/
int JZsdk_SearchLightSetInitialLumen(int value)
{
if (InitialLumen >= 100)
{
InitialLumen = 100;
}
else if (InitialLumen <= 0)
{
InitialLumen = 0;
}
InitialLumen = value;
InitialFlag = DEFAULT_STATUS;
printf("刷新亮度初值%d\n",InitialLumen);
}
/***
*
* 获取限制温度
*
* ****/
static int JZsdk_SearchLightGetLimitTemp(int DeviceMode)
{
switch (DeviceMode)
{
// case JZ_T30:
// return 65;
// break;
// case JZ_T60:
// return 80;
// break;
// case JZ_T90:
// return 70;
// break;
// case JZ_T60S:
// return 65;
// break;
case JZ_U3:
return 70;
break;
case JZ_U3S:
return 70;
break;
case JZ_U3D:
return 70;
break;
case TF_A1:
return 70;
break;
default:
break;
}
return -1;
}
/***
*
* 根据超出范围/ 小于范围 获取温控时间
* 如果要优化,可以改成余弦曲线
* ****/
static int JZsdk_SearchLightGetLumenControlTime(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;
}
}
int JZsdk_SearchLightTemControl(float InputTemp, int InputLumen, int *OutputLumen, int *OutputDelay)
{
//初始化
*OutputLumen = 0;
*OutputDelay = 0;
int ControlFlag = DEFAULT_STATUS; //无变化为0, 升温为1,降温为2
float TempRange = 0; //温度范围
int LumenVariation = 0; //亮度变化值
//1、获取限制温度
int LimitTemp = JZsdk_SearchLightGetLimitTemp(DEVICE_VERSION);
if (LimitTemp == -1)
{
//没有对应的限制温度,返回失败及亮度0
*OutputLumen = 0;
*OutputDelay = 0;
return -1;
}
//2、判断是否要升高/降低温度 以及 获取差距范围
//如果输入的温度高于限制温度,说明要降亮度
if (InputTemp >= LimitTemp)
{
TempRange = InputTemp - LimitTemp;
//控制标志位: 降低亮度
ControlFlag = LUMEN_DOWN;
}
//如果输出的温度 小于限制温度,则要判断输入亮度与亮度初值的关系
else if (InputTemp < LimitTemp)
{
//如果输入亮度小于初值亮度
if (InputLumen < InitialLumen)
{
TempRange = LimitTemp - InputTemp;
//控制标志位:提高亮度
ControlFlag = LUMEN_UP;
}
//否则,不用进行处理
else
{
*OutputLumen = InputLumen;
*OutputDelay = 0;
ControlFlag = DEFAULT_STATUS;
return 0;
}
}
//3、根据输入的温度范围 获取降低/升高 的时间间隔
*OutputDelay = JZsdk_SearchLightGetLumenControlTime(TempRange);
//4、根据输入的温度范围 获取降低/升高 的亮度的步长 并 加上原亮度 得到新亮度
//暂时固定一度
if (ControlFlag == LUMEN_DOWN)
{
*OutputLumen = InputLumen - 1;
//如果在亮度回升期间,需要降低亮度
if (InitialFlag == LUMEN_UP)
{
//由于温度需要下降,说明初值亮度还是太高了
//将初值亮度降低1点
InitialLumen = InitialLumen-1;
printf("触发降低初值%d\n",InitialLumen);
InitialFlag = LUMEN_DOWN;
}
}
else if (ControlFlag == LUMEN_UP)
{
*OutputLumen = InputLumen + 1;
//如果亮度回升了
InitialFlag = LUMEN_UP;
}
else
{
//没有对应的标志位,温控失败
*OutputLumen = 0;
*OutputDelay = 0;
return -1;
}
return 0;
}
/***
*
* 用于判断是否超出最大温度范围10度
* 用于超出温度时的直接关灯
* 超过最大范围10度后 返回1
* 不超返回0
* ****/
int JZsdk_SearchLightTemControl_WhetherExceedsMaxRange(int InputTemp)
{
int LimitTemp = (JZsdk_SearchLightGetLimitTemp(DEVICE_VERSION) + 10);
if (InputTemp > LimitTemp)
{
return 1;
}
return 0;
}