目錄
1、簡(jiǎn)介
2、硬件連接
3、上位機(jī)源碼
3.1?widget.h
3.2?widget.c?
3.3?顯示圖
?4、下位機(jī)源碼
4.1 cubemax配置
?4.2 keil源碼
1、簡(jiǎn)介
本文使用STM32F103C8T6單片機(jī)使用單片機(jī)通過ESP8266WIFI模塊與QT設(shè)計(jì)的上位機(jī)進(jìn)行通訊,ESP8266設(shè)置AP模式。實(shí)現(xiàn)DHT11傳感器溫濕度的顯示與遠(yuǎn)程控制LED小燈的亮滅。
2、硬件連接
PB9---DHT11(5V)
PA9----RX
PA10---TX
ESP8266(3.3V)
PB0----LED(高電平有效)
3、上位機(jī)源碼
3.1?widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
namespace Ui {
class Widget;
}
#pragma pack(1)
struct QT_info
{
unsigned char Head[2];
uint8_t DHT11_BUF[2];//用于存放DHT11數(shù)據(jù)
};
#pragma pack()
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
//QTcpServer *tcpserver;//聲明一個(gè)QTcpserver的對(duì)象,用于監(jiān)聽
QTcpSocket *tcpsocket;//創(chuàng)建服務(wù)器的套接字,用于與客戶端進(jìn)行通信
private slots:
void on_open_Button_clicked();
void on_close_Button_clicked();
void on_send_Button_clicked();
void connected_Slot();
void readyRead_Slot();
void on_pushButton_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
3.2?widget.c?
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//tcpserver = new QTcpServer(this);
tcpsocket = new QTcpSocket(this);
}
Widget::~Widget()
{
delete ui;
}
//client端的連接服務(wù)器按鈕
void Widget::on_open_Button_clicked()
{
// 根據(jù)輸入的ip和port連接指定的服務(wù)器
// tcpsocket->connectToHost(ui->IP_line->text(),ui->port_line->text().toUShort());
tcpsocket->connectToHost("192.168.4.1",333);
connect(tcpsocket,SIGNAL(connected()),this,SLOT(connected_Slot()));
if(tcpsocket->waitForConnected(1000) == true){
tcpsocket->write("Q");
}
}
void Widget::connected_Slot()
{
connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));
}
void Widget::readyRead_Slot()
{
QByteArray mytemp = tcpsocket->readAll();
//ui->rece_TextEdit->appendPlainText(tcpsocket->readAll());
if(!mytemp.isEmpty()){
ui->rece_T_Edit->clear();
ui->rece_S_Edit->clear();
struct QT_info* info_RX = (struct QT_info*)mytemp.data(); // unsigned char *
if(info_RX->Head[0]==0x55 && info_RX->Head[1]==0xFF) {
QString T = QString::asprintf("%.2d",info_RX->DHT11_BUF[1]);
QString S = QString::asprintf("%2d",info_RX->DHT11_BUF[0]);
ui->rece_T_Edit->insertPlainText(T);
ui->rece_S_Edit->insertPlainText(S);
}
mytemp.clear();
}
}
void Widget::on_close_Button_clicked()
{
tcpsocket->write("B");
tcpsocket->close();
ui->rece_T_Edit->clear();
ui->rece_S_Edit->clear();
}
void Widget::on_send_Button_clicked()
{
// tcpsocket->write(ui->send_line->text().toLocal8Bit().data());
tcpsocket->write("Q");
}
void Widget::on_pushButton_clicked()
{
tcpsocket->write("B");
}
3.3?顯示圖
?4、下位機(jī)源碼
4.1 cubemax配置
?GPIO配置。
?串口配置,中斷打開。
?4.2 keil部分源碼
func
#include "func.h"
struct QT_info QT_info_TX;
extern char buf;
uint16_t len;
void CSH(void)
{
len = sizeof(QT_info_TX);
DHT11_Init();//傳感器芯片初始化
DHT11_ReadData(QT_info_TX.DHT11_BUF);//讀出DHT11傳感器數(shù)據(jù)(參數(shù)是存放數(shù)據(jù)的數(shù)組指針)
HAL_Delay(200);
//1 工作在路由模式
printf("AT+CWMODE=2\r\n");
HAL_Delay(200);
//2 使能多鏈接
printf("AT+CIPMUX=1\r\n");
HAL_Delay(200);
//3 建立TCPServer port = 333
printf("AT+CIPSERVER=1\r\n");
HAL_Delay(200);
LED_OFF;
QT_info_TX.Head[0]=0x55;
QT_info_TX.Head[1]=0xFF;
}
void oled_ui(void)
{
DHT11_ReadData(QT_info_TX.DHT11_BUF);//讀出DHT11傳感器數(shù)據(jù)(參數(shù)是存放數(shù)據(jù)的數(shù)組指針)
HAL_Delay(100);
HAL_UART_Receive_IT(&huart1, (uint8_t *)&buf, 1);
//發(fā)送數(shù)據(jù)
printf("AT+CIPSEND=0,%d\r\n",len);
HAL_Delay(200);
HAL_UART_Transmit(&huart1,(uint8_t *)&QT_info_TX,sizeof(QT_info_TX),10);
}
#include "main.h"
#include "dht11.h"
#include "usart.h"
#include "string.h"
void CSH(void);
void alarm(void);
void oled_ui(void);
void Qt_UART_RxCallBack(unsigned char *Data,unsigned int Len);
__packed struct QT_info
{
unsigned char Head[2];
uint8_t DHT11_BUF[2];//用于存放DHT11數(shù)據(jù)
};
main
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2023 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 "i2c.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
char buf;
#include "func.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//涓插彛涓柇鍥炶皟鍑芥暟
{
if(huart1.Instance == USART1)
{
if(buf == 'Q')
{
LED_ON;
HAL_UART_Receive_IT(&huart1, (uint8_t *)&buf, 1);
}
else if(buf == 'B')
{
LED_OFF;
HAL_UART_Receive_IT(&huart1, (uint8_t *)&buf, 1);
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&buf, 1);
}
}
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 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_USART1_UART_Init();
MX_I2C1_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
CSH();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
oled_ui();
// printf("1\r\n");
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @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();
}
}
/* USER CODE BEGIN 4 */
/* 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 */
dht11
/*
* dht11.c
*
* Created on: Oct 21, 2021
* Author: Administrator
*/
/*
//杜洋工作室出品
//洋桃系列開發(fā)板應(yīng)用程序
//關(guān)注微信公眾號(hào):洋桃電子
//洋桃開發(fā)板資料下載 www.DoYoung.net/YT
//即可免費(fèi)看所有教學(xué)視頻,下載技術(shù)資料,技術(shù)疑難提問
//更多內(nèi)容盡在 杜洋工作室主頁(yè) www.doyoung.net
*/
/*
《修改日志》
1-201708202309 創(chuàng)建。
*/
#include "dht11.h"
#include "main.h"
void DHT11_IO_OUT (void){ //端口變?yōu)檩敵? GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = DHT11_DA_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void DHT11_IO_IN (void){ //端口變?yōu)檩斎? GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = DHT11_DA_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void DHT11_RST (void){ //DHT11端口復(fù)位,發(fā)出起始信號(hào)(IO發(fā)送)
DHT11_IO_OUT();
HAL_GPIO_WritePin(GPIOB,DHT11_DA_Pin, GPIO_PIN_RESET);
HAL_Delay(20); //拉低至少18ms
HAL_GPIO_WritePin(GPIOB,DHT11_DA_Pin, GPIO_PIN_SET);
delay_us(30); //主機(jī)拉高20~40us
}
uint8_t Dht11_Check(void){ //等待DHT11回應(yīng),返回1:未檢測(cè)到DHT11,返回0:成功(IO接收)
uint8_t retry=0;
DHT11_IO_IN();//IO到輸入狀態(tài)
while (HAL_GPIO_ReadPin(GPIOB,DHT11_DA_Pin)&&retry<100){//DHT11會(huì)拉低40~80us
retry++;
delay_us(1);
}
if(retry>=100)return 1; else retry=0;
while (!HAL_GPIO_ReadPin(GPIOB,DHT11_DA_Pin)&&retry<100){//DHT11拉低后會(huì)再次拉高40~80us
retry++;
delay_us(1);
}
if(retry>=100)return 1;
return 0;
}
uint8_t Dht11_ReadBit(void){ //從DHT11讀取一個(gè)位 返回值:1/0
uint8_t retry=0;
while(HAL_GPIO_ReadPin(GPIOB,DHT11_DA_Pin)&&retry<100){//等待變?yōu)榈碗娖? retry++;
delay_us(1);
}
retry=0;
while(!HAL_GPIO_ReadPin(GPIOB,DHT11_DA_Pin)&&retry<100){//等待變高電平
retry++;
delay_us(1);
}
delay_us(40);//等待40us //用于判斷高低電平,即數(shù)據(jù)1或0
if(HAL_GPIO_ReadPin(GPIOB,DHT11_DA_Pin))return 1; else return 0;
}
uint8_t Dht11_ReadByte(void){ //從DHT11讀取一個(gè)字節(jié) 返回值:讀到的數(shù)據(jù)
uint8_t i,dat;
dat=0;
for (i=0;i<8;i++){
dat<<=1;
dat|=Dht11_ReadBit();
}
return dat;
}
uint8_t DHT11_Init (void){ //DHT11初始化
DHT11_RST();//DHT11端口復(fù)位,發(fā)出起始信號(hào)
return Dht11_Check(); //等待DHT11回應(yīng)
}
uint8_t DHT11_ReadData(uint8_t *h){ //讀取一次數(shù)據(jù)//濕度值(十進(jìn)制,范圍:20%~90%) ,溫度值(十進(jìn)制,范圍:0~50°),返回值:0,正常;1,失敗
uint8_t buf[5];
uint8_t i;
DHT11_RST();//DHT11端口復(fù)位,發(fā)出起始信號(hào)
if(Dht11_Check()==0){ //等待DHT11回應(yīng)
for(i=0;i<5;i++){//讀取5位數(shù)據(jù)
buf[i]=Dht11_ReadByte(); //讀出數(shù)據(jù)
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){ //數(shù)據(jù)校驗(yàn)
*h=buf[0]; //將濕度值放入指針1
h++;
*h=buf[2]; //將溫度值放入指針2
}
}else return 1;
return 0;
}
//===============================================us延時(shí)函數(shù)
void delay_us(uint32_t us)//主頻72M
{
uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
while (delay--)
{
;
}
}
/*********************************************************************************************
* 杜洋工作室 www.DoYoung.net
* 洋桃電子 www.DoYoung.net/YT
*********************************************************************************************/
#ifndef __DHT11_H
#define __DHT11_H
#include "stm32f1xx_hal.h"
void DHT11_IO_OUT (void);
void DHT11_IO_IN (void);
void DHT11_RST (void);
uint8_t Dht11_Check(void);
uint8_t Dht11_ReadBit(void);
uint8_t Dht11_ReadByte(void);
uint8_t DHT11_Init (void);
uint8_t DHT11_ReadData(uint8_t *h);
void delay_us(uint32_t us);
#endif
?文章來源地址http://www.zghlxwxcb.cn/news/detail-461009.html文章來源:http://www.zghlxwxcb.cn/news/detail-461009.html
?
到了這里,關(guān)于STM32+ESP8266+QT客戶端上位機(jī)顯示DHT11溫濕度與點(diǎn)燈的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!