# VHITEK Maker ## Về VHITEK Maker URL: https://maker.vhitek.vn/gioi-thieu VHITEK Maker là chỗ những người làm kỹ thuật ở VHITEK viết lại thứ mình vừa làm xong: một mạch chạy được, một con firmware sửa mãi mới hết treo, một buổi cuối tuần in hỏng bốn lần mới ra chi tiết vừa khít. ## Ở đây có gì - Bài kỹ thuật có số đo, có code, có ảnh thật của thứ đã dựng - Ghi chép thất bại — phần mà tài liệu chính thức không bao giờ kể - Đồ chơi cuối tuần: dự án cá nhân, không phải sản phẩm công ty ## Ở đây không có gì Không phải trang bán hàng. Sản phẩm và dịch vụ của VHITEK nằm ở vhitek.vn và congnghechivi.vn. Bài ở đây viết cho người làm kỹ thuật đọc, không viết cho người mua hàng đọc. ## Ai viết Kỹ sư, intern và sinh viên thực tập tại VHITEK, mỗi người một tài khoản có tên thật. Bài trong chuyên mục Đồ chơi cuối tuần là quan điểm và thử nghiệm cá nhân của tác giả, không phải khuyến nghị kỹ thuật chính thức của công ty. ## Liên hệ URL: https://maker.vhitek.vn/lien-he Thấy bài nào sai kỹ thuật thì báo — sai mà không ai nói là thứ tệ nhất có thể xảy ra với một blog kỹ thuật. - Email: info@vhitek.vn - Hotline: 0704486101 - Địa chỉ: 51 đường 105C Trịnh Quang Nghị, phường Bình Đông, TP. Hồ Chí Minh Muốn thực tập ở VHITEK và viết ở đây thì gửi email kèm một thứ bạn đã làm — mạch, code, mô hình in, gì cũng được, miễn là của bạn. ## Quy tắc bình luận URL: https://maker.vhitek.vn/quy-tac-binh-luan ## Bình luận được duyệt trước khi hiện Mọi bình luận vào hàng đợi chờ duyệt. Biên tập viên duyệt trong 24 giờ ngày làm việc. Bình luận không hiện ngay không có nghĩa là đã bị từ chối. ## Cái gì bị từ chối - Quảng cáo, rải link, nội dung không liên quan tới bài - Công kích cá nhân - Nội dung vi phạm pháp luật Việt Nam Phản biện kỹ thuật, kể cả gay gắt, thì không nằm trong danh sách trên. Chỉ ra một bài sai chỗ nào là đóng góp, không phải công kích. ## Chúng tôi lưu gì Khi bạn gửi bình luận, hệ thống lưu: tên hiển thị, nội dung, địa chỉ IP và chuỗi nhận dạng trình duyệt. IP và trình duyệt chỉ dùng để chống spam và lạm dụng, không dùng cho quảng cáo, và bị xoá sau 90 ngày. Email của bạn KHÔNG được lưu ở dạng đọc được — hệ thống chỉ giữ một chuỗi băm một chiều, đủ để tìm lại bình luận của bạn khi bạn yêu cầu xoá, và không đủ để khôi phục địa chỉ email. Email không bao giờ xuất hiện trên trang công khai. ## Yêu cầu xoá Gửi email tới info@vhitek.vn kèm địa chỉ email bạn đã dùng khi bình luận. Chúng tôi xoá bình luận và toàn bộ dữ liệu kèm theo trong 30 ngày. ## Đọc DS18B20 trên ESP32 mà không treo vòng lặp chính URL: https://maker.vhitek.vn/tin-tuc/doc-cam-bien-nhiet-do-ds18b20-tren-esp32 (2026-08-10) DS18B20 nói chuyện qua 1-Wire, và ở độ phân giải 12 bit nó cần 750 mili giây để chuyển đổi xong một lần đo. Viết theo kiểu sách giáo khoa thì vòng lặp chính đứng im đúng 750ms đó — trên một thiết bị còn phải nháy LED và trả lời nút bấm thì người dùng thấy ngay. ## Cách sai mà ai cũng viết đầu tiên ```python import time, onewire, ds18x20 from machine import Pin ds = ds18x20.DS18X20(onewire.OneWire(Pin(4))) roms = ds.scan() while True: ds.convert_temp() time.sleep_ms(750) # <-- cả con chip đứng ở đây for rom in roms: print(ds.read_temp(rom)) ``` 750ms nhân với mỗi chu kỳ đo. Nếu đo mỗi giây thì ba phần tư thời gian sống của con chip là ngồi đợi một cảm biến. ## Tách yêu cầu đo ra khỏi lúc đọc kết quả 1-Wire không bắt phải đợi. Ra lệnh chuyển đổi, đi làm việc khác, quay lại đọc khi đã đủ 750ms: ```python import time, onewire, ds18x20 from machine import Pin ds = ds18x20.DS18X20(onewire.OneWire(Pin(4))) roms = ds.scan() deadline = 0 pending = False while True: now = time.ticks_ms() if not pending: ds.convert_temp() deadline = time.ticks_add(now, 760) # 750 + biên an toàn pending = True elif time.ticks_diff(deadline, now) <= 0: for rom in roms: print(ds.read_temp(rom)) pending = False nhap_nhay_led() # vòng lặp chính vẫn chạy ``` `ticks_diff` chứ không phải phép trừ thường: bộ đếm của MicroPython tràn, và phép trừ trực tiếp sẽ cho một số âm khổng lồ đúng lúc tràn — lỗi chỉ xuất hiện sau vài chục ngày chạy liên tục, đúng loại lỗi khó nhất để bắt. ## Hai thứ hay quên 1. Điện trở kéo lên 4.7kΩ giữa DQ và VCC. Thiếu nó mạch vẫn 'chạy' ở bàn nhưng sai số loạn khi dây dài ra. 2. Độ phân giải cấu hình được. Xuống 9 bit thì chỉ cần 94ms, đổi lại bước đo 0.5°C — với bài toán theo dõi nhiệt phòng thì đó là đánh đổi đáng. ## Bốn lần in hỏng mới ra chi tiết vừa khít URL: https://maker.vhitek.vn/tin-tuc/in-3d-chi-tiet-vua-khit-sau-bon-lan-hong (2026-08-07) Cần một cái ngàm giữ board ESP32 vào hộp có sẵn. Bản vẽ đúng, thước kẹp đúng, in ra thì không lắp vừa. Bốn lần. ## Lần 1 — in đúng số đo Khe 22.0mm cho board rộng 22.0mm. Không lắp được. Nhựa nở khi đùn, lỗ luôn nhỏ hơn thiết kế và trục luôn to hơn — máy FDM nào cũng vậy, khác nhau ở mức độ. ## Lần 2 — cộng bừa 0.5mm Lắp vào thì lỏng lẻo, rung là rơi. Đoán mò không thay được đo đạc. ## Lần 3 — in thang đo dung sai In một dải khe từ 22.1 đến 22.6mm, bước 0.1mm, mất 18 phút. Khe 22.3mm khít tay. Con số đó là của máy này, nhựa này, nhiệt độ này — đổi cuộn nhựa là phải đo lại. ## Lần 4 — và thứ suýt quên Chi tiết vừa khít, nhưng in đứng nên lớp xếp vuông góc với lực kéo, bẻ nhẹ là gãy theo thớ. Xoay 90° khi in, cùng file, cùng dung sai, không gãy nữa. Bài học không phải con số 22.3. Là: đo dung sai của máy một lần rồi ghi lại, và nghĩ về hướng lực trước khi bấm in. ## Vì sao tìm kiếm tiếng Việt ở VCMS phải dùng cột sinh ra URL: https://maker.vhitek.vn/tin-tuc/vi-sao-tim-kiem-tieng-viet-can-cot-sinh-ra (2026-08-04) Yêu cầu nghe đơn giản: gõ 'may giat' phải ra 'Máy giặt', và ngược lại. Postgres có `unaccent`, có `tsvector`, tưởng là xong trong một buổi chiều. ## Chỗ nó gãy ```sql ALTER TABLE posts ADD COLUMN search_tsv tsvector GENERATED ALWAYS AS (to_tsvector('vietnamese', unaccent(title))) STORED; -- ERROR: generation expression is not immutable ``` `unaccent()` là VOLATILE, vì nó đọc một từ điển có thể đổi trong lúc chạy. Cột generated bắt buộc IMMUTABLE. Postgres không đoán, nó từ chối. ## Cách đi vòng ```sql CREATE OR REPLACE FUNCTION public.f_unaccent(text) RETURNS text LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT AS $$ SELECT public.unaccent('public.unaccent', $1) $$; ``` Dạng hai tham số chỉ đích danh từ điển, nên kết quả không phụ thuộc `search_path` — đó là điều kiện để tuyên bố IMMUTABLE mà không nói dối. Cũng phải dùng `to_tsvector(regconfig, text)` hai tham số: dạng một tham số chỉ STABLE và cũng bị từ chối. ## Thứ đáng nhớ Khi Postgres nói 'not immutable', nó không bắt bẻ vặt. Nó đang nói: nếu cho phép, index sẽ trỏ vào dữ liệu không còn đúng nữa, và bạn sẽ mất hàng trong kết quả tìm kiếm mà không có lỗi nào báo.