본문 바로가기

임베디드 시스템반도체 개발자 과정 by 서울기술교육센터/후기

87일차

10월 26일

 

오늘의 목표는 STM32와 QT를 연동하는 것이다.

 

https://components101.com/sensors/dht11-temperature-sensor

 

DHT11–Temperature and Humidity Sensor

DHT11–Temperature and Humidity Sensor

components101.com

serialport를 추가했음.

QT       += core gui
QT       += serialport # Add

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSerialPort/QSerialPort> //추가한 부분
#include <qserialport.h> //추가한 부분
#include <stdio.h> //추가한 부분
#include <QMessageBox> //추가한 부분
#include <QDebug> //추가한 부분
#include <QSerialPortInfo> //추가한 부분

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

window 쪽으로 권한 넘기는 법

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <qserialport.h>
#include <stdio.h>
#include <QMessageBox>
#include <QDebug>
#include <QSerialPortInfo>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    QSerialPort *port; //Add

private slots:
    void on_pushButton_ScanAgain_clicked();
    void textReading();

    void on_pushButton_Open_clicked();

    void on_pushButton_Close_clicked();

    void on_pushButton_Send_clicked();

    void on_pushButton_clear_clicked();

    void on_pushButton_periodSend_clicked();

    void on_checkBox_led_stateChanged(int arg1);

    void on_horizontalSlider_valueChanged(int value);

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //setting speed
    ui->comboBox_Speed->addItem("9600", QSerialPort::Baud9600);
    ui->comboBox_Speed->addItem("115200", QSerialPort::Baud115200);

    //setting data bit
    ui->comboBox_DataBits->addItem("8", QSerialPort::Data8);
    ui->comboBox_DataBits->addItem("7", QSerialPort::Data7);

    //setting parity bit
    ui->comboBox_Parity->addItem("None", QSerialPort::NoParity);
    ui->comboBox_Parity->addItem("Even", QSerialPort::EvenParity);
    ui->comboBox_Parity->addItem("Odd", QSerialPort::OddParity);

    port = new QSerialPort(this);
    QObject::connect(port, SIGNAL(readyRead()), this, SLOT(textReading()));
    on_pushButton_ScanAgain_clicked();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::textReading()
{
    QList <QByteArray> receivedList;
    char tmp_ch[6];
    char wet_ch[6];
    char msg[40];

    while(port->canReadLine())
    {
        receivedList.append(port->readLine()); //[Tmp]25\n까지 읽어서 receive
    }

    for (QByteArray received : receivedList) {
        sprintf(msg, "%s", received.data());
        if(!strncmp(msg, "[Tmp]", strlen("[Tmp]")))
        {
            strcpy(tmp_ch, msg+5);
            int tmp = atoi(tmp_ch);
            ui->lcdNumber_temp->display(tmp);
        }
        else if(!strncmp(msg, "[Wet]", strlen("[Wet]")))
        {
            strcpy(wet_ch, msg+5);
            int wet = atoi(wet_ch);
            ui->lcdNumber_humid->display(wet);
        }
        ui->textEdit_Receive->append(received);
        ui->textEdit_Receive->show();
    }

#if 0
    QByteArray received;

    while(port->canReadLine()) //\n이 존재하면 while 내부 실행
    {
        received = port->readLine(); //\n까지 읽어서 received에 대입
    }
    ui->textEdit_Receive->append(received); //1개씩 추가
    ui->textEdit_Receive->show(); //display

    qDebug() << received;
#endif
}

void MainWindow::on_pushButton_ScanAgain_clicked()
{
    ui->comboBox_Port->clear();
    foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()) {
        ui->comboBox_Port->addItem(serialPortInfo.portName());
    }
}

void MainWindow::on_pushButton_Open_clicked()
{
    port->setPortName(ui->comboBox_Port->currentText());

    if(ui->comboBox_Speed->currentIndex() == 0)
    {
        port->setBaudRate(QSerialPort::Baud9600);
    }
    else if(ui->comboBox_Speed->currentIndex() == 1)
    {
        port->setBaudRate(QSerialPort::Baud115200);
    }

    if(ui->comboBox_DataBits->currentIndex() == 0)
    {
        port->setDataBits(QSerialPort::Data8);
    }
    else if(ui->comboBox_DataBits->currentIndex() == 1)
    {
        port->setDataBits(QSerialPort::Data7);
    }

    if(ui->comboBox_Parity->currentIndex() == 0)
    {
        port->setParity(QSerialPort::NoParity);
    }
    else if(ui->comboBox_Parity->currentIndex() == 1)
    {
        port->setParity(QSerialPort::EvenParity);
    }
    else if(ui->comboBox_Parity->currentIndex() == 2)
    {
        port->setParity(QSerialPort::OddParity);
    }

    if(!port->open(QIODevice::ReadWrite))
    {
        qDebug() << "\n Serial Port Open Error !!!\n";
    }
    else
    {
        qDebug() << "\n Serial Port Open Success !!!\n";
        ui->progressBar->setValue(100);
    }
}

void MainWindow::on_pushButton_Close_clicked()
{
    port->close();
    ui->progressBar->setValue(0);
}

void MainWindow::on_pushButton_Send_clicked()
{
    QByteArray sendData;

    sendData = QString(ui->lineEdit_Send->text() +"\n").toUtf8();
    port->write(sendData.data());

    qDebug() << sendData;
}

void MainWindow::on_pushButton_clear_clicked()
{
    ui->textEdit_Receive->clear();
}

void MainWindow::on_pushButton_periodSend_clicked()
{
    QByteArray sendData;
    if(ui->comboBox_DHT11->currentIndex() == 0)
    {
        sendData = QString("dht11time1500\n").toUtf8();
        port->write(sendData.data());
    }
    else if(ui->comboBox_DHT11->currentIndex() == 1)
    {
        sendData = QString("dht11time2000\n").toUtf8();
        port->write(sendData.data());
    }
    else if(ui->comboBox_DHT11->currentIndex() == 2)
    {
        sendData = QString("dht11time2500\n").toUtf8();
        port->write(sendData.data());
    }
    else if(ui->comboBox_DHT11->currentIndex() == 3)
    {
        sendData = QString("dht11time3000\n").toUtf8();
        port->write(sendData.data());
    }
}

void MainWindow::on_checkBox_led_stateChanged(int arg1)
{
    QByteArray sendData;
    if(arg1 == 2)
    {
        ui->progressBar_led->setValue(99);
        ui->horizontalSlider->setValue(99);
        sendData = QString("on\n").toUtf8();
        port->write(sendData.data());
    }
    else
    {
        ui->progressBar_led->setValue(0);
        ui->horizontalSlider->setValue(0);
        sendData = QString("cut\n").toUtf8();
        port->write(sendData.data());
    }
}

void MainWindow::on_horizontalSlider_valueChanged(int value)
{
    QByteArray sendData;
    ui->progressBar_led->setValue(value);
}

Tab widget, text eidt, lcd number, line edit, push putton
horizontal scrollbar, progress bar

https://youtube.com/shorts/vQx0Zcg9IDY?feature=share 

 

https://youtu.be/OYvk52uaEbc

 

 

'임베디드 시스템반도체 개발자 과정 by 서울기술교육센터 > 후기' 카테고리의 다른 글

93일차  (1) 2022.11.04
88일차  (0) 2022.10.27
86일차  (0) 2022.10.25
85일차  (0) 2022.10.24
83일차  (0) 2022.10.20