添加灯源管理

check
Zeng wei (曾威) 2 years ago
parent 8fa7b77213
commit a9b22757ef

@ -49,9 +49,9 @@ void RX_BUF_Transfer(u8 zero,u8 transfer_num)//
RS485_RX_BUF[i] = 0;
RS485_RX_BUF_COPY[i] = 0;
}
RS485_RX_CNT -= transfer_num;
if (RS485_RX_CNT < 0) {
if (RS485_RX_CNT > transfer_num) {
RS485_RX_CNT -= transfer_num;
} else {
RS485_RX_CNT = 0;
}
}

@ -4,10 +4,10 @@
#include "Relays.h"
#include "myfreertos.h"
u8 prev_sendbuf[53] = {0xEE, 0xB5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFF, 0xFF};
u8 sendbuf[53] = {0xEE, 0xB5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFF, 0xFF};
u8 prev_sendbuf[62] = {0xEE, 0xB5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFF, 0xFF};
u8 sendbuf[62] = {0xEE, 0xB5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFF, 0xFF};
u8 sendbuf_crc[20] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
extern u8 global_buffer[64];
@ -48,6 +48,7 @@ extern int T;
extern int H;
extern int C;
extern PID pid;
extern u8 lights[9];
// extern u16 RED_LIGHT;
// extern u16 WHITE_LIGHT;
// extern u16 BLUE_LIGHT;
@ -356,11 +357,33 @@ void RS485_1_Send_Data(u8 *buf, u8 len)
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
;
// RS485_RX_CNT = 0;
RS485_1_TX_EN = 0;
}
/**
* send data to Serial 2
*/
void RS485_2_Send_Data(u8 *buf, u8 len)
{
u8 t;
RS485_2_TX_EN = 1;
for (t = 0; t < len; t++)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
;
USART_SendData(USART1, buf[t]);
}
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
;
// RS485_RX_CNT = 0;
RS485_2_TX_EN = 0;
}
void RS485_1_Send_Data_1(u8 *buf, u8 len)
{
u8 t;
@ -394,10 +417,10 @@ void RS485_1_Upload_Params(void)
sendbuf[1] = 0xB5;
sendbuf[2] = 0x05;
sendbuf[49] = 0xFF;
sendbuf[50] = 0xFC;
sendbuf[51] = 0xFF;
sendbuf[52] = 0xFF;
sendbuf[58] = 0xFF;
sendbuf[59] = 0xFC;
sendbuf[60] = 0xFF;
sendbuf[61] = 0xFF;
if (T <= 1000 && T >= -1000)
{
@ -501,23 +524,27 @@ void RS485_1_Upload_Params(void)
sendbuf[44] = (int)(pid.out_tem * 10) % 256;
sendbuf[45] = (int)(pid.out_humidity * 10) / 256;
sendbuf[46] = (int)(pid.out_humidity * 10) % 256;
// light
for (int i = 0; i < 9; i++) {
sendbuf[47 + i] = lights[i];
}
// bufcut_Init(sendbuf_crc, sendbuf, 3, 31);
// GetCRC16(sendbuf_crc, 28, &crc_num1, &crc_num2);
GetCRC16(sendbuf, 47, &crc_num1, &crc_num2);
sendbuf[47] = crc_num1;
sendbuf[48] = crc_num2;
GetCRC16(sendbuf, 56, &crc_num1, &crc_num2);
sendbuf[56] = crc_num1;
sendbuf[57] = crc_num2;
// u8 tmpabc[] = {0xAA, 0xBB, 0xCC};
// RS485_1_Send_Data(tmpabc, 3);
// only when modify happen, then send
// if (cmp_str(prev_sendbuf, sendbuf, 49) != 0) {
RS485_1_Send_Data(sendbuf, 53);
RS485_1_Send_Data(sendbuf, 62);
vTaskDelay(100);
cp_str_to_prev(prev_sendbuf, sendbuf, 53);
cp_str_to_prev(prev_sendbuf, sendbuf, 62);
// }
}

@ -18,11 +18,12 @@ extern u8 RS485_RX_Flag;
void RS485_1_Init(u32 bound);
void RS485_2_Init(u32 bound);
void RS485_3_Init(u32 bound);
void RS485_1_Send_Data(u8 *buf,u8 len);
void RS485_1_Send_Data_1(u8 *buf,u8 len);
//void RS485_3_Send_Data_1(void);
void RS485_1_Upload_Params(void);
void RS485_1_sync_env_params(void);
void RS485_1_Send_Data(u8 *buf,u8 len);
void RS485_2_Send_Data(u8 *buf,u8 len);
void RS485_3_Send_Data(u8 *buf,u8 len);
void RS485_Receive_Data(u8 *buf,u8 *len);
void SN74CB3Q3253_Init(void);

@ -24,23 +24,32 @@ u16 total_minute = 0;
湿70
10
*/
u8 total[] = {0xEE, 0XEE, 0x01, 0x04, 0x00, 0x00, 0xFA, 0x02, 0xBC, 0x00, 0x64, 0x00, 0x64, 0x00, 0x64, 0xFF, 0xFF, 0xFF,
0xEE, 0XEE, 0x02, 0x04, 0x00, 0x00, 0xFA, 0x02, 0xBC, 0x00, 0x64, 0x00, 0x64, 0x00, 0x64, 0xFF, 0xFF, 0xFF,
0xEE, 0XEE, 0x03, 0x04, 0x00, 0x00, 0xFA, 0x02, 0xBC, 0x00, 0x64, 0x00, 0x64, 0x00, 0x64, 0xFF, 0xFF, 0xFF,
0xEE, 0XEE, 0x04, 0x04, 0x00, 0x00, 0xFA, 0x02, 0xBC, 0x00, 0x64, 0x00, 0x64, 0x00, 0x64, 0xFF, 0xFF, 0xFF,
0xEE, 0XEE, 0x05, 0x04, 0x00, 0x00, 0xFA, 0x02, 0xBC, 0x00, 0x64, 0x00, 0x64, 0x00, 0x64, 0xFF, 0xFF, 0xFF,
0xEE, 0XEE, 0x06, 0x04, 0x00, 0x00, 0xFA, 0x02, 0xBC, 0x00, 0x64, 0x00, 0x64, 0x00, 0x64, 0xFF, 0xFF, 0xFF};
u8 total[] = {0xEE, 0XEE, 0x01, 0x04, 0x00, 0x00, 0xFA, 0x02, 0xBC, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
0xEE, 0XEE, 0x02, 0x04, 0x00, 0x00, 0xFA, 0x02, 0xBC, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
0xEE, 0XEE, 0x03, 0x04, 0x00, 0x00, 0xFA, 0x02, 0xBC, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
0xEE, 0XEE, 0x04, 0x04, 0x00, 0x00, 0xFA, 0x02, 0xBC, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
0xEE, 0XEE, 0x05, 0x04, 0x00, 0x00, 0xFA, 0x02, 0xBC, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
0xEE, 0XEE, 0x06, 0x04, 0x00, 0x00, 0xFA, 0x02, 0xBC, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64};
void Array(u8 *n, u8 *hour, u8 *min, u16 *tem, u16 *hum, u16 *red, u16 *blue, u16 *white)
void Array(u8* n, u8* hour, u8* min, u16* tem, u16* hum, u8* light)
{
*hour = (total[3 + 18 * (*n - 1)]);
*min = (total[4 + 18 * (*n - 1)]);
*tem = (total[5 + 18 * (*n - 1)] << 8 | total[6 + 18 * (*n - 1)]); // 温度
*hum = (total[7 + 18 * (*n - 1)] << 8 | total[8 + 18 * (*n - 1)]); // 湿度
*red = (total[9 + 18 * (*n - 1)] << 8 | total[10 + 18 * (*n - 1)]); // 红光
*blue = (total[11 + 18 * (*n - 1)] << 8 | total[12 + 18 * (*n - 1)]); // 蓝光
*white = (total[13 + 18 * (*n - 1)] << 8 | total[14 + 18 * (*n - 1)]); // 白光
*tem = (total[5 + 18 * (*n - 1)] << 8 | total[6 + 18 * (*n - 1)]); // 温度
*hum = (total[7 + 18 * (*n - 1)] << 8 | total[8 + 18 * (*n - 1)]); // 湿度
for (int i = 0; i < 9; i++) {
*(light + i) = total[9 + i + 18 * (*n - 1)]; // 光照
}
// *red1 = total[9 + 18 * (*n - 1)];
// *blue1 = total[10 + 18 * (*n - 1)];
// *white1 = total[11 + 18 * (*n - 1)];
// *red2 = total[12 + 18 * (*n - 1)];
// *blue2 = total[13 + 18 * (*n - 1)];
// *white2 = total[14 + 18 * (*n - 1)];
// *red3 = total[15 + 18 * (*n - 1)];
// *blue3 = total[16 + 18 * (*n - 1)];
// *white3 = total[17 + 18 * (*n - 1)];
}
uint8_t ArrayRead[108];
@ -144,17 +153,21 @@ void Analysis(u8 *n, u16 *i, u8 *rs485_rx_buf)
if (*i == 2)
{
total[3 + 18 * (*n - 1)] = rs485_rx_buf[5]; // 时
total[3 + 18 * (*n - 1)] = rs485_rx_buf[6]; // 时
}
if (*i == 3)
{
total[4 + 18 * (*n - 1)] = rs485_rx_buf[5]; // 分
total[4 + 18 * (*n - 1)] = rs485_rx_buf[6]; // 分
}
if (*i >= 4 && *i <= 8) // 温湿度红蓝白光
if (*i >= 4 && *i <= 5) // 温湿度
{
total[(2 * (*i) - 3) + 18 * (*n - 1)] = rs485_rx_buf[5];
total[(2 * (*i) - 2) + 18 * (*n - 1)] = rs485_rx_buf[6];
}
if (*i >= 6 && *i <= 8) // 光照
{
total[*i + 3 + 18 * (*n - 1)] = rs485_rx_buf[6];
}
}
void Batch_synchronization(u8 *n, u8 *rs485_rx_buf) // batch sync

@ -7,7 +7,7 @@
//void Write_Init(uint16_t ArrayWrite[]);
void Write_Init(void);
void Read_Init(void);
void Array(u8* n,u8 *hour,u8* min,u16* tem,u16* hum,u16* red,u16 *blue,u16* white);
void Array(u8* n, u8* hour, u8* min, u16* tem, u16* hum, u8* light);
void Analysis(u8* n,u16 *i,u8*rs485_rx_buf);
void Batch_synchronization(u8 *n,u8*rs485_rx_buf);

@ -17,7 +17,11 @@ int main(void)
TimePwm_init(400 - 1, 360 - 1); // 72M/400/360=500HZ
// GPIO_ResetBits(GPIOB,GPIO_Pin_0);
// TIM_SetCompare3(TIM3,0);
RS485_1_Init(9600);
// TODO::ÄÚº¬RS485_1_Init(9600) ³õʼ»¯RS485_1
light_set_all();
// RS485_1_Init(9600);
HC595_Pin_Init();
RTC_Init(); // 需要放在HC595_Pin_Init()后面
TIM2_Init();

@ -87,7 +87,9 @@ u8 ALARM = 0; //
u16 tick = 0; // tick大于600触发报警条件会报警小于600则不报警
u8 Feed_Dog_Count = 0; // Feeding dog timing
u8 now_stage = 1; // Current operational phase
u16 tem, hum, red, blue, white;
u16 tem, hum;
u8 lights[9];
u8 lights_addresses[9] = { 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29 };
u8 hour, min;
// u8 rs485buf[8] = {SENSOR_ADDRESS, 0x03, 0x00, 0x01, 0x00, 0x09, 0xD4, 0x3F}; // Sensor exchange data
u8 INNER_SENSOR_485_REQUEST_COMMAND[8] = {INNER_SENSOR_ADDRESS, 0x03, 0x00, 0x01, 0x00, 0x09, 0xD4, 0x3F}; // Inner sensor exchange data
@ -273,7 +275,7 @@ void Sensor_Communication_task(void *pvParameters)
// pingMqtt(MQTT_SOCK);
// }
now_stage = timelong_Compare();
Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // 更新对应阶段号的参数
Array(&now_stage, &hour, &min, &tem, &hum, lights); // ¸üжÔÓ¦½×¶ÎºÅµÄ²ÎÊý
delay_xms(50);
@ -311,7 +313,7 @@ void Sensor_Communication_task(void *pvParameters)
// batch update params in a stage
// total length: 18
Batch_synchronization(&n, RS485_RX_BUF_COPY);
Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // update param correspond to current stage
Array(&now_stage, &hour, &min, &tem, &hum, lights); // update param correspond to current stage
bufcut_Init(RS485_DATA_TMP, RS485_RX_BUF_COPY, 0, 18);
RS485_DATA_TMP[18] = 0xFF;
RS485_DATA_TMP[19] = 0xFC;
@ -319,18 +321,20 @@ void Sensor_Communication_task(void *pvParameters)
RS485_DATA_TMP[21] = 0xFF;
RS485_1_Send_Data_1(RS485_DATA_TMP, 22);
RX_BUF_Transfer(0, 18);
light_set_all();
}
else if (RS485_RX_BUF_COPY[0] == 0xEE && RS485_RX_BUF_COPY[1] == 0xB6 && RS485_RX_BUF_COPY[2] == 0x03 && CRC16_check(RS485_RX_BUF_COPY, 7) == 1)
{
// update single environment param
// total length: 9
Analysis(&n, &i, RS485_RX_BUF_COPY);
Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // update param correspond to current stage
Array(&now_stage, &hour, &min, &tem, &hum, lights); // update param correspond to current stage
Write_Init();
bufcut_Init(RS485_DATA_TMP, RS485_RX_BUF_COPY, 0, 9);
bufcut_Init(RS485_DATA_TMP + 8, RS485_SUFFIX, 9, 13);
RS485_1_Send_Data_1(RS485_DATA_TMP, 13);
RX_BUF_Transfer(0, 9);
light_set_all();
}
else if (RS485_RX_BUF_COPY[0] == 0xEE && RS485_RX_BUF_COPY[1] == 0xB6 && RS485_RX_BUF_COPY[2] == 0x04 && CRC16_check(RS485_RX_BUF_COPY, 4) == 1)
{
@ -435,8 +439,8 @@ void Sensor_Communication_task(void *pvParameters)
// PWM_SetCompare2((blue / 100.0 * 3.5 + 28)); // J11
// PWM_SetCompare4((white / 100.0 * 3.5 + 28)); // J10
// }
RS485_RX_CNT = 0;
RS485_RX_CNT = 0;
vTaskDelay(MAIN_TASK_PERIOD);
}
@ -568,3 +572,31 @@ void process_hmi_btn_event(u8 page, u8 btn_index, u8 value) {
}
}
}
void light_set(u8 address, u8 value) {
u8 data[8] = { address, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 };
if (value > 100) {
value = 100;
}
data[4] = value / 256;
data[5] = value % 256;
GetCRC16(data, 6, data + 6, data + 7);
delay_xms(10);
RS485_1_Send_Data(data, 8);
}
void light_set_all(void) {
// RS485_2_Init(9600);
RS485_3_Init(9600);
delay_xms(30);
for (int i = 0; i < 9; i++) {
// set light i
light_set(lights_addresses[i], lights[i]);
}
// RS485_1_Init(9600);
delay_xms(30);
RS485_1_Init(9600);
}

@ -29,6 +29,14 @@ void os_init(void);
void process_inner_sensor_data(u8 *data);
void process_outer_sensor_data(u8 *data);
void process_hmi_btn_event(u8 page_index, u8 btn_index, u8 value);
/**
* set a single light
*/
void light_set(u8 address, u8 value);
/**
* set all lights
*/
void light_set_all(void);
#endif

Loading…
Cancel
Save