/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "onchip_conf.h"
#include "driver_conf.h"
/* Private includes ----------------------------------------------------------*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
#define USER_UART3 2 //0-无APP 1-蓝牙通信 2-WIFI通信
/* Private variables ---------------------------------------------------------*/
/*object*/
c_hx711 hx711; //定义 hx711 结构体变量
c_servo servo; //定义 servo 舵机结构体变量
c_my_gpio led; //创建 LED灯 控制结构体
c_esp8266 esp8266; //创建 ESP8266 控制结构体
/*variables*/
static float hx711_weight; //定义变量用于保存 hx711 获取到的重量
static char tx_buf[64]; //定义数组用于保存待发送的内容
static char rec_buf[64]; //定义数组用来接受串口数据
static uint8_t servo_flag=0; //舵机标志位
/* Private user code ---------------------------------------------------------*/
/*callback*/
int my_exti_callback(const char* key_name, uint8_t key_state)
{
if((strstr(key_name, "key1") != NULL)&&(key_state==1)){
servo_flag=!servo_flag;
if(servo_flag) servo.set(&servo, 70);
else servo.set(&servo, 0);
}
if((strstr(key_name, "inf") != NULL)&&(key_state==1)){
servo.set(&servo, 0);
servo_flag=0;
}
else if((strstr(key_name, "inf") != NULL)&&(key_state==0)){
servo.set(&servo, 70);
servo_flag=1;
}
}
//接受数据处理函数
void User_UART3(){
char *pxIndex; //定义变量用于暂存分解得到的字符
if(strstr(rec_buf, "AT+DATA1") != NULL){ //判断数据包内是否含有包头
pxIndex = strtok(rec_buf, "=");
pxIndex = strtok(NULL, ",");
servo_flag = atoi(pxIndex);
if(servo_flag) servo.set(&servo, 70);
else servo.set(&servo, 0);
}
}
int esp8266_recive_callback(void* param, char* key, char *value)
{
//对数据长度进行判断,超过64的认为是乱码,干扰
if(strlen(value) < 64){
memset(rec_buf, 0, sizeof(rec_buf));
memcpy(rec_buf, value, strlen(value));
}
User_UART3();
return R_OK;
}
void bluetooth_interrupt(void* param, uint8_t* data, uint16_t data_len)
{
/*对数据长度进行判断,超过64的认为是乱码,干扰,不超过就保存到数组rec_buf中*/
if(data_len < 64){
memset(rec_buf, 0, sizeof(rec_buf)); //清空rec_buf
memcpy(rec_buf, data, data_len); //将data的内容拷贝到rec_buf中
}
char *pxIndex; //定义变量用于暂存分解得到的字符
if(strstr(rec_buf,"\r\n") != NULL){ //判断数据包内是否含有结束符
User_UART3();
}
}
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init(); // Device header
/* Configure the system clock */
SystemClock_Config();
/* 延时100ms 等待时钟信号稳定 */
DelayMs(100);
/*init*/
hx711 = hx711_create(GPIOB, GPIO_PIN_6, GPIOB, GPIO_PIN_7); //初始化 hx711 称重传感器
hx711.zero(&hx711); //hx711 校准
servo = servo_create(TIM_ID3, TIM_CHN3); //初始化 servo 舵机
servo.set(&servo, 0);
led = my_gpio_create(GPIOA, GPIO_PIN_6, GPIO_OUT); //初始化 LED 用到的GPIO
exti_list_t exti_list[] = { //创建外部中断列表
/*exti_list*/
{"key1",GPIOC, GPIO_PIN_15, MY_EXTI_FALLING}, //按键1, 下降沿触发,默认为高电平
{"inf1",GPIOA, GPIO_PIN_0, MY_EXTI_FALLING}, //按键2, 上升沿触发,默认为低电平
};
my_exti.init(exti_list, sizeof(exti_list)/sizeof(exti_list_t), my_exti_callback); //创建按键回调函数
if(USER_UART3 == 1){
my_uart.init(MY_UART3, 115200, UART_MODE_DMA); //初始化 蓝牙模块 用到的串口
my_uart.register_callback(MY_UART3, bluetooth_interrupt, NULL); //注册 蓝牙模块 的串口中断接收处理函数
}else if(USER_UART3 == 2){
//AP-TCP 模式
esp8266 = esp8266_creat(MY_UART3, //选择串口3
AP_TCP, //工作模式: STA + MQTT + ONENET
"", //产品ID
"", //设备名
"");
esp8266.set_recive_callback(&esp8266, esp8266_recive_callback, NULL);
}
/*Infinite loop*/
static uint32_t sys_cnt;
while (1)
{
if(sys_cnt%500==0)
{
sys_cnt = 0;
hx711.get(&hx711, &hx711_weight); //获取垃圾重量
if(hx711_weight>3500) led.set(&led, 1); //垃圾超重灯光提醒
else led.set(&led, 0);
if(USER_UART3 == 1){ //通过蓝牙向APP发送数据
//通过串口给APP发送参数信息
memset(tx_buf, 0, sizeof(tx_buf));
sprintf(tx_buf,"AT+DATA1=%.1f,\r\n",hx711_weight);
my_uart.send(MY_UART3,(uint8_t*)tx_buf,strlen(tx_buf));
}
else if(USER_UART3==2){ //通过WIFI向APP发送数据
if(esp8266.state(&esp8266) == ESP8266_TCP_CONNECTED){
memset(tx_buf, 0, sizeof(tx_buf));
sprintf(tx_buf,"AT+DATA1=%.1f,\r\n",hx711_weight);
esp8266.send(&esp8266, tx_buf);
}
}
}
/*运行系统周期任务*/
my_systick.period_task_running();
sys_cnt++;
HAL_Delay(1);
}
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}