准备硬件
dht11温湿度监测传感器
oled屏幕
2.2 基本硬件电路
2.2.1电源电路
电源电路
主要功能是将USB接口的5V电源电压通过VIN脚传入芯片,再通过VOUT脚输出转化为3.3V电源电压输出,从而保证STM32 F103 C8T6单片机核心板可以正常的供电,图 7中的C5、C6、C7、C8电容不仅可以阻断直流电的传输,还可以稳定输入输出的电压,防止其波动影响单片机的正常运行,称其为滤波。滤波工作是一项将输入信号输出中某个特定的波段频率干扰滤除后的一种操作,是系统抑制谐波和系统防止谐波干扰发生的一项的重要措施。
2.2.2复位电路
刚开始上电的时候,板上的电流会通过VSS接地,再为C20充电,这时NRST的引脚为低电平。当C20充满电后,C20就处于“断路”的状态,此时的NRST由低变成高电平。
图2.8复位电路
2.2.3时钟电路
图2.9时钟电路
控制流程设计
图2.10 网络温度测量控制系统流程图
软件设计
图3.1 串口通信的界面设计。
图3.2 环境检测的界面设计
系统调试和成果展示
图4.1 Keil5软件调试
图4.2硬件电路板的调试
成果展示
图4.3通电通信后温度的实时数据
图4.4上位机的实时数据
图4.5温湿度过高超出预设值报警
图4.6上位机设定温湿度阈值
图4.7按钮对阈值的设定
本文配套源码 硬件原理图 论文等资料包
Keil5程序
#include "stm32f10x.h"
#include
#include "LED.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "TIM.h"
#include "OLED.h"
#include "key.h"
#include "dht11.h"
int humi_value = 0;
int temp_value = 0;
int humi_max = 40;
inthumi_min = 20;
int temp_max = 35;
int temp_min = 20;
int Temp_flag = 0;
int Humi_flag = 0;
extern int warning;
int main(void)
{
u8 Res;
int key = 0;
u8 dht_data[5] = {0};
int key_flag = 0;
NVIC_Configuration(); /*设置NVIC中断分组2:2位抢占优先级,2位响应优先级*/
delay_init(); ///延时函数初始化
uart_init(115200);
LED_Init();
OLED_Init();
show_info();
key_init();
TIM1_Init();
system_beep();
while(1)
{
if(dht11_read_data(dht_data)) {
humi_value = dht_data[23];/// 1.获取湿度的整数部分
temp_value = dht_data[2];/// 2.获取温度的整数部分
//sprintf((char*)humi_str, "Temp:%d", humi_value);
}
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))
{
Res =USART_ReceiveData(USART1);//读取接受到的数据
if(Res == 'a'){
printf("|:%d:%d:%d:%d:\n",temp_max,temp_min,humi_max,humi_min);
}else if(Res == 'b')
{
temp_max;
}else if(Res == 'c')
{
temp_max--;
show_info();
}else if(Res == 'd')
{
temp_min++;
show_info();
}else if(Res == 'e')
{
temp_min--;
show_info();
}else if(Res == 'f')
{
humi_max
show_info();
}else if(Res == 'g')
{
humi_max--;
show_info();
}else if(Res == 'h')
{
humin++;
show_info();
}else if(Res == 'l')
{
humi_min--;
show_info();
}else if(Res == 'z')
{
warning = 0;
}else if(Res == 'w')
{
warning = 1;
}else if(Res == 'o') ///获取温度
{
printf("o:%d:\n",temp_value);
}else if(Res == 'p') ///获取湿度
printf("p:%d:\n",humi_value);
}
key = key_scan(0);
if(key != 0){
system_beep();
switch(key)
{
case 1:
key_flag;
if(key_flag ==4) {key_flag = 0};
if(key_flag == 0){
OLED_ShowString(3,5,":");
OLED_ShowString(3,13," ");
OLED_ShowString(4,5," ");
OLED_ShowString(4,13," ");
}else if(key_flag == 1)
{
OLED_ShowString(3,5," ");
OLED_ShowString(3,13,":");
OLED_ShowString(4,5," ");
OLED_ShowString(4,13," ");
}else if(key_flag == 2)
{
OLED_ShowString(3,5," ");
OLED_ShowString(3,13," ");
OLED_ShowString(4,5,":");
OLED_ShowString(4,13," ");
}else if(key_flag == 3)
{
OLED_ShowString(3,5," ");
OLED_ShowString(3,13," ");
OLED_ShowString(4,5," ");
OLED_ShowString(4,13,":");
} break;
case 2:
if(key_flag == 0) {
temp_max++;
}else if(key_flag == 1)
{
temp_min++;
}else if(key_flag == 2)
{
humi_max++;
}else if(key_flag == 3)
{
humi_min++;
}printf("|:%d:%d:%d:%d:\n",temp_max,temp_min,humi_max,humi_min; break;
case 3:
if(key_flag == 0){
temp_max--;
}else if(key_flag == 1)
{
temp_min--;
}else if(key_flag == 2)
{
humi_max--;
}else if(key_flag == 3)
{
humi_min--;
}printf("|:%d:%d:%d:%d:\n",temp_max,temp_min,humi_max,humi_min); break;
default:break;
}
}
if((humi_valuehumi_max)){
Humi_LED_ON;
Humi_flag = 1;
}else{
Humi_flag = 0;
Humi_LED_OFF;
}
if((temp_value>temp_max)||(temp_value<>
Temp_LED_ON;
Temp_flag = 1;
}else{
Temp_flag = 0;
Temp_LED_OFF;
}
delay_ms(200);
}
}
二、上位机串口通信程序主函数源代码:
#include "serialport.h"
#include "ui_serialport.h"
#include
SerialPort::SerialPort(QWidget *parent):
QWidget(parent),
ui(new Ui::SerialPort)
{
ui->setupUi(this);
ui->te_recv_text->append(tr("检测到端口列表:"));
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
QSerialPort serial_port;
serial_port.setPort(info);
if (serial_port.open(QIODevice::ReadWrite))
{
ui->cb_com_port->addItem(info.portName());
ui->te_recv_text->append(info.description());
serial_port.close();
}
}
ui->cb_baud_rate->setCurrentIndex(7);//默认115200
ui->pb_open_com->setText(tr("打开串口"));
ui->pb_send->setEnabled(false);
}
SerialPort::~SerialPort()
{
delete ui;
}
void SerialPort::sendInfo(QString info)
{
m_serialport->write(info.toLatin1());
}
void SerialPort::slotReadUsart(void)
{
QByteArray requestData = m_serialport->readAll();
QString str = QString::fromLatin1(requestData);
//qDebug() << "Recv: " <<>
ui->te_recv_text->append(tr(requestData));
emit signalSendInfo(str);
}
void SerialPort::on_pb_send_clicked()
{
QString msg = ui->le_send_text->text();
qDebug() << "Send: " << msg;
m_serialport->write(msg.toLatin1());
}
void SerialPort::on_pb_clear_clicked()
{
ui->te_recv_text->clear();
}
void SerialPort::on_pb_open_com_clicked()
{
if(ui->pb_open_com->text()==tr("打开串口"))
{
m_serialport= new QSerialPort();
m_serialport->setPortName(ui->cb_com_port->currentText());
m_serialport->setBaudRate(ui->cb_baud_rate->currentText().toInt());
switch(ui->cb_crc_test->currentIndex())
{
case 0: m_serialport->setParity(QSerialPort::NoParity);break;
case 1: m_serialport->setParity(QSerialPort::OddParity);break;
case 2: m_serialport->setParity(QSerialPort::EvenParity);break;
default: break;
}
switch(ui->cb_data_bit->currentIndex())
{
case 0: m_serialport->setDataBits(QSerialPort::Data8);break;
case 1: m_serialport->setDataBits(QSerialPort::Data7);break;
case 2: m_serialport->setDataBits(QSerialPort::Data6);break;
default: break;
}
switch(ui->cb_stop_bit->currentIndex())
{
case 0: m_serialport->setStopBits(QSerialPort::OneStop);break;
case 1: m_serialport->setStopBits(QSerialPort::TwoStop);break;
default: break;
}
m_serialport->setFlowControl(QSerialPort::NoFlowControl);
connect(m_serialport,SIGNAL(readyRead()),
this,SLOT(slotReadUsart()));
ui->cb_com_port->setEnabled(false);
ui->cb_baud_rate->setEnabled(false);
ui->cb_crc_test->setEnabled(false);
ui->cb_data_bit->setEnabled(false);
ui->cb_stop_bit->setEnabled(false);
ui->lb_statu_flag->setStyleSheet("background-color:red");
ui->pb_open_com->setText(tr("关闭串口"));
ui->pb_send->setEnabled(true);sendInfo("a");
}else{
m_serialport->clear();
m_serialport->deleteLater();
ui->cb_com_port->setEnabled(true);
ui->cb_baud_rate->setEnabled(true);
ui->cb_crc_test->setEnabled(true);
ui->cb_data_bit->setEnabled(true);
ui->lb_statu_flag->setStyleSheet("background-color:rgb(130,130,130)");
ui->pb_open_com->setText(tr("打开串口"));
ui->pb_send->setEnabled(false);
}
}
void SerialPort::on_pb_beep_clicked()
{
if(ui->pb_beep->text() == "Beep On")
{
m_serialport->write("K");
ui->pb_beep->setText("Beep Off");
}else{
m_serialport->write("W");
ui->pb_beep->setText("Beep On");
}
}
三、上位机环境检测程序:
#include "monitor.h"
#include "ui_monitor.h"
#include
#include
Monitor::Monitor(QWidget *parent):
QWidget(parent),
ui(new Ui::Monitor)
{
ui->setupUi(this);
waring_flag = 0;
m_Tmax = 0;
m_Tmin = 0;
m_Hmax = 0;
m_Hmin = 0;
m_temp = 0;
m_humi = 0;
m_TempWarn.clear();
m_HumiWarn.clear();
m_tempTimer = new QTimer(this);
m_humiTimer = new QTimer(this);
connect(ui->widget,SIGNAL(signalSendInfo(QString)),
this,SLOT(slotSerialInfo(QString)));
connect(m_tempTimer, SIGNAL(timeout()),
this, SLOT(slotTimeOutTemp()));
connect(m_humiTimer, SIGNAL(timeout()),
this, SLOT(slotTimeOutHumi()));
}
Monitor::~Monitor()
{
delete ui;
}
void Monitor::slotSerialInfo(QString str)
{
qDebug()<<>
QStringList list = str.split(":");
if(list.at(0) == "|")
{
m_Tmax = list.at(1).toInt();
m_Tmin = list.at(2).toInt();
m_Hmax = list.at(3).toInt();
m_Hmin = list.at(4).toInt() ;
ui->lcd_humiMaxV->display(m_Hmax);
ui->lcd_humiMinV->display(m_Hmin);
ui->lcd_tempMaxV->display(m_Tmax);
ui->lcd_tempMinV->display(m_Tmin);
}else if(list.at(0) == "o")
{
m_temp = list.at(1).toInt();
ui->lcd_tempV->display(m_temp);
if((m_tempm_Tmax))
{
m_TempWarn = "温度异常";
}else{
m_TempWarn.clear();
}
ui->lb_warn->setText("警告:"+m_TempWarn+" "+m_HumiWarn);
}else if(list.at(0) == "p")
{
m_humi = list.at(1).toInt();
ui->lcd_humiV->display(m_humi);
if((m_humim_Hmax))
{
m_HumiWarn = "湿度异常";
}else{
m_HumiWarn.clear();
}
ui->lb_warn->setText("警告:"+m_TempWarn+" "+m_HumiWarn);
}
}
void Monitor::on_pb_erasure_clicked()
{
if(waring_flag == 0)
{
waring_flag = 1;
ui->pb_erasure->setText("开启");
ui->widget->sendInfo("w");
}else{
waring_flag = 0;
ui->pb_erasure->setText("关闭");
ui->widget->sendInfo("z");
}
}
void Monitor::on_pb_tempMaxVAdd_clicked()
{
m_Tmax++;
ui->lcd_tempMaxV->display(m_Tmax);
ui->widget->sendInfo("b");
}
void Monitor::on_pb_tempMaxVSub_clicked()
{
m_Tmax--;
ui->lcd_tempMaxV->display(m_Tmax);
ui->widget->sendInfo("c");
}
void Monitor::on_pb_tempMinVAdd_clicked()
{
m_Tmin++;
ui->lcd_tempMinV->display(m_Tmin);
ui->widget->sendInfo("d");
}
void Monitor::on_pb_tempMinVSub_clicked()
{
m_Tmin--;
ui->lcd_tempMinV->display(m_Tmin);
ui->widget->sendInfo("e");
}
void Monitor::on_pb_humiMaxVAdd_clicked()
{
m_Hmax++;
ui->lcd_humiMaxV->display(m_Hmax);
ui->widget->sendInfo("f");
}
void Monitor::on_pb_humiMaxVSub_clicked()
{
m_Hmax--;
ui->lcd_humiMaxV->display(m_Hmax);
ui->widget->sendInfo("g");
}
void Monitor::on_pb_humiMinVAdd_clicked()
{
m_Hmin++;
ui->lcd_humiMinV->display(m_Hmin);
ui->widget->sendInfo("h");
}
void Monitor::on_pb_humiMinVSub_clicked()
{
m_Hmin--;
ui->lcd_humiMinV->display(m_Hmin);
ui->widget->sendInfo("l");
}
void Monitor::slotTimeOutTemp(void)
{
ui->widget->sendInfo("o");
}
void Monitor::slotTimeOutHumi(void)
{
ui->widget->sendInfo("p");
}
void Monitor::on_pb_tempStart_clicked()
{
if(m_tempTimer->isActive())
{
m_tempTimer->stop();
ui->pb_tempStart->setText("开启");
}else
{
m_tempTimer->start(ui->sb_tempInterval->value()*1000);
ui->pb_tempStart->setText("停止");
}
}
void Monitor::on_pb_humiStart_clicked()
{
if(m_humiTimer->isActive())
{
m_humiTimer->stop();
ui->pb_humiStart->setText("开启");
}else
{
m_humiTimer->start(ui->sb_humiInterval->value()*1000);
ui->pb_humiStart->setText("停止");
}
}
本文配套源码 硬件原理图 论文等资料包