当前位置:   article > 正文

STM32实现简单的智能家居系统

STM32实现简单的智能家居系统

智能家居系统是基于无线通信技术和智能控制技术,将家居设备与互联网结合起来,实现远程控制、智能化管理的系统。本文将以STM32微控制器为核心,通过编写代码来实现一个简单的智能家居系统。

一、硬件准备

  1. STM32开发板:本文以STM32F103C8T6为例;
  2. 无线通信模块:本文以nRF24L01无线模块为例;
  3. 温湿度传感器:本文以DHT11温湿度传感器为例;
  4. 继电器模块:本文以单路继电器模块为例;
  5. 光敏电阻:本文以光敏电阻GL5528为例;
  6. 人体红外传感器:本文以人体红外传感器HC-SR501为例。

二、软件准备

  1. STM32CubeMX:用于生成初始化代码;
  2. Keil MDK:用于开发和编译代码。

三、项目搭建

  1. 创建一个新的STM32CubeMX项目,选择合适的STM32型号;
  2. 配置系统时钟源,选择外部晶体振荡器并设置合适的频率;
  3. 配置GPIO引脚,将无线模块、传感器和继电器模块分别连接到STM32开发板上的合适引脚;
  4. 配置SPI和USART串口,用于与无线模块进行通信;
  5. 生成代码并导入Keil MDK中,开始编写代码。

四、代码实现

  1. 初始化代码 首先,在main函数中初始化各个外设,包括GPIO、SPI和USART。以下代码为初始化SPI和USART的代码片段:
  1. /* SPI2 init function */
  2. static void MX_SPI2_Init(void)
  3. {
  4. /* SPI2 parameter configuration*/
  5. hspi2.Instance = SPI2;
  6. hspi2.Init.Mode = SPI_MODE_MASTER;
  7. hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  8. hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  9. hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  10. hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
  11. hspi2.Init.NSS = SPI_NSS_SOFT;
  12. hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  13. hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  14. hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  15. hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  16. hspi2.Init.CRCPolynomial = 10;
  17. if (HAL_SPI_Init(&hspi2) != HAL_OK)
  18. {
  19. Error_Handler();
  20. }
  21. }
  22. /* USART1 init function */
  23. static void MX_USART1_UART_Init(void)
  24. {
  25. /* USART1 parameter configuration*/
  26. huart1.Instance = USART1;
  27. huart1.Init.BaudRate = 115200;
  28. huart1.Init.WordLength = UART_WORDLENGTH_8B;
  29. huart1.Init.StopBits = UART_STOPBITS_1;
  30. huart1.Init.Parity = UART_PARITY_NONE;
  31. huart1.Init.Mode = UART_MODE_TX_RX;
  32. huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  33. huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  34. if (HAL_UART_Init(&huart1) != HAL_OK)
  35. {
  36. Error_Handler();
  37. }
  38. }

  1. 温湿度传感器读取代码 使用GPIO来读取DHT11传感器的数据,然后通过串口发送给主控制器。以下代码为读取温湿度传感器数据的函数:
  1. void DHT11_Read(uint8_t *pData)
  2. {
  3. uint8_t i, j;
  4. // 发送起始信号
  5. HAL_GPIO_WritePin(DHT11_GPIO_Port, DHT11_Pin, GPIO_PIN_RESET);
  6. HAL_Delay(20);
  7. HAL_GPIO_WritePin(DHT11_GPIO_Port, DHT11_Pin, GPIO_PIN_SET);
  8. HAL_Delay(30);
  9. // 等待DHT11响应
  10. if (HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_RESET)
  11. {
  12. while (HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_RESET);
  13. while (HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET);
  14. // 接收40位数据
  15. for (i = 0; i < 5; i++)
  16. {
  17. for (j = 0; j < 8; j++)
  18. {
  19. while (HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_RESET);
  20. HAL_Delay(40);
  21. if (HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET)
  22. {
  23. pData[i] |= 1 << (7 - j);
  24. }
  25. while (HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET);
  26. }
  27. }
  28. }
  29. }

  1. 无线通信代码 使用SPI和nRF24L01无线模块进行通信。以下代码为发送数据和接收数据的函数:
  1. void nRF24L01_Write(uint8_t *pData, uint8_t len)
  2. {
  3. HAL_GPIO_WritePin(nRF24L01_CE_GPIO_Port, nRF24L01_CE_Pin, GPIO_PIN_RESET);
  4. HAL_SPI_Transmit(&hspi2, pData, len, 100);
  5. HAL_GPIO_WritePin(nRF24L01_CE_GPIO_Port, nRF24L01_CE_Pin, GPIO_PIN_SET);
  6. }
  7. void nRF24L01_Read(uint8_t *pData, uint8_t len)
  8. {
  9. HAL_GPIO_WritePin(nRF24L01_CE_GPIO_Port, nRF24L01_CE_Pin, GPIO_PIN_RESET);
  10. HAL_SPI_Receive(&hspi2, pData, len, 100);
  11. HAL_GPIO_WritePin(nRF24L01_CE_GPIO_Port, nRF24L01_CE_Pin, GPIO_PIN_SET);
  12. }

  1. 继电器控制代码 使用GPIO控制继电器的打开和关闭。以下代码为控制继电器的函数:
  1. void Relay_On(void)
  2. {
  3. HAL_GPIO_WritePin(Relay_GPIO_Port, Relay_Pin, GPIO_PIN_SET);
  4. }
  5. void Relay_Off(void)
  6. {
  7. HAL_GPIO_WritePin(Relay_GPIO_Port, Relay_Pin, GPIO_PIN_RESET);
  8. }

  1. 光敏电阻和人体红外传感器代码 使用ADC读取光敏电阻的值,判断光照强度;使用GPIO读取人体红外传感器的值,判断是否有人经过。以下代码为读取光敏电阻和人体红外传感器的函数:
  1. uint16_t Read_Light(void)
  2. {
  3. HAL_ADC_Start(&hadc1);
  4. HAL_ADC_PollForConversion(&hadc1, 100);
  5. return HAL_ADC_GetValue(&hadc1);
  6. }
  7. uint8_t Read_PIR(void)
  8. {
  9. return HAL_GPIO_ReadPin(PIR_GPIO_Port, PIR_Pin);
  10. }

  1. 主控制器代码 在主控制器中,可以使用串口接收指令来控制继电器的打开和关闭,同时也可以接收传感器数据,并进行相应的处理。以下代码为主控制器的代码:
  1. int main(void)
  2. {
  3. HAL_Init();
  4. MX_GPIO_Init();
  5. MX_SPI2_Init();
  6. MX_USART1_UART_Init();
  7. MX_ADC1_Init();
  8. uint8_t data[5]; // 存储温湿度数据
  9. uint8_t buffer[5]; // 存储从无线模块接收的数据
  10. // 主循环
  11. while (1)
  12. {
  13. // 读取温湿度传感器数据
  14. DHT11_Read(data);
  15. // 发送温湿度数据到无线模块
  16. nRF24L01_Write(data, sizeof(data));
  17. // 接收从无线模块发送来的数据
  18. nRF24L01_Read(buffer, sizeof(buffer));
  19. // 判断是否接收到继电器控制指令
  20. if (buffer[0] == 0x01)
  21. {
  22. if (buffer[1] == 0x01)
  23. {
  24. Relay_On();
  25. }
  26. else if (buffer[1] == 0x00)
  27. {
  28. Relay_Off();

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号