From a9b22757ef1e452ab91d92eeeee95c9e832ee96f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zeng=20wei=20=28=E6=9B=BE=E5=A8=81=29?= Date: Fri, 10 May 2024 17:48:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=81=AF=E6=BA=90=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HARDWARE/bufcut.c | 6 ++--- HARDWARE/rs485.c | 57 ++++++++++++++++++++++++++++++----------- HARDWARE/rs485.h | 3 ++- HARDWARE/write.c | 43 ++++++++++++++++++++----------- HARDWARE/write.h | 2 +- USER/main.c | 6 ++++- myfreertos/myfreertos.c | 42 ++++++++++++++++++++++++++---- myfreertos/myfreertos.h | 8 ++++++ 8 files changed, 126 insertions(+), 41 deletions(-) diff --git a/HARDWARE/bufcut.c b/HARDWARE/bufcut.c index 337d11d..cf4a036 100644 --- a/HARDWARE/bufcut.c +++ b/HARDWARE/bufcut.c @@ -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; } } diff --git a/HARDWARE/rs485.c b/HARDWARE/rs485.c index f125ee3..b40d20c 100644 --- a/HARDWARE/rs485.c +++ b/HARDWARE/rs485.c @@ -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; @@ -280,7 +281,7 @@ void RS485_2_Init(u32 bound) NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); - USART_Cmd(USART1, ENABLE); + USART_Cmd(USART1, ENABLE); RS485_2_TX_EN = 0; } @@ -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); // } } diff --git a/HARDWARE/rs485.h b/HARDWARE/rs485.h index 269e099..a34cc26 100644 --- a/HARDWARE/rs485.h +++ b/HARDWARE/rs485.h @@ -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); diff --git a/HARDWARE/write.c b/HARDWARE/write.c index 5730998..51a1ee2 100644 --- a/HARDWARE/write.c +++ b/HARDWARE/write.c @@ -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 diff --git a/HARDWARE/write.h b/HARDWARE/write.h index 4c70225..3e95f11 100644 --- a/HARDWARE/write.h +++ b/HARDWARE/write.h @@ -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); diff --git a/USER/main.c b/USER/main.c index bb28892..74d9e60 100644 --- a/USER/main.c +++ b/USER/main.c @@ -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(); diff --git a/myfreertos/myfreertos.c b/myfreertos/myfreertos.c index da18732..67bd4e7 100644 --- a/myfreertos/myfreertos.c +++ b/myfreertos/myfreertos.c @@ -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; - 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); +} + diff --git a/myfreertos/myfreertos.h b/myfreertos/myfreertos.h index 69c786d..490749d 100644 --- a/myfreertos/myfreertos.h +++ b/myfreertos/myfreertos.h @@ -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