Soluzione HMI intelligente basata su sensori per il monitoraggio ambientale

Questo progetto realizza il monitoraggio in tempo reale della temperatura dell'aria, dell'umidità del suolo e dell'intensità della luce nell'ambiente del suolo e viene visualizzato attraverso il STONE schermata di visualizzazione della porta seriale. Soluzione HMI intelligente basata su sensori per il monitoraggio ambientale.

STONE lo schermo di visualizzazione della porta seriale può controllare immediatamente vari controlli e finestre sullo schermo inviando istruzioni tramite la porta seriale. I controlli delle curve vengono aggiunti anche alla GUI di questo progetto esterno, che possono facilitare l'analisi dei dati a lungo termine e il confronto dei dati per gli utenti.

Preparazione hardware:

  1. 3.5 pollici STONE schermata di visualizzazione della porta seriale
  2. STM32f103c8t6
  3. Simulatore JLINK
  4. Sensore di temperatura e umidità
  5. Sensore di luce
  6. Sensore di umidità del suolo

Preparazione del software:

  1. STONE Designer
  2. STM32 CubeMX
  3. Keil uVision5

Soluzione HMI intelligente basata su sensori per il processo di produzione della GUI di monitoraggio ambientale:

1. Per il nuovo progetto GUI, è necessario selezionare la terza opzione in base alle dimensioni dello schermo. Questo progetto utilizza uno schermo da 3.5 pollici, quindi la risoluzione è 320 * 240.

STM e progettazione del monitoraggio ambientale basato su sensori (1)

2. Quindi posizionare i controlli e aggiungere l'immagine di sfondo. Il controllo del pulsante, il controllo dell'etichetta, il controllo della visualizzazione del grafico e il controllo dell'immagine vengono utilizzati principalmente in questo progetto. Il processo di progettazione è semplice e facile da usare. Ci sono due pulsanti sul lato sinistro della home page. Uno è passare alla pagina di visualizzazione dei parametri in tempo reale e l'altro è la pagina di registrazione dei dati settimanali.

Durante la progettazione, basta trascinare il controllo del pulsante nella barra di controllo in alto nell'area di disegno centrale, quindi modificare alcune immagini di sfondo o premere gli effetti nell'area degli attributi a destra in base alle proprie esigenze, l'espressione sorridente è che il controllo dell'immagine viene anche trascinato al centro, quindi le proprietà vengono modificate. L'effetto è il seguente:

STM e progettazione del monitoraggio ambientale basato su sensori (7)

3. Quindi fare clic con il pulsante destro del mouse sul nome del progetto nell'area del progetto a sinistra per creare una nuova finestra vuota

STM e progettazione del monitoraggio ambientale basato su sensori (7)

4. Le fasi di progettazione della pagina precedente completano il posizionamento di alcuni controlli etichetta e controlli immagine. Gli effetti sono i seguenti:

STM e progettazione del monitoraggio ambientale basato su sensori (7)

5. Nella terza pagina viene inserito un controllo di visualizzazione grafico e l'effetto è il seguente:

STM e progettazione del monitoraggio ambientale basato su sensori (7)

6. Dopo aver progettato il progetto, fare clic sul pulsante scarica sotto il menu di debug nell'angolo in alto a sinistra, quindi selezionare la directory di output in base al prompt. Il software genererà automaticamente i file di sistema. Gli effetti sono i seguenti:

STM e progettazione del monitoraggio ambientale basato su sensori (7)

STM e progettazione del monitoraggio ambientale basato su sensori (7)

STM e progettazione del monitoraggio ambientale basato su sensori (7)

7. È possibile aggiornare l'effetto nell'unità flash USB scaricandolo nella cartella predefinita sulla porta USB e quindi inviandolo come segue:

STM e progettazione del monitoraggio ambientale basato su sensori (7)

Soluzione HMI intelligente basata su sensori per il monitoraggio ambientale Processo di creazione del programma:

1. Aprire il software stm32cubemx, selezionare il modello MCU come stm32f103c8t6, ​​quindi configurare prima la sorgente di clock esterna ad alta e bassa velocità per la selezione RCC, quindi configurare l'albero del clock, utilizzare l'oscillatore a cristallo esterno ad alta velocità e il la modulazione di frequenza massima è 72m L'effetto è il seguente:

STM e progettazione del monitoraggio ambientale basato su sensori (7)

STM e progettazione del monitoraggio ambientale basato su sensori (7)

2. Quindi apri la porta di debug e l'effetto è il seguente:

STM e progettazione del monitoraggio ambientale basato su sensori (7)

3. Quindi configurare la porta seriale, selezionare qui usart1 e la modalità asincrona, aggiungere i canali DMA rispettivamente per TX e Rx, quindi attivare l'interrupt globale di usart1. Altri attributi sono predefiniti e l'effetto è il seguente:

STM e progettazione del monitoraggio ambientale basato su sensori (7)

 

STM e progettazione del monitoraggio ambientale basato su sensori (7)

4. Quindi configurare ADC per raccogliere il valore pubblicitario del sensore di umidità del suolo e del sensore fotosensibile. Questi due sensori sono nell'intervallo di alimentazione di 3.3 v-5 v e il segnale di uscita è un segnale analogico. Pertanto, apri due canali pubblicitari per ricevere i dati. Qui, apri in1 e in2 di ADC1. Non utilizzare DMA e leggere i dati in modalità intermittente + scansione. In questa configurazione, prestare attenzione ad aprire la modalità di conversione discontinua e impostare il numero di canali su 2.

STM e progettazione del monitoraggio ambientale basato su sensori (7)

5. Il modulo DHT11 viene utilizzato per l'acquisizione della temperatura e per pilotarlo è necessario un segnale in microsecondi. È quindi possibile configurare un timer da 1MHz tramite il timer TIM2. Secondo la precedente configurazione dell'orologio, gli orologi del timer sono 72 mhz sul bus apb2, quindi la frequenza prescalata qui è 72-1 = 71 e il valore di sovraccarico è impostato al massimo 65535. Gli effetti sono i seguenti:

STM e progettazione del monitoraggio ambientale basato su sensori (7)

6. Quindi impostare la configurazione dell'output, selezionare MDK, versione V5 e generare il codice. L'effetto è il seguente:

STM e progettazione del monitoraggio ambientale basato su sensori (7)

7. Dopo aver generato il progetto, sono presenti due cartelle nella directory principale del percorso di output. Inc archivia il file di intestazione e Src archivia il file di origine. Possiamo aggiungere il file di libreria del file STONE schermata della porta seriale qui per facilitare l'interazione tra le istruzioni e lo schermo. La directory è la seguente:

STM e progettazione del monitoraggio ambientale basato su sensori (7)

8. Il file della libreria di STONE ha un link sul sito ufficiale. Entra nel sito ufficiale di STONE prima, quindi fare clic sull'indirizzo di collegamento della libreria della porta seriale in basso a sinistra nella figura seguente, come segue:

STM e progettazione del monitoraggio ambientale basato su sensori (7)

9. Nella nuova pagina, puoi vedere le stesse cartelle Inc e SRC, oltre ad alcuni esempi e istruzioni. Quindi migrare la libreria al progetto locale secondo i passaggi del documento di istruzioni, collegarsi come segue:

Biblioteca

10. Poiché non è impostato per generare file indipendenti per ciascuna periferica durante la configurazione di stm32cubemx, anche la configurazione della periferica è in C principale, quindi main è allegata direttamente alla fine C. contenuto del documento:

Design HMI per codice di monitoraggio ambientale:

/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file           : main.c
* @brief          : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2022 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"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "dht11.h"
#include "STONE.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
extern unsigned char transport_over_flage;
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim2;
UART_HandleTypeDef huart1;
DMA_HandleTypeDef hdma_usart1_tx;
DMA_HandleTypeDef hdma_usart1_rx;
/* USER CODE BEGIN PV */
uint8_t hal_tim1_flag;
uint32_t ADC_Value[2];
float ad1,ad2;
int ad2_32;
uint16_t temperature;
uint16_t humidity;
char humi_text[3],temp_text[4];
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_DMA_Init(void);
static void MX_TIM2_Init(void);
/* USER CODE BEGIN PFP */
void delay_us(uint16_t us);
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int humi_calc(int value){
int reference_value,value2;
reference_value = 3299;
value2 = reference_value - value;
if (value2 > 0)
{
div_t a = div(value2, 20);
if(a.quot>=100)return 100;
return a.quot;
}
else return 0;
}
/* USER CODE END 0 */
/**
* @brief  The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
MX_DMA_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start(&hadc1);
// HAL_TIM_Base_Start_IT(&htim1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while(DHT11_Init()){
HAL_Delay(500);
}
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);
for(uint8_t i=0;i<2;i++)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,0xffff);
ADC_Value[i]=HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
DHT11_Read_Data(&temperature,&humidity);
ad1 = (float)(ADC_Value[0]&0xFFF)*3.3/4096;
ad2 = (float)(ADC_Value[1]&0xFFF)*3.3/4096;
ad2_32=ad2*1000+0.5;
ad2_32=humi_calc(ad2_32);
sprintf(humi_text,"%d",ad2_32);
sprintf(temp_text,"%d",temperature>>8);
if(ad1<2)
set_text("label", "light", "light");
if(ad1>2)
set_text("label", "light", "lightless");
set_text("label", "humi", humi_text);
set_text("label", "temp", temp_text);
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {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();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief ADC1 Initialization Function
* @param None
* @retval None
*/
static void MX_ADC1_Init(void)
{
/* USER CODE BEGIN ADC1_Init 0 */
/* USER CODE END ADC1_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC1_Init 1 */
/* USER CODE END ADC1_Init 1 */
/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = ENABLE;
hadc1.Init.NbrOfDiscConversion = 1;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 2;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = ADC_REGULAR_RANK_2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */
/* USER CODE END ADC1_Init 2 */
}
/**
* @brief TIM2 Initialization Function
* @param None
* @retval None
*/
static void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 65535;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
/* USER CODE END TIM2_Init 2 */
}
/**
* @brief USART1 Initialization Function
* @param None
* @retval None
*/
static void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END USART1_Init 1 */
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;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */
/* USER CODE END USART1_Init 2 */
}
/**
* Enable DMA controller clock
*/
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Channel4_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
/* DMA1_Channel5_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
/*Configure GPIO pin : PA10 */
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PB5 */
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/* USER CODE BEGIN 4 */
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if (STONE_uart_get_flag(USER_UART))
transport_over_flage = 1;
}
void delay_us(uint16_t us){
uint16_t differ = 0xffff-us-5;
__HAL_TIM_SET_COUNTER(&htim2,differ);
HAL_TIM_Base_Start(&htim2);
while(differ < 0xffff-5){
differ = __HAL_TIM_GET_COUNTER(&htim2);
}
HAL_TIM_Base_Stop(&htim2);
}
//void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
//{
//    if (htim == (&htim1)) //1s
//    {
//// DHT11_Read_Data(&temperature,&humidity);
// for(uint8_t i=0;i<2;i++)
//      {
//          HAL_ADC_Start(&hadc1);
//          HAL_ADC_PollForConversion(&hadc1,0xffff);
//          ADC_Value[i]=HAL_ADC_GetValue(&hadc1);
//      }
// HAL_ADC_Stop(&hadc1);
// ad1 = (float)(ADC_Value[0]&0xFFF)*3.3/4096;
// ad2 = (float)(ADC_Value[1]&0xFFF)*3.3/4096;
// hal_tim1_flag = 1;
//    }
//}
/* USER CODE END 4 */
/**
* @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 */
}
#ifdef  USE_FULL_ASSERT
/**
* @brief  Reports the name of the source file and the source line number
*         where the assert_param error has occurred.
* @param  file: pointer to the source file name
* @param  line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

Soluzione HMI intelligente basata su sensori per video di monitoraggio ambientale

Carrello
Scorrere fino a Top