基于阿里云MQTT服务,设计一个STM32的智能光伏控制系统

摘要

这篇文章详细介绍了利用STM32F103C8T6单片机实现光伏发电系统的关键技术。全文分为四章:第一章阐述了光伏发电的背景、意义及应用场景,强调其在绿色能源领域的重要性。第二章介绍了如何通过STM32F103C8T6及光敏电阻和伺服电机实现光线追踪系统,详细描述了硬件选择、连接及使用HAL库编写的单片机程序。第三章讲解了最大功率点追踪(MPPT)的原理,并展示了如何利用STM32F103C8T6和相关传感器、DC-DC转换器实现MPPT功能。第四章描述了如何通过STM32F103C8T6与SIM7600CE 4G模块连接到阿里云MQTT服务,实现设备状态数据的远程传输和控制。本文提供了全面的硬件连接和程序代码示例,为构建高效的光伏发电系统提供了实用指导。

第一章:光伏发电背景、意义及应用场景

1.1 光伏发电的背景

光伏发电(Photovoltaic Power Generation,简称PV)是一种利用光伏效应将太阳能直接转换为电能的技术。随着全球能源需求的不断增长和环境问题的日益严重,寻找清洁、可再生的能源成为人类社会的迫切需求。光伏发电作为一种绿色环保的能源形式,具有重要的战略意义。

光伏发电的历史可以追溯到19世纪,当时法国物理学家Edmond Becquerel首次发现了光电效应。然而,真正意义上的光伏发电技术直到1954年贝尔实验室发明了第一块实用的硅太阳能电池后才开始发展。进入21世纪,光伏技术取得了飞速的发展,光伏电池的效率不断提升,成本逐步下降,使得光伏发电在全球范围内得到广泛应用。

1.2 光伏发电的意义
  1. 环保效益:光伏发电过程不会产生任何污染物,也不会排放温室气体,对环境友好,符合可持续发展的理念。

  2. 能源安全:太阳能资源丰富且分布广泛,不受地理和资源的限制,利用光伏发电可以减少对化石能源的依赖,增强能源安全性。

  3. 经济效益:随着光伏技术的进步和规模化生产,光伏发电的成本逐年降低,已经在许多地区达到了平价上网的水平,具有显著的经济效益。

  4. 社会效益:光伏发电可以促进就业,推动相关产业链的发展,带动经济增长。

1.3 光伏发电的应用场景

光伏发电应用场景广泛,主要包括以下几个方面:

  1. 住宅和商业建筑:在建筑物的屋顶和外墙安装光伏发电系统,可以为建筑物提供清洁能源,降低用电成本。

  2. 光伏电站:大规模光伏电站通常建在荒漠、戈壁等地,利用广阔的土地资源,进行大规模的太阳能发电。

  3. 交通领域:太阳能汽车、太阳能飞机、太阳能船舶等交通工具利用光伏技术,实现清洁能源驱动。

  4. 农业与牧业:在农业生产中,利用光伏系统为灌溉、农产品加工等提供电力;在牧业中,光伏发电可以为偏远地区提供稳定的电力供应。

  5. 偏远地区电力供应:在电网难以覆盖的偏远地区,光伏发电系统可以作为独立电源,为当地居民提供电力。

  6. 公共设施:城市中的路灯、信号灯、监控设备等公共设施可以利用光伏发电,降低能源消耗,提高能源利用效率。


第二章:利用STM32F103实现光线追踪

2.1 光线追踪的概述

光线追踪是光伏发电系统中常见的一种技术,通过实时调整光伏面板的角度,使其始终保持在最佳的光照角度,从而最大限度地提高光伏系统的发电效率。光线追踪系统一般由光传感器、伺服电机、控制器等组成,其中控制器通常采用单片机实现。

2.2 硬件选择

在本项目中,我们选择使用STM32F103C8T6单片机作为控制核心,结合光传感器和伺服电机,实现光线追踪功能。

  • STM32F103C8T6单片机:STM32F103系列单片机具有高性能、低功耗的特点,内置丰富的外设接口,非常适合用于控制类应用。
  • 光传感器:使用4个光敏电阻(如GL5528)放置在十字交叉形状,以检测光线方向。
  • 伺服电机:选择带有PWM控制接口的MG995伺服电机,用于调整光伏面板的角度。
  • 其他组件:包括电源模块(如5V DC电源模块)、连接线、支架等。
2.3 硬件连接
  1. 光传感器连接

    • 光敏电阻1(LDR1)连接到ADC通道1(PA0)。
    • 光敏电阻2(LDR2)连接到ADC通道2(PA1)。
    • 光敏电阻3(LDR3)连接到ADC通道3(PA2)。
    • 光敏电阻4(LDR4)连接到ADC通道4(PA3)。
  2. 伺服电机连接

    • MG995伺服电机的控制信号连接到STM32F103的PWM输出(PA8)。
    • 伺服电机的电源(VCC)连接到5V电源,地(GND)连接到系统地。
2.4 系统架构

光线追踪系统的整体架构如下:

  1. 光传感器模块:检测太阳光的方向和强度,将信号传输给STM32F103。
  2. STM32F103控制器:处理光传感器传来的信号,根据光线方向计算出最佳的面板角度,输出控制信号给伺服电机。
  3. 伺服电机模块:接收STM32F103的控制信号,驱动光伏面板进行角度调整。
2.5 单片机程序设计

利用STM32F103实现光线追踪的单片机程序主要包括以下几个部分:

  1. 初始化:初始化外设接口,包括ADC、PWM、GPIO等。
  2. 光传感器数据采集:通过ADC接口读取光传感器的数据,分析太阳光的方向。
  3. 计算最佳角度:根据光传感器的数据,计算出光伏面板的最佳角度。
  4. 控制伺服电机:通过PWM接口控制伺服电机,调整光伏面板的角度。
  5. 实时更新:持续采集光传感器的数据,实时调整光伏面板的角度。

以下是具体的程序代码示例:

#include "stm32f1xx_hal.h"

// ADC句柄
ADC_HandleTypeDef hadc1;
ADC_HandleTypeDef hadc2;
ADC_HandleTypeDef hadc3;
ADC_HandleTypeDef hadc4;

// 定时器句柄
TIM_HandleTypeDef htim1;

// 初始化ADC
void MX_ADC1_Init(void) {
    __HAL_RCC_ADC1_CLK_ENABLE();
    hadc1.Instance = ADC1;
    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
    HAL_ADC_Init(&hadc1);
}

// 初始化定时器,用于PWM
void MX_TIM1_Init(void) {
    __HAL_RCC_TIM1_CLK_ENABLE();
    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 72 - 1;
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 20000 - 1;
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim1.Init.RepetitionCounter = 0;
    HAL_TIM_PWM_Init(&htim1);

    TIM_OC_InitTypeDef sConfigOC;
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 1500; // 初始化占空比
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
    sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
}

// 设置PWM占空比
void Set_Servo_Angle(uint16_t angle) {
    uint16_t pulse_length = (angle * 2000 / 180) + 1000;
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pulse_length);
}

// 初始化所有ADC
void Init_ADC() {
    MX_ADC1_Init();
    MX_ADC2_Init();
    MX_ADC3_Init();
    MX_ADC4_Init();
}

// 读取ADC值
uint32_t Read_ADC_Value(ADC_HandleTypeDef* hadc) {
    HAL_ADC_Start(hadc);
    HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY);
    uint32_t value = HAL_ADC_GetValue(hadc);
    HAL

_ADC_Stop(hadc);
    return value;
}

int main(void) {
    HAL_Init();
    Init_ADC();
    MX_TIM1_Init();

    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

    while (1) {
        // 读取光传感器数据
        uint32_t adc_value1 = Read_ADC_Value(&hadc1);
        uint32_t adc_value2 = Read_ADC_Value(&hadc2);
        uint32_t adc_value3 = Read_ADC_Value(&hadc3);
        uint32_t adc_value4 = Read_ADC_Value(&hadc4);

        // 根据光传感器数据计算最佳角度
        uint16_t angle = Calculate_Best_Angle(adc_value1, adc_value2, adc_value3, adc_value4);

        // 设置伺服电机角度
        Set_Servo_Angle(angle);

        HAL_Delay(1000);
    }
}

// 计算最佳角度的函数(根据光敏电阻的读数)
uint16_t Calculate_Best_Angle(uint32_t val1, uint32_t val2, uint32_t val3, uint32_t val4) {
    // 简单的光线追踪算法:选择光强较高的一侧进行调整
    if (val1 > val2 && val1 > val3 && val1 > val4) {
        return 0;  // 朝向LDR1的方向
    } else if (val2 > val1 && val2 > val3 && val2 > val4) {
        return 90; // 朝向LDR2的方向
    } else if (val3 > val1 && val3 > val2 && val3 > val4) {
        return 180; // 朝向LDR3的方向
    } else {
        return 270; // 朝向LDR4的方向
    }
}

以上代码展示了如何初始化ADC和PWM接口,读取光传感器数据,计算最佳角度,并通过PWM信号控制伺服电机调整光伏面板角度。


第三章:利用STM32F103实现MPPT

3.1 MPPT概述

最大功率点追踪(Maximum Power Point Tracking,MPPT)是一种优化技术,用于在不同的光照强度和温度条件下,使光伏电池始终工作在最大功率点,以最大化其输出功率。MPPT算法通过实时调节负载,使光伏电池输出电压和电流维持在最佳值,从而提高系统的整体效率。

3.2 硬件选择

在本项目中,利用STM32F103C8T6单片机实现MPPT功能,主要硬件包括:

  • STM32F103C8T6单片机:作为MPPT算法的控制核心。
  • 光伏电池板:提供光伏发电的能源来源。
  • 电压传感器:使用电压传感器(如ZMPT101B)用于实时监测光伏电池的输出电压。
  • 电流传感器:使用电流传感器(如ACS712)用于实时监测光伏电池的输出电流。
  • DC-DC转换器:使用降压型DC-DC转换器模块(如LM2596)实现电压转换和功率调节。
  • 其他组件:包括电源模块(如5V DC电源模块)、连接线等。
3.3 硬件连接
  1. 电压传感器连接

    • ZMPT101B电压传感器输出连接到ADC通道1(PA0)。
  2. 电流传感器连接

    • ACS712电流传感器输出连接到ADC通道2(PA1)。
  3. DC-DC转换器连接

    • 输入端连接到光伏电池板的输出。
    • 输出端连接到负载。
    • 调节端(EN或ADJ)连接到STM32F103的PWM输出(PA8)。
3.4 系统架构

MPPT系统的整体架构如下:

  1. 光伏电池板:提供输入电能。
  2. 电压和电流传感器:检测光伏电池的输出电压和电流,将信号传输给STM32F103。
  3. STM32F103控制器:根据传感器数据,运行MPPT算法,输出控制信号给DC-DC转换器。
  4. DC-DC转换器:根据STM32F103的控制信号,调节输出电压和电流,实现最大功率点追踪。
3.5 单片机程序设计

利用STM32F103实现MPPT的单片机程序主要包括以下几个部分:

  1. 初始化:初始化外设接口,包括ADC、PWM、GPIO等。
  2. 传感器数据采集:通过ADC接口读取电压和电流传感器的数据。
  3. MPPT算法实现:根据传感器数据,运行MPPT算法,计算最佳的电压和电流值。
  4. 控制DC-DC转换器:通过PWM接口控制DC-DC转换器,调节输出电压和电流。
  5. 实时更新:持续采集传感器数据,实时调整输出电压和电流。

以下是具体的程序代码示例:

#include "stm32f1xx_hal.h"

// ADC句柄
ADC_HandleTypeDef hadc1;
ADC_HandleTypeDef hadc2;

// 定时器句柄
TIM_HandleTypeDef htim1;

// 初始化ADC
void MX_ADC1_Init(void) {
    __HAL_RCC_ADC1_CLK_ENABLE();
    hadc1.Instance = ADC1;
    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
    HAL_ADC_Init(&hadc1);
}

void MX_ADC2_Init(void) {
    __HAL_RCC_ADC2_CLK_ENABLE();
    hadc2.Instance = ADC2;
    hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
    hadc2.Init.ContinuousConvMode = DISABLE;
    hadc2.Init.DiscontinuousConvMode = DISABLE;
    hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc2.Init.NbrOfConversion = 1;
    HAL_ADC_Init(&hadc2);
}

// 初始化定时器,用于PWM
void MX_TIM1_Init(void) {
    __HAL_RCC_TIM1_CLK_ENABLE();
    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 72 - 1;
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 20000 - 1;
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim1.Init.RepetitionCounter = 0;
    HAL_TIM_PWM_Init(&htim1);

    TIM_OC_InitTypeDef sConfigOC;
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 1500; // 初始化占空比
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
    sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
}

// 设置PWM占空比
void Set_PWM_DutyCycle(uint16_t duty) {
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty);
}

// 初始化所有ADC
void Init_ADC() {
    MX_ADC1_Init();
    MX_ADC2_Init();
}

// 读取ADC值
uint32_t Read_ADC_Value(ADC_HandleTypeDef* hadc) {
    HAL_ADC_Start(hadc);
    HAL_ADC_PollForConversion(hadc, HAL_MAX_DELAY);
    uint32_t value = HAL_ADC_GetValue(hadc);
    HAL_ADC_Stop(hadc);
    return value;
}

int main(void) {
    HAL_Init();
    Init_ADC();
    MX_TIM1_Init();

    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

    while (1) {
        // 读取电压和电流传感器数据
        uint32_t voltage = Read_ADC_Value(&hadc1);
        uint32_t current = Read_ADC_Value(&hadc2);

        // 运行MPPT算法,计算最佳占空比
        uint16_t duty_cycle = MPPT_Algorithm(voltage, current);

        // 设置DC-DC转换器占空比
        Set_PWM_DutyCycle(duty_cycle);

        HAL_Delay(1000);
    }
}

// MPPT算法实现(例如P&O算法)
uint16_t MPPT_Algorithm(uint32_t voltage, uint32_t current) {
    static uint32_t prev_power = 

0;
    static uint32_t prev_voltage = 0;
    uint32_t power = voltage * current;
    uint16_t duty_cycle = __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_1);

    if (power > prev_power) {
        if (voltage > prev_voltage) {
            duty_cycle += 10; // 增加占空比
        } else {
            duty_cycle -= 10; // 减少占空比
        }
    } else {
        if (voltage > prev_voltage) {
            duty_cycle -= 10; // 减少占空比
        } else {
            duty_cycle += 10; // 增加占空比
        }
    }

    prev_power = power;
    prev_voltage = voltage;

    return duty_cycle;
}

以上代码展示了如何初始化ADC和PWM接口,读取电压和电流传感器数据,运行MPPT算法,并通过PWM信号控制DC-DC转换器实现最大功率点追踪。


第四章:利用STM32F103与4G模块连接阿里云MQTT服务

4.1 MQTT概述

MQTT(Message Queuing Telemetry Transport)是一种轻量级的物联网通信协议,特别适用于低带宽、高延迟或不稳定的网络环境。通过MQTT协议,物联网设备可以实现远程数据传输和控制,广泛应用于智能家居、工业控制、智慧城市等领域。

4.2 硬件选择

在本项目中,我们选择使用STM32F103C8T6单片机和4G模块,通过MQTT协议连接到阿里云物联网平台,实现设备状态信息的远程传输和控制。

  • STM32F103C8T6单片机:作为主控芯片,负责数据采集、处理和通信。
  • 4G模块:选择SIM7600CE 4G模块,提供移动网络连接功能。
  • 阿里云物联网平台:作为MQTT服务的云端平台,用于设备数据的接收和处理。
  • 其他组件:包括电源模块(如5V DC电源模块)、连接线等。
4.3 硬件连接
  1. 4G模块连接
    • SIM7600CE的UART接口(TXD、RXD)连接到STM32F103的USART1接口(PA9、PA10)。
    • SIM7600CE的电源(VCC)连接到5V电源,地(GND)连接到系统地。
4.4 系统架构

MQTT系统的整体架构如下:

  1. STM32F103控制器:采集设备数据,通过USART接口与4G模块通信。
  2. 4G模块:通过移动网络连接到阿里云物联网平台,实现数据传输。
  3. 阿里云物联网平台:接收并处理设备数据,通过MQTT协议实现远程控制和监控。
4.5 单片机程序设计

利用STM32F103与4G模块连接阿里云MQTT服务的单片机程序主要包括以下几个部分:

  1. 初始化:初始化外设接口,包括USART、GPIO等。
  2. 4G模块初始化:配置4G模块,连接移动网络。
  3. MQTT连接:通过4G模块连接到阿里云MQTT服务,建立MQTT连接。
  4. 数据采集与发送:采集设备状态数据,通过MQTT协议发送到阿里云。
  5. 远程控制:接收阿里云的控制指令,执行相应操作。

以下是具体的程序代码示例:

#include "stm32f1xx_hal.h"
#include "usart.h"

// USART句柄
UART_HandleTypeDef huart1;

// 初始化USART
void MX_USART1_UART_Init(void) {
    __HAL_RCC_USART1_CLK_ENABLE();
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart1);
}

// 发送AT命令
void Send_AT_Command(char* cmd) {
    HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), HAL_MAX_DELAY);
    HAL_UART_Transmit(&huart1, (uint8_t*)"\r\n", 2, HAL_MAX_DELAY);
}

// 初始化4G模块
void Init_SIM7600CE() {
    Send_AT_Command("AT");
    HAL_Delay(1000);
    Send_AT_Command("AT+CPIN?");
    HAL_Delay(1000);
    Send_AT_Command("AT+CSQ");
    HAL_Delay(1000);
    Send_AT_Command("AT+CREG?");
    HAL_Delay(1000);
    Send_AT_Command("AT+CGATT?");
    HAL_Delay(1000);
    Send_AT_Command("AT+CIPSHUT");
    HAL_Delay(1000);
    Send_AT_Command("AT+CIPMUX=0");
    HAL_Delay(1000);
    Send_AT_Command("AT+CSTT=\"your_apn\",\"\",\"\"");
    HAL_Delay(1000);
    Send_AT_Command("AT+CIICR");
    HAL_Delay(1000);
    Send_AT_Command("AT+CIFSR");
    HAL_Delay(1000);
    Send_AT_Command("AT+CIPSTART=\"TCP\",\"mqtt.aliyun.com\",\"1883\"");
    HAL_Delay(1000);
}

// MQTT连接
void MQTT_Connect() {
    Send_AT_Command("AT+CIPSEND");
    HAL_Delay(1000);
    char connect_msg[] = {0x10, 0x10, 0x00, 0x04, 'M', 'Q', 'T', 'T', 0x04, 0x02, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00};
    HAL_UART_Transmit(&huart1, (uint8_t*)connect_msg, sizeof(connect_msg), HAL_MAX_DELAY);
}

// 发送数据
void MQTT_Publish(char* topic, char* message) {
    Send_AT_Command("AT+CIPSEND");
    HAL_Delay(1000);
    char publish_msg[256];
    uint16_t topic_len = strlen(topic);
    uint16_t msg_len = strlen(message);
    publish_msg[0] = 0x30;
    publish_msg[1] = topic_len + msg_len + 2;
    publish_msg[2] = topic_len >> 8;
    publish_msg[3] = topic_len & 0xFF;
    strcpy(&publish_msg[4], topic);
    strcpy(&publish_msg[4 + topic_len], message);
    HAL_UART_Transmit(&huart1, (uint8_t*)publish_msg, topic_len + msg_len + 4, HAL_MAX_DELAY);
}

int main(void) {
    HAL_Init();
    MX_USART1_UART_Init();

    Init_SIM7600CE();
    MQTT_Connect();

    while (1) {
        // 模拟采集设备数据
        char* device_data = "temperature=25&humidity=60";
        
        // 发送设备数据到阿里云
        MQTT_Publish("your_topic", device_data);

        HAL_Delay(5000); // 每隔5秒发送一次数据
    }
}

以上代码展示了如何初始化USART接口,配置4G模块,建立MQTT连接,并通过MQTT协议发送设备状态数据到阿里云。

  • 92
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值