You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Phiên bản: 1.1.0
Tổ chức: Bình Dân Học STEM & Robot
Ngày cập nhật: 2026-04-05
1. Tổng quan sản phẩm
NEO STEM là ứng dụng giáo dục tương tác dành cho học sinh Việt Nam (Lớp 3-9, 8-15 tuổi), giúp khám phá kiến thức STEM thông qua 20 hiện tượng khoa học từ đời sống thường ngày.
Đối tượng & Phân loại cấp độ
Cấp độ
Nhãn
Lớp
Tuổi
Số hoạt động
Cơ bản
basic
Lớp 3-5
8-11
10
Nâng cao
intermediate
Lớp 5-6
10-12
4
THCS
advanced
Lớp 6-9
11-15
6
Đặc điểm chính
20 hoạt động giáo dục theo phương pháp 5 bước khoa học
3 cấp độ phù hợp từ tiểu học đến THCS
Hệ thống gamification: 300 sao + 29 huy hiệu
Giao diện cảm ứng tối ưu cho trẻ em
Lưu trữ tiến độ offline bằng SQLite
Hỗ trợ đa ngôn ngữ (Tiếng Việt mặc định)
2. Stack Công nghệ
Thành phần
Công nghệ
Phiên bản
Framework UI
Qt Quick / QML
Qt 6.5+
Ngôn ngữ backend
C++ 17
gcc/clang
Build system
CMake
3.16+
Database
SQLite (LocalStorage)
3.x
UI Controls
Qt Quick Controls 2
-
Multimedia
Qt Multimedia
-
Style
Qt Quick Basic style
-
Các module Qt sử dụng
Qt6::Quick - Engine QML chính
Qt6::QuickControls2 - Thành phần giao diện (Button, Popup, StackView...)
Qt6::Multimedia - Âm thanh, hiệu ứng audio
Qt6::Sql - SQLite driver (khởi tạo DB trong C++)
3. Cấu trúc thư mục
NEO_STEM/
├── CMakeLists.txt # Build configuration
├── ARCHITECTURE.md # Tài liệu này
├── src/
│ ├── main.cpp # Entry point (C++)
│ │
│ ├── core/ # UI Components dùng chung
│ │ ├── NeoConstants.qml # [Singleton] Hằng số, dữ liệu, màu sắc
│ │ ├── ProgressTracker.qml # [Singleton] CRUD tiến độ → SQLite
│ │ ├── BadgeSystem.qml # [Singleton] Logic mở khóa huy hiệu
│ │ ├── ActivityBase.qml # Lớp cơ sở cho 20 hoạt động
│ │ ├── NeoBar.qml # Thanh điều hướng trên cùng
│ │ ├── NeoBonus.qml # Popup thưởng khi hoàn thành bước
│ │ ├── NeoScore.qml # Hiển thị sao (★★★)
│ │ ├── NeoAudio.qml # Quản lý âm thanh
│ │ ├── PhenomenonViewer.qml # Bước 1: Xem hiện tượng + hotspot
│ │ ├── DrivingQuestionBoard.qml# Bước 2: Bảng câu hỏi note dính
│ │ ├── DQBItem.qml # Note đơn trên bảng câu hỏi
│ │ ├── InvestigationBase.qml # Bước 3: Khung thí nghiệm
│ │ ├── ModelBuilder.qml # Bước 4: Drag-drop mô hình
│ │ ├── ProblematizeChallenge.qml # Bước 5: Trắc nghiệm thách thức
│ │ ├── TouchButton.qml # Nút bấm tối ưu cảm ứng (52px+)
│ │ ├── DragItem.qml # Item kéo-thả
│ │ ├── DropZone.qml # Vùng thả
│ │ ├── ParticleEffects.qml # Hiệu ứng hạt (bọt, hơi, lấp lánh)
│ │ ├── ThermometerWidget.qml # Widget nhiệt kế
│ │ └── SliderControl.qml # Thanh trượt điều khiển
│ │
│ ├── menu/ # Màn hình điều hướng
│ │ ├── MainMenu.qml # [Root Window] Splash + StackView
│ │ ├── QuestionSelector.qml # Chọn câu hỏi (4 nhóm chủ đề)
│ │ ├── StepSelector.qml # Chọn bước trong 1 câu hỏi
│ │ ├── ProfileScreen.qml # Hồ sơ + thống kê + huy hiệu
│ │ └── SettingsScreen.qml # Cài đặt ngôn ngữ, reset dữ liệu
│ │
│ └── activities/ # 20 hoạt động giáo dục
│ ├── q1_rice_cooker/ # Nồi cơm điện
│ │ ├── Q1RiceCooker.qml # Activity wrapper (extends ActivityBase)
│ │ ├── Step1Phenomenon.qml # Bước 1: Quan sát
│ │ ├── Step2DQB.qml # Bước 2: Câu hỏi
│ │ ├── Step3Investigation.qml # Bước 3: Thí nghiệm
│ │ ├── Step4Model.qml # Bước 4: Mô hình
│ │ └── Step5Problematize.qml # Bước 5: Thách thức
│ ├── q2_dalat_fog/ # Sương mù Đà Lạt
│ ├── ... # (q3 → q20, cấu trúc tương tự)
│ └── q20_water_xylophone/ # Chai nước xylophone
│
├── translations/ # File dịch
│ ├── neostem_vi.ts # Tiếng Việt
│ └── neostem_en.ts # Tiếng Anh
│
└── build/ # Thư mục output (CMake)
Sử dụng emoji trực quan thay vì ký hiệu trừu tượng:
Chức năng
Icon
Ghi chú
Trang chủ
🏠
Thay thế ⌂
Quay lại
⬅
Thay thế ◄
Trợ giúp
💡
Thay thế ?
Hồ sơ
📊
Kèm text label
Cài đặt
⚙️
Kèm text label
8.5 Animation
Token
Thời gian
Dùng cho
animFast
200ms
Phản hồi nhanh (bấm nút, đổi màu)
animNormal
400ms
Chuyển cảnh, transition
animSlow
800ms
Hiệu ứng nhấn mạnh (pulsing)
Pattern tương tác:
Nút bấm: scale 0.92x khi nhấn
Kéo-thả: scale 1.15x khi giữ
Card chưa hoàn thành: pulse 1.0→1.06 (loop)
9. Hướng dẫn Build trên macOS (Development)
Yêu cầu
# Cài Qt6 qua Homebrew
brew install qt@6 cmake
# Hoặc dùng Qt Online Installer# https://www.qt.io/download-qt-installer
Build
cd /path/to/NEO_STEM
mkdir -p build &&cd build
cmake .. -DCMAKE_PREFIX_PATH=$(brew --prefix qt@6)
make -j$(sysctl -n hw.ncpu)
Chạy
./build/neostem
10. Triển khai trên Linux Armbian (ARM, 2GB RAM)
9.1 Yêu cầu phần cứng tối thiểu
Thông số
Yêu cầu tối thiểu
Khuyến nghị
CPU
ARM Cortex-A53 (aarch64)
Cortex-A72 hoặc cao hơn
RAM
2 GB
2 GB (đủ dùng)
Storage
500 MB trống
2 GB trống
Display
Framebuffer hoặc X11/Wayland
HDMI/LCD với touchscreen
OS
Armbian Bookworm (Debian 12)
Armbian 24.x+
9.2 Cài đặt Dependencies trên Armbian
# Cập nhật hệ thống
sudo apt update && sudo apt upgrade -y
# Cài đặt Qt6 development packages
sudo apt install -y \
qt6-base-dev \
qt6-declarative-dev \
qt6-multimedia-dev \
qml6-module-qtquick \
qml6-module-qtquick-controls \
qml6-module-qtquick-layouts \
qml6-module-qtquick-window \
qml6-module-qt-labs-localstorage \
qml6-module-qtquick-particles \
qt6-qml-dev \
libqt6sql6-sqlite \
libqt6multimedia6 \
cmake \
g++ \
make
# Nếu Qt6 không có trong repo mặc định, thêm backports:# sudo apt install -y -t bookworm-backports qt6-base-dev ...
9.3 Build Native trên Armbian
# Clone hoặc copy source code# scp -r NEO_STEM/ user@armbian-ip:~/cd~/NEO_STEM
mkdir -p build &&cd build
# Configure với tối ưu cho ARM + RAM thấp
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS="-O2 -march=native"# Build (dùng 1-2 job để tránh hết RAM trên 2GB)
make -j2
# Nếu hết RAM khi build, giảm xuống 1 job:# make -j1
9.4 Cross-Compile từ máy host (Tùy chọn nâng cao)
Nếu build native quá chậm, có thể cross-compile từ x86_64:
# Trên máy host (Ubuntu/Debian x86_64)
sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
# Cần Qt6 cross-compiled cho aarch64# Xem: https://doc.qt.io/qt-6/configure-linux-device.html# CMake toolchain file (toolchain-aarch64.cmake):
cat > toolchain-aarch64.cmake << 'EOF'set(CMAKE_SYSTEM_NAME Linux)set(CMAKE_SYSTEM_PROCESSOR aarch64)set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)set(CMAKE_FIND_ROOT_PATH /path/to/qt6-aarch64-sysroot)set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)EOF
cmake .. -DCMAKE_TOOLCHAIN_FILE=toolchain-aarch64.cmake
make -j$(nproc)# Copy binary sang Armbian
scp neostem user@armbian-ip:~/NEO_STEM/
9.5 Tối ưu cho 2GB RAM
Cấu hình swap (khuyến nghị)
# Tạo 1GB swap file
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# Thêm vào fstab để tự động mountecho'/swapfile none swap sw 0 0'| sudo tee -a /etc/fstab
Biến môi trường tối ưu QML
# Thêm vào ~/.bashrc hoặc script khởi chạyexport QT_QUICK_BACKEND=software # Nếu không có GPU driverexport QSG_RENDER_LOOP=basic # Giảm RAM cho render loopexport QT_QPA_PLATFORM=eglfs # Fullscreen không cần X11# Hoặc: export QT_QPA_PLATFORM=linuxfb # Fallback nếu không có EGL# Hoặc: export QT_QPA_PLATFORM=xcb # Nếu chạy trên X11# Giới hạn QML cacheexport QML_DISK_CACHE_PATH=/tmp/qmlcache
Tối ưu hệ thống
# Giảm swappiness (ưu tiên RAM)echo'vm.swappiness=10'| sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# Tắt các service không cần
sudo systemctl disable bluetooth
sudo systemctl disable cups
sudo systemctl disable ModemManager
9.6 Chạy ứng dụng
Chế độ 1: Fullscreen trên Framebuffer (Kiosk mode - khuyến nghị)