วันพฤหัสบดีที่ 12 กรกฎาคม พ.ศ. 2561

qt load font

เนื่องจากลูกค้าต้องการให้ใช้ font สวยๆ ตามที่เขาต้องการ จึงต้องทำการ load font ขึ้นมาใช้
ในตอนแรกเขียน code แบบนี้
QFont myFont("font1name", 30);
ซึ่งก็ใช้ได้ผลดี ในตอนทดสอบ, โดยการเรียกจาก Terminal (./myApp -platform xcb)
แต่... หลังจากที่ทดลอง restart rpi แล้ว และโปรแกรมถูกเรียกโดยสคริปท์ autorun ปรากฎว่า font ที่เราโหลดไว้ ไม่ยอมแสดง, แสดงเป็น font อื่นซะงั้น
จึงได้ไปลอง post ถามในกลุ่ม raspberry pi thailand ดู ซึ่งก็ได้คนใจดี มาช่วยตอบคำถามให้ โดยบอกว่าให้ลองใช้ QFontDatabase และ copy font ไปไว้ใน folder เดียวกันกับ Application ของเรา
ก็เลยไปค้นหาดูว่า QFontDatabase เขาใช้กันยังไง ก็ได้มาแบบนี้

#include <QFontDatabase>
.
.
.
QString myFont;
int loadedFontID = QFontDatabase::addApplicationFont("./fontFile.ttf");
QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(loadedFontID);
if(!loadedFontFamilies.empty())
  myFont = loadedFontFamilies.at(0);

QFont P(myFont, 90, QFont::Normal, false);

myLabel->setFont(P);

ก็ลองทดสอบ reboot ดู Font ก็แสดงออกมาได้อย่างถูกต้อง

ต้องขอขอบคุณผู้มีน้ำใจช่วยเหลือ ถึงแม้ว่าจะไม่รู้จักกันมาก่อนก็ตามที

วันศุกร์ที่ 6 กรกฎาคม พ.ศ. 2561

php set max file size

ได้มีโอกาสทำเวป และได้ใช้ php
มีการใช้ upload file ด้วย ซึ่งตอนแรกไม่รู้ว่า php มีการจำกัดขนาดไฟล์ไว้ด้วย และไฟล์ที่เราจะ upload ก็ใหญ่ จึงทำยังไงก็ไม่ได้ จนมีคนมาบอก ถึงใช้งานได้

วิธีกำหนดขนาดไฟล์ ที่จะ upload ดังนี้
1.เข้าไปที่ /etc/php5/apache2/php.ini
2.ให้มองหาคำว่า post_max_size แล้วแก้ไขตัวเลข ขนาดไฟล์ตามต้องการ
ตัวเลขนี้ คือตัวเลขที่จะทำการ upload ใน 1 ครั้ง จะกี่ไฟล์ก็ได้ แต่ขนาดไฟล์รวมกันทั้งหมด ต้องไม่เกินที่เรากำหนด
3.ให้มองหาคำว่า upload_max_filesize
ตัวเลขนี้ คือขนาดของไฟล์ 1 ไฟล์ ที่ต้องการ upload

ถ้าเราจะ upload file หลายๆไฟล์ ก็ให้มองหาคำว่า max_file_uploads

แก้ไขเสร็จแล้ว ให้ Restart Rpi หรือ sudo /etc/init.d/apache2 restart

วันพุธที่ 20 มิถุนายน พ.ศ. 2561

autorun gui application

สวัสดีครับ เงียบหายกันไปนาน (เหมือนเคย)

ได้มีโอกาสทำ application ที่ต้องแสดงบนหน้าจอ ( GUI Application )
และต้อง auto run เมื่อเปิดขึ้นมาใหม่

วิธีการทำ auto run มีดังนี้

sudo nano /home/pi/.config/lxsession/LXDE/autostart

และเพิ่มบรรทัดสุดท้ายเข้าไป ยกตัวอย่าง เช่น
โปรแกรมของเรา ชื่อ myApp อยู่ใน folder /home/pi/ ก็ให้เพิ่มเข้าไปดังนี้

@/home/pi/myApp

เสร็จแล้ว ง่ายๆ แต่หาให้เจอว่าทำยังไง มันยาก 555

ที่มา
http://www.raspberry-projects.com/pi/pi-operating-systems/raspbian/auto-running-programs-gui

วันศุกร์ที่ 30 มีนาคม พ.ศ. 2561

LCD20*4 i2c c qt

วันนี้ได้มีโอกาศใช้งาน LCD20*4 กับภาษา C ก็เลยอยากกระจายความสะดวกให้คนที่ทำทีหลัง โดยการเอา source code มาวางให้ครับ

โดยผมใช้ ภาษา C Qt Creator cross-compile บน linux ubuntu16.04 กับ rpi-3b และต่อ LCD ด้วย I2C

//============== mylcd.h =================//
 #ifndef MYLCD_H
#define MYLCD_H

#define I2C_ADDR_LCD1    0x26    // LCD I2C Address

#define LCD_CHR     1       // Mode sending data
#define LCD_CMD     0       // Mode sending command

#define LINE1       0x80    // 1st line
#define LINE2       0xc0    // 2nd line
#define LINE3       0x94    // 1st line
#define LINE4       0xd4    // 2nd line

#define LCD_BACKLIGHT   0x08    // on
//#define LCD_BACKLIGHT   0x00    // off

#define ENABLE          0b00000100  // enable bit

void typeInt(int i);
void typeFloat(float myFloat);
void lcdLoc(int line);          // move cursor
void ClrLcd(void);              // clr LCD return home
void typeln(const char *s);
void typeChar(char val);

void lcd_init(void);
void lcd_byte(int bits, int mode);
void lcd_toggle_enable(int bits);

int fd;

#endif // MYLCD_H




//============== main.c =================//
#include <QCoreApplication>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <stdlib.h>
#include <stdio.h>
#include <mylcd.h>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    if(wiringPiSetup()==-1){
        qDebug() << "can't open wiring pi";
    }
    else
    {
        qDebug() << "open wiring pi!!!";
    }

    fd = wiringPiI2CSetup(I2C_ADDR_LCD1);

    lcd_init();

    char array1[] = "Hello world!";

    while(1)
    {
        ClrLcd();

        lcdLoc(LINE1);
        typeln("Using wiringPi");
        lcdLoc(LINE2);
        typeln("Niran editor");
        lcdLoc(LINE3);
        typeln("I2c programmed");
        lcdLoc(LINE4);
        typeln("In C not python");
        delay(2000);

        ClrLcd();
        lcdLoc(LINE1);
        typeln(array1);

        delay(2000);
        ClrLcd();
        typeln("Int  ");
        int value = 20125;
        typeInt(value);

        delay(2000);
        lcdLoc(LINE2);
        typeln("Float  ");
        float Floatvalue = 10045.25989;
        typeFloat(Floatvalue);
    }

    return a.exec();
}

void typeln(const char *s){
    while(*s){
        lcd_byte(*(s++), LCD_CHR);
    }
}

// float to string
void typeFloat(float myFloat){
    char buffer[20];
    sprintf(buffer,"%4.2f", myFloat);
    typeln(buffer);
}

// int to string
void typeInt(int i){
    char array1[20];
    sprintf(array1,"%d", i);
    typeln(array1);
}

void ClrLcd(void){
    lcd_byte(0x01,LCD_CMD);
    lcd_byte(0x02,LCD_CMD);
}

void lcdLoc(int line){
    lcd_byte(line, LCD_CMD);
}

void typeChar(char val){
    lcd_byte(val,LCD_CHR);
}

void lcd_byte(int bits, int mode){
    int bits_high;
    int bits_low;

    bits_high   = mode | (bits & 0xF0) | LCD_BACKLIGHT;
    bits_low    = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT;

    wiringPiI2CReadReg8(fd,bits_high);
    lcd_toggle_enable(bits_high);

    wiringPiI2CReadReg8(fd,bits_low);
    lcd_toggle_enable(bits_low);
}

void lcd_toggle_enable(int bits){
    delay(10);
    wiringPiI2CReadReg8(fd,(bits|ENABLE));
    delay(10);
    wiringPiI2CReadReg8(fd,(bits|~ENABLE));
    delay(10);
}

void lcd_init(){
    lcd_byte(0x33,LCD_CMD);
    lcd_byte(0x32,LCD_CMD);
    lcd_byte(0x06,LCD_CMD);
    lcd_byte(0x0C,LCD_CMD);
    lcd_byte(0x28,LCD_CMD);
    lcd_byte(0x01,LCD_CMD);
    delay(500);
}


วันอังคารที่ 14 มีนาคม พ.ศ. 2560

raspberry pi ฟอนต์ไทย, add font thai, thai font, เปลี่ยนเป็นภาษาไทย

ในกรณีที่เราลง os ที่ไม่มี font thai เวลาต้องการให้แสดงภาษาไทย มันจะแสดงไม่ได้ เราจะเห็นเป็นตัวเหลี่ยมๆ อ่านไม่ออก สามารถแก้ไขได้ โดยต้องทำดังนี้ครับ

1. หาฟอนต์มา เวปไหนก็ได้ที่ให้ดาวน์โหลดฟรี ตัวอย่างเช่น
http://www.f0nt.com/author/bangli-ko-sa-na/

2. ทำการ add font ตามนี้
ให้ copy file.ttf ที่ donwload มา ใส่ใน /usr/share/fonts/truetype


3. เปลี่ยน keyboard layout ตามนี้
3.1 sudo nano /etc/default/keyboard
3.2 แก้ไขไฟล์ ตามนี้
# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

XKBMODEL="pc105"
XKBLAYOUT="us,th"
XKBVARIANT=""
XKBOPTIONS="grp:alt_shift_toggle,grp_led:scroll us,th"

BACKSPACE="guess"


4. reboot

ถ้าต้องการเปลี่ยนภาษา ให้กด alt + shift

ที่มา
http://www.f0nt.com/author/bangli-ko-sa-na/
http://www.raspberry-projects.com/pi/pi-operating-systems/raspbian/gui/fonts-2
http://www.mindphp.com/forums/viewtopic.php?f=215&t=34602

วันพุธที่ 11 มกราคม พ.ศ. 2560

qt paint วาดวงกลม ระบายวงกลม วาดรูป

มีขั้นตอนดังนี้

1. ใน mainwindow.h พิมพ์เพิ่มใน class MainWindow : public QMainWindow ดังนี้
protected:
    void paintEvent(QPaintEvent *e);

2. ใน mainwindow.cpp ให้เพิ่ม #include <QPainter>
3. ใน mainwindow.cpp ให้เพิ่ม
void MainWindow::paintEvent(QPaintEvent *e){
    QPen pen = QPen(Qt::black,2,Qt::PenStyle(Qt::SolidLine));
    QRect rec(100,100,100,100);
    QPainter p(this);
    p.setPen(pen);
    p.setBrush(Qt::cyan);
    p.drawEllipse(rec);
    p.drawArc(rec,0,360*16);
}

ถ้าต้องการให้รูปมีการเปลี่ยนแปลงให้ใช้คำสั่ง QWidget::update();



ที่มา
http://stackoverflow.com/questions/17375808/qt-drawing-a-circle

https://www.youtube.com/watch?v=xXV3_mktCmY

https://www.youtube.com/watch?v=-K-VU9I4ffY

วันอังคารที่ 10 มกราคม พ.ศ. 2560

qt สั่งเปิดโปรแกรม python

การใช้ qt เพื่อสั่งเปิดโปรแกรมอื่น ให้ทำดังนี้

1. #include <QProcess> เพิ่มใน mainwindow.cpp
2. QProcess sysComm; (เอาไว้ใต้ include เพื่อให้สามารถใช้ได้ทั่วทุกฟังก์ชัน)
3. sysComm.start("python /home/pi/test.py"); สั่งเปิดโปรแกรม test.py ด้วย python
4. sysComm.waitForStarted();
5. sysComm.waitForFinished(); เพื่อรอให้โปรแกรมจบ

ลองเล่นกันดูครับ

วันพฤหัสบดีที่ 5 มกราคม พ.ศ. 2560

การใช้ qt serial port

ให้ทำดังต่อไปนี้
1. ไปที่ .pro แล้วพิมพ์เพิ่ม เป็น QT += core gui serialport
2. กดเมนู build เลือก run qmake
3. เข้าไฟล์ .cpp แล้ว include <QSerialPort>
4. ประกาศตัวแปร serial โดยพิมพ์เพิ่ม ใต้ include ดังนี้ QSerialPort *serial;
5. แล้วไปที่ตัว main เพื่อเริ่มกำหนดค่าต่างๆให้ serial ดังนี้
serial-> new QSerialPort(this);
serial->setPortName("/dev/ttyUSB0");
serial->setBaudRate(QSerialPort::Baud9600);
serial->setDataBits(QSerialPort::Data8);
serial->setParity(QSerialPort::NoParity);
serial->setStopBits(QSerialPort::OneStop);
serial->setFlowControl(QSerialPort::NoFlowControl);
serial->open(QIODevice::ReadWrite);
serial->write("ok.");

6. พิมพ์เพิ่มในตอนปิดโปรแกรม ดังนี้
MainWindow::~MainWindow()
{
delete ui.
serial->close();
}

7.MainWindow.h ให้เพิ่มดังนี้
Private slots:
void serialReceive();

8. ใน MainWindow.cpp ให้พิมพ์ดังนี้
void MainWindow::serialReceive()
{
QByteArray ba;
ba = serial->readAll();
qDebug() << ba;
}

9. พิมพ์ต่อจาก serial->write("ok.")
connect(serial, SIGNAL(readyRead()), this, SLOT(serialReceive()));

แล้วลองรันดู
โปรแกรมนี้จะส่ง "ok." ออกไป
และถ้าได้รับข้อมูลอะไรกลับมา ก็จะแสดงที่ qDebug


ที่มา
https://www.youtube.com/watch?v=UD78xyKbrfk