본문 바로가기

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

88일차

10월 27일

 

오늘은 입력 받은 온습도 수치를 그래프로 그리는 게 목표다.

 

widget을 추가한 다음 widget 영역 내에서 우클릭해서 Promote to ... 항목을 선택한다.
이후 add
이후 Promote

새로 widget을 만들어서 우클릭하면 달라진 점이 보인다.

저거 선택까지가 의도한 바.

QT       += core gui
QT       += serialport # Add
QT       += printsupport # Add chart

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 \
    qcustomplot.cpp

HEADERS += \
    mainwindow.h \
    qcustomplot.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
#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
    //chart start
    void add_point(double x, double y);
    void plot(int select);
    void add_point_humid(double x, double y);
    void plot_humid(int select);
    //chart end

private slots:
    int time_update(); //Add for displaying time

    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);

    void on_pushButton_tempClear_clicked();

private:
    Ui::MainWindow *ui;
    QTimer *timer; //timer object
    int test = 0;
    //----chart start
    QVector <double> qv_x, qv_y;
    QString temp;
    double max_temp;
    double min_temp;

    QVector <double> qv_x_humid, qv_y_humid;
    QString humid;
    double max_humid;
    double min_humid;
    double time = 0; //시간축(x)을 가리키는 변수
    /*
     * QVector <int> v {1,2,3,4}; 동적 메모리 템플릿
     */
    //----chart end
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qcustomplot.h" // Add chart

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();

    //----Add chart start
    ui->plot->setInteraction(QCP::iRangeDrag, true);
    ui->plot->setInteraction(QCP::iRangeZoom, true);
    ui->plot->addGraph();
    ui->plot->yAxis->setLabel("온도");
    ui->plot->yAxis->setRange(0.0, 40.0);
    ui->plot->xAxis->setLabel("시간");
    ui->plot->graph(0)->setScatterStyle(QCPScatterStyle::ssCircle); //점 찍는 스타일로 그려라
    ui->plot->graph(0)->setLineStyle(QCPGraph::lsLine); //라인 스타일로 그려라

    ui->plot2->setInteraction(QCP::iRangeDrag, true);
    ui->plot2->setInteraction(QCP::iRangeZoom, true);
    ui->plot2->addGraph();
    ui->plot2->yAxis->setLabel("습도");
    ui->plot2->yAxis->setRange(0.0, 40.0);
    ui->plot2->xAxis->setLabel("시간");
    ui->plot2->graph(0)->setScatterStyle(QCPScatterStyle::ssCircle); //점 찍는 스타일로 그려라
    ui->plot2->graph(0)->setLineStyle(QCPGraph::lsLine); //라인 스타일로 그려라
    time = 0;
    //----Add chart end

    min_temp = 2000;
    max_temp = 0.0;
    min_humid = 2000;
    max_humid = 0.0;

    timer = new QTimer(this); //타이머 생성
    //time out (1000ms) 되면 time_update라는 함수를 호출해라.
    connect(timer, SIGNAL(timeout()), this, SLOT(time_update()));
}

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

int MainWindow::time_update()
{
    QDateTime local(QDateTime::currentDateTime());
    ui->label_time->setText(local.toString());
    test++;
    qDebug() << test;
    return 0;
}

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);
            //chart start
            add_point((double) time, (double) tmp);
            time += 2;
            ui->plot->yAxis->setRange(0.0, 40.0); //y축 범위
            ui->plot->xAxis->setRange(0,time+2); //x축 확장
            plot(0); //그래프 그리기
            //chart end
            //lcdNumber
            if(tmp > max_temp) max_temp = tmp;
            if(min_temp > tmp) min_temp = tmp;
            ui->lcdNumber_currentTemp->display(tmp);
            ui->lcdNumber_maxTemp->display(max_temp);
            ui->lcdNumber_minTemp->display(min_temp);
        }
        else if(!strncmp(msg, "[Wet]", strlen("[Wet]")))
        {
            strcpy(wet_ch, msg+5);
            int wet = atoi(wet_ch);
            ui->lcdNumber_humid->display(wet);
            if(wet > max_humid) max_humid = wet;
            if(min_humid > wet) min_humid = wet;
            ui->lcdNumber_currentHum->display(wet);
            //chart start
            add_point_humid((double) time, (double) wet);
            time += 2;
            ui->plot2->yAxis->setRange(0.0, 80.0); //y축 범위
            ui->plot2->xAxis->setRange(0,time+2); //x축 확장
            plot_humid(0); //그래프 그리기
            //chart end
            ui->lcdNumber_maxHum->display(max_humid);
            ui->lcdNumber_minHum->display(min_humid);
        }
        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
}
//chart start
void MainWindow::add_point(double x, double y)
{
    qv_x.append(x);
    qv_y.append(y);
}

void MainWindow::plot(int select)
{
    if(select == 0)
    {
        ui->plot->graph(0)->setData(qv_x, qv_y);
        ui->plot->replot();
        ui->plot->update();
    }
}

void MainWindow::add_point_humid(double x, double y)
{
    qv_x_humid.append(x);
    qv_y_humid.append(y);
}

void MainWindow::plot_humid(int select)
{
    if(select == 0)
    {
        ui->plot2->graph(0)->setData(qv_x_humid, qv_y_humid);
        ui->plot2->replot();
        ui->plot2->update();
    }
}
//chart end

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()
{
    timer->start(1000); //1000ms timer를 시작

    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()
{
    timer->stop();
    ui->label_time->setText("STOP");
    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);
}

void MainWindow::on_pushButton_tempClear_clicked()
{
    qv_x.clear();
    qv_y.clear();
    qv_x_humid.clear();
    qv_y_humid.clear();
    time = 0;
}

https://youtu.be/eNl96rSqAXc

---------

 

Data Base = excel

Data Table = excel 내의 sheet

 

====linux 상에서 sqlite db 설치 방법 =====

1. sudo apt update

2. sudo apt install sqlite3

3. sqlite3가 정상적으로 설치됐는지 확인.

 sqlit3

무수한 command의 향연...

cf)빠져나올 때는 .quit // 위에 올려보면 명령어 목록에 있음.

4. db를 만든다.

???

제대로 생성함.

5. db를 정상적으로 만들었는지 확인 sqlite> .databases

6.database command에서 나온다 sqlite> .quit

 

===Sqlite Browser 설치===

1.sudo apt install sqlitebrowser

 

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

95일차  (0) 2022.11.08
93일차  (1) 2022.11.04
87일차  (0) 2022.10.26
86일차  (0) 2022.10.25
85일차  (0) 2022.10.24