วันอาทิตย์ที่ 26 กันยายน พ.ศ. 2564

วันอังคารที่ 2 มีนาคม พ.ศ. 2564

raspberry pi4 picamera scan qrcode

 โปรเจคร้อน ต้องรีบแก้ไข

Scan QR Code โดยใช้ RaspberryPi4 และ pi-camera

sudo raspi-config

เข้าเมนู Interface Options, enable camera

sudo apt-get update

sudo apt-get install libhdf5-serial-dev

sudo apt-get install libatlas-base-dev

sudo apt-get install libjasper-dev

 sudo apt-get install libqtgui4

 sudo apt-get install libqt4-test

 pip3 install opencv-contrib-python==4.1.0.25

 pip3 install pyzbar

 pip3 install imutils

 pip3 install argparse

pip3 install opencv-python 
sudo apt-get install libhdf5-dev
sudo apt-get install libhdf5-serial-dev

 จากนั้นก็เปิด Thonny python IDE

แล้ว Download Code ได้ที่นี่

 https://github.com/kongimi/raspberrypi-camera-qrcode

 แล้วแปะ code ลงไปใน Thonny python IDE แล้วกด Run

จะมีภาพจากกล้องแสดงขึ้นมา เราก็เอา QR Code ไปวางบริเวณหน้ากล้อง


ก็จะสามารถอ่าน QR Code ได้

จอบอ

https://circuitdigest.com/microcontroller-projects/qr-code-scanner-using-raspberry-pi-and-opencv

 https://stackoverflow.com/questions/53347759/importerror-libcblas-so-3-cannot-open-shared-object-file-no-such-file-or-dire

 

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

ติดตั้ง mysql + phpmyadmin + remote database ให้กับ raspberry pi4

  sudo update

sudo upgrade

sudo apt install mariadb-server

 หลังจากลงเสร็จแล้ว ก็ต้องตั้ง password ของ database ก่อน โดยใช้คำสั่ง

sudo mysql_secure_installation

จะมีให้เราใส่ password ก็ใส่ไป 2 ที

และตอบ Y ทั้งหมด ถ้าเขาถามอะไรขึ้นมา

ทดสอบการใช้งาน และ password ด้วยการเข้าใช้งานด้วยคำสั่ง

sudo mysql -u root -p

 ใส่ password ที่เราตั้งไว้

 ถ้าเราต้องการออก ให้ใช้คำสั่ง

quit;

ทดลองสร้าง database

CREATE DATABASE exampledb;

 จากนั้นสร้าง user ที่จะสามารถใช้งาน database นี้ได้ โดยตั้งชื่อ user ว่า exampleuser และตั้ง password = pimylifup

CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'pimylifeup';

ต่อมาเราจะกำหนดสิทธิ์ให้ user ที่จะเข้ามาทำอะไรกับ database นี้ ด้วยคำสั่ง

GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'localhost';
FLUSH PRIVILEGES;

 

ถ้าเราไม่ถนัดในการใช้ command line ก็สามารถใช้ phpmyadmin ได้

sudo apt install phpmyadmin

ถ้าเราต้องการใช้ php ติดต่อกับ mysql ก็สามารถทำได้

sudo apt install php-mysql

 

เริ่มลง phpmyadmin กัน

เมื่อใช้คำสั่ง sudo apt install phpmyadmin แล้ว จะขึ้นหน้าแบบนี้ ให้เราเคาะ space bar เพื่อเลือก apache2 แล้วกด Enter


 จากนั้นจะมีหน้าคำถามขึ้นมาให้ตอบ Y แล้วใส่ password ตั้งเป็นอะไรก็ได้ แต่ควรจะให้ต่างจาก password ที่ใช้กับ mysql

 มาถึงตอนนี้ เราต้องสร้าง user ใหม่ ให้กับ database ของเรา เพื่อใช้กับ phpmyadmin

sudo mysql -u root -p

และใช้คำสั่งนี้ในการสร้าง user

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

โดยแก้ไข username และ passsword ที่เราตั้งไว้ตอนแรก username = exampleuser , password=pimylifeup จะกลายเป็น

GRANT ALL PRIVILEGES ON *.* TO 'exampleuser'@'localhost' IDENTIFIED BY 'pimylifeup' WITH GRANT OPTION;
FLUSH PRIVILEGES;  

เราจะใช้ username และ password นี้ ในการเข้า phpmyadmin

จากนั้นพิมพ์ quit; เพื่อออกจาก mysql

ให้เปิดไฟล์

sudo nano /etc/apache2/apache2.conf

และเติมบรรทัดนี้ลงไปในด้านล่างสุด

Include /etc/phpmyadmin/apache.conf

 แล้ว re-start apache2 service

sudo service apache2 restart

 ใช้คำสั่งนี้ในการสร้าง link

sudo ln -s /usr/share/phpmyadmin /var/www/html

จากนั้นเปิด browser อะไรก็ได้ แล้วไปที่ http://localhost/phpmyadmin

ถ้าอยากรู้ ip ของ raspberry pi ก็ให้พิมพ์ hostname -I

จะมีให้ใส่ user name และ password

exampleuser / pimylifeup


 ถ้าต้องการให้เครื่องอื่นสามารถเข้ามาอ่าน database ของเราได้ ให้แก้ไข localhost เป็น IP ของเครื่องนั้นๆ

GRANT ALL PRIVILEGES ON my_database.* TO user@'192.168.xxx.xxx' IDENTIFIED BY 'password' WITH GRANT OPTION;
หรือ 
GRANT ALL PRIVILEGES ON my_database.* TO user@'192.168.xxx.xxx' IDENTIFIED BY 'password'; 
FLUSH PRIVILEGES;
quit;
แล้วก็เข้าไปแก้ไขไฟล์นี้
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
เอา comment ออก
port = 3306
และ comment 
#bind-address = 127.0.0.1
control+o, enter, control+x
 
restart mysql ด้วยคำสั่ง 
sudo /etc/init.d/mysql restart

 

จอบอ

 

 ที่มา

https://pimylifeup.com/raspberry-pi-mysql/

 

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

rpi real time clock ds3231

วันนี้ได้มีโอกาสใช้ Real Time Clock กับ Rpi เป็นครั้งแรก โดยใช้ชิปเบอร์ ds3231

มาถึงก็ต่อสายก่อนเลย

RTC    RPi

VCC    1

GND    6

SCL    5

SDA    3

sudo apt-get update

sudo apt-get upgrade

sudo raspi-conifg

enable i2c

sudo reboot

sudo apt-get install python-smbus i2c-tools

sudo i2cdetect -y 1

จะเห็น address 68

sudo nano /boot/config.txt

เพิ่มบรรทัดนี้เข้าไปที่ด้านล่างสุดของไฟล์

dtoverlay=i2c-rtc,ds3231

ctrl+o, ctrl+x

sudo reboot

sudo apt-get -y remove fake-hwclock

sudo update-rc.d -f fake-hwclock remove

sudo nano /lib/udev/hwclock-set

มาหาบรรทัดนี้

if [ -e /run/systemd/system ] ; then
    exit 0
fi

แล้ว comment out แบบนี้

#if [ -e /run/systemd/system ] ; then
#    exit 0
#fi

ctrl+o, ctrl+x

เราสามารถอ่านเวลาจาก rtc ได้ด้วยคำสั่งนี้

sudo hwclock -D -r

ก่อนที่เราจะทำการ sync เวลาจาก rpi ของเราไปที่ rtc ต้องเช็คก่อนว่าเวลาที่ rpi เป็นเวลาที่ถูกต้อง ด้วยคำสั่ง

date

ถ้าเวลาไม่ตรงกับปัจจุบัน ให้เราต่อ rpi กับ internet เสียก่อน

ถ้าเวลาถูกต้องดีแล้ว ก็จะใช้คำสั่งนี้ในการเขียนข้อมูลเวลาไปที่ rtc

sudo hwclock -w

ให้เราลองอ่านเวลาจาก rtc ดู ด้วยคำสั่งนี้

sudo hwclock -r

เราก็จะได้มีเวลาเป็นของตัวเองสักที

จอบอ


https://www.nelisys.com/tutorials/raspberry-pi-rtc-ds3231

https://pimylifeup.com/raspberry-pi-rtc/

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

python check process running

ถ้าเราต้องการตรวจสอบว่า โปรแกรมที่เราเขียนยังทำงานอยู่ไหม ทำดังนี้

 ลง psutil

 pip install psutil

 

 

สร้างไฟล์ checkMyProgram.py ที่ /home/pi เพื่อเช็คการทำงานของโปรแกรมที่ชื่อว่า MyProgram

import psutil
import datetime

def checkIfProcessRunning(processName):
    '''
    Check if there is any running process that contains the given name processName.
    '''
    #Iterate over the all the running process
    for proc in psutil.process_iter():
        try:
            # Check if process name contains the given name string.
            if processName.lower() in proc.name().lower():
                return True
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            pass
    return False;



time = datetime.datetime.now()
fileName = "/home/pi/TagAgent/MyProgramLog" + time.strftime("%Y-%m-%d_%H") +".txt"

d = open(fileName, "a")
d.write(time.strftime("%H:%M:%S"))

if checkIfProcessRunning('MyProgram'):
    d.write(" MyProgram still alive!\n")
    d.close()
else:
    d.write(" Not found MyProgram!\n")
    d.close()


หลังจากการรัน checkMyProgram.py ด้วยคำสั่ง python checkMyProgram.py แล้ว จะมีการสร้างไฟล์ที่ชื่อว่า /home/pi/MyProgramLogตามด้วยปีเดือนวันชั่วโมง.txt ขึ้นมา

เพื่อให้มาเปิดดูในภายหลังว่า โปรแกรม MyProgram ยังทำงานอยู่หรือไม่ หรือว่าตายไปตั้งแต่ช่วงไหน


ถ้าเราต้องการเช็คทุก 1 นาที ก็ให้ใช้ crontab เข้าช่วย

crontab -e

เพิ่มเข้าไปบรรทัดสุดท้าย

* * * * * python /home/pi/checkMyProgram.py


https://thispointer.com/python-check-if-a-process-is-running-by-name-and-find-its-process-id-pid/ 

https://www.programiz.com/python-programming/datetime/current-time

https://www.w3schools.com/python/python_datetime.asp

วันศุกร์ที่ 25 ธันวาคม พ.ศ. 2563

sqlite3 rpi4 Qt

ต้องลง sqlite3 ก่อน

sudo apt-get update
sudo apt-get install sqlite3

จากนั้นลง sqlitebrowser ตาม
sudo apt-get install sqlitebrowser

สร้าง database ดังนี้

$ sqlite3 test.db
sqlite> CREATE TABLE people(ids integer primary key, name text);
sqlite> .quit

 

ต่อมา จะเขียนโปรแกรมใน Qt ให้สามารถติดต่อกับ Database ได้ 

เมื่อเปิดโปรแกรม Qt ขึ้นมา ให้เปิด ไฟล์.pro และพิมพ์เพิ่มเข้าไปแบบนี้

 QT += sql

คลิกขวาที่โปรเจค แล้วกด Run Qmake


 คลิกขวาที่โปรเจค เพื่อเพิ่ม class


ตั้งชื่อ class ว่า dbmanager

เมื่อสร้าง class เสร็จแล้ว เราจะได้ dbmanager.h และ dbmanager.cpp มา

ในไฟล์ dbmanager.h ให้เขียน code ดังนี้

ส่วนไฟล์ dbmanager.cpp ให้เขียนดังนี้

ในไฟล์ main.cpp ให้เพิ่ม code ดังนี้
จากนั้นกด Run ก็จะเห็นว่ามีการสร้าง database ขึ้นมาแล้ว ในโฟลเดอร์ที่ระบุไว้

ถ้าหากเราต้องการฟังก์ชั่นอื่นๆที่สามารถจัดการกับ database ได้ ให้ทำดังนี้

1.เพิ่มใน dbmanager.h ในที่นี้ผมจะเพิ่มฟังก์ชั่นที่ชื่อว่า AddRecord โดยรับค่า QString เข้าไป

2.เพิ่มใน dbmanager.cpp

แล้วกด Run จะเห็นได้ว่า database ได้ถูกเพิ่มชื่อ Niran เข้าไปแล้ว โดยสามารถเปิดดูได้ใน sqlitebrowser ก็ได้

แก้ไข code ให้เช็คก่อนว่ามีชื่ออยู่แล้วหรือไม่

เมื่อกด Run จะเห็นได้ว่า มีการแจ้งว่า "Person exist"

และเมื่อเปลี่ยนชื่อใหม่เข้าไป ก็จะมีเพิ่มเข้าไปใน database.

จอบอ. 


ที่มา

https://scienceprog.com/powerful-open-source-sqlite-manager-for-raspberry-pi/ 

http://katecpp.github.io/sqlite-with-qt/



วันอังคารที่ 22 ธันวาคม พ.ศ. 2563

qt json

 วันนี้มีโอกาสใช้ json เป็นฐานข้อมูล

ก็เหมือนเดิม อาจารย์ google ช่วยได้

ต้องออกแบบหน้าตาของ json  ก่อน ว่าจะเก็บข้อมูลยังไง โดยผมกำหนดแบบนี้

ไฟล์ชื่อ  test_trans.json

{
    "HoseDelivery": [
        {
            "hose_num": 1,
            "id": 1
        },
        {
            "hose_num": 1,
            "id": 5
        }
    ]
}


เริ่มเขียน code

#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QFile>
#include <QDebug>

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

    QString val;
    QFile file;

//========================== read json file =====================
    file.setFileName("/home/pi/sourcecode/test_json/test_trans.json");
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    val = file.readAll();
    file.close();
    QJsonDocument d = QJsonDocument::fromJson(val.toUtf8());
    QJsonObject sett2 = d.object();
    qDebug() << sett2;

    QJsonArray value = sett2["hose_delivery"].toArray();  // get data in hose_delivery 

    qDebug() << value;

    QJsonObject item = value[1].toObject();                        // make QJsonValue to Object
    qDebug() << item;

    QJsonValue text1 = item.value(QString("money"));
    qDebug() << text1;
    qDebug() << QString::number(text1.toDouble());

//============================ write json file ============================
    file.setFileName("/home/pi/sourcecode/test_json/test_trans2.json");
    file.open(QIODevice::ReadWrite | QIODevice::Text);
    val = file.readAll();

    QJsonDocument doc = QJsonDocument::fromJson(val.toUtf8());
    QJsonObject abc = doc.object();
    qDebug() << abc;

    QJsonArray valuez = abc["HoseDelivery"].toArray();  // get data in hose_delivery 

    qDebug() << valuez;


    QJsonObject hose_delivery;
    hose_delivery.insert("id",5);
    hose_delivery.insert("hose_num",1);
    valuez.append(hose_delivery);
    qDebug() << valuez;
    abc.insert("HoseDelivery",valuez);

    file.resize(0);
    file.write(QJsonDocument(abc).toJson(QJsonDocument::Indented));
    file.close();   // Close file

    return a.exec();
}



ที่มา

https://www.programmersought.com/article/2411597093/

วันอาทิตย์ที่ 20 ธันวาคม พ.ศ. 2563

Arduino VSCode

 วันนี้ลองใช้ Visual Studio Code (VSCode) ในการใช้งานกับ Arduino

ใช้งานครั้งแรกจะงงหน่อย จะสร้างโปรเจคยังไง เปิดไฟล์ยังไง เปิดไม่ถูก ต้องดูใน you tube ก่อน

เริ่มกันเลยดีกว่า

เมื่อเปิด vscode ขึ้นมาแล้ว ต้องลง extension arduino ก่อน

พอลงเสร็จ ก็จะสามารถใช้งาน arduino ได้

เริ่มต้นด้วยการคลิกไปที่ file, open folder, เลือก folder ที่เราต้องการเก็บ project ของเรา เราสามารถสร้างใหม่ได้

เมื่อเลือก folder เสร็จแล้ว ให้ทำการคลิก New file

แล้วก็ตั้งชื่อไฟล์ โดยให้นามสกุลเป็น .ino เพื่อให้ vscode รู้ว่าเรากำลังจะทำ Arduino

ให้เราเสียบสาย usb จากคอมพิวเตอร์ของเรา กับบอร์ด Arduino

จากนั้นก็เลือก Board type


เลือก Serial port

เริ่มเขียน code ได้

เมื่อเขียน code เสร็จแล้ว ให้กด Verify

แล้ว Verify ผ่าน ก็กด Upload


ถ้าเราต้องการ Debug ผ่าน Serial port ให้กดปุ่มนี้

แล้วก็เลือก Baud rate ให้ถูกต้องตามที่เราเขียนโปรแกรมเอาไว้

จอบอ.


ที่มา

https://www.youtube.com/watch?v=3vV_53Os9FU