IOT

Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD

Giới thiệu ngắn gọn

Máy in nhiệt rất phổ biến trong cuộc sống hàng ngày của chúng ta, và có những ví dụ về máy in nhiệt trong nhà hàng, bãi đậu xe và khu mua sắm. Bài viết này sẽ tập trung vào ứng dụng của máy in nhiệt trong hệ thống bãi đậu xe.

Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Vật liệu được sử dụng

  • ĐÁ STWI101WT-01
  • Đầu máy in nhiệt FTP
  • Quả mâm xôi Pi pico
    • Máy vận hành bằng đồng xu
    Chức năngChức năng điều khiển hiển thị trên màn hình nối tiếp, giao diện chính chọn tầng, sau khi vào giao diện chính chọn chỗ để xe, đồng thời sẽ hiển thị số chỗ đậu xe trong ô chữ phía trên bên phải, sau đó chọn thời gian lưu trú, nó là hai bộ chọn văn bản cuộn, sau đó cũng tương tự sẽ hiển thị thông tin đặt hàng trong hộp văn bản ở trên cùng bên phải, theo đơn giá cố định nhân với thời gian lưu trú để có tổng giá. Sau đó, chỉ khi chỗ đậu xe và thời gian lưu trú được chọn, bạn có thể đến nút thanh toán, nếu không nó là không hợp lệ. Sau khi vào màn hình thanh toán, một bộ nhận xu sẽ được sử dụng. Khi đó màn hình sẽ hiển thị số xu cần bỏ vào và số xu đã được đưa vào, sau khi đã cho xu vào sẽ hiện ra thông báo thanh toán thành công. Sau đó bạn có thể chọn in phiếu nhỏ để in số địa điểm và thời gian lên giấy in nhiệt.Quá trình thiết kếLúc đầu, tôi muốn sử dụng Quả mâm xôi Pi pico để tạo ra một máy in nhỏ. Sau đó, trong quá trình lựa chọn các thành phần, tôi nghĩ rằng máy in nhiệt là thuận tiện hơn để đạt được, sau khi xác định chương trình, tôi bắt đầu mua phần cứng. Thực tế trong quá trình mua hàng online tôi thấy có rất nhiều máy in nhiệt có mạch driver tốt, đa số được làm bằng chip của stm, thiết kế theo bộ hướng dẫn riêng. Ví dụ, bằng cách sử dụng hướng dẫn của mình để cho máy in in ký tự hoặc đi ra giấy, nhưng máy in này tính thực tế rất cao, nhưng không có giá trị học tập. Đó là gửi hướng dẫn thông qua cổng nối tiếp trên đường dây, bạn có thể thao tác với máy in. Vì vậy, tôi nghĩ mình sẽ mua một đầu in và tự phát triển nó. Sau đó về đầu in, tôi chọn đầu in nhiệt ftp.Đầu in nhiệt ftp
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Đầu in này nên có sẵn trên toàn thế giới, các nguyên tắc cơ bản là tương tự nhau. Phía bên trái là một động cơ bước. Sau đó, đầu giữa là 6 đơn vị sưởi ấm. Mỗi đơn vị sưởi ấm có 64 điểm sưởi ấm trên đó. Vì vậy, tổng cộng có 384 điểm sưởi ấm. Sau đó, bên dưới là một chốt. Bên dưới chốt là một thanh ghi thay đổi. Cuối cùng, có một tín hiệu đồng hồ được cung cấp. Vì vậy, toàn bộ nguyên tắc hoạt động là cung cấp tín hiệu đồng hồ cho đầu in và sau đó gửi dữ liệu sau mỗi chu kỳ đồng hồ, sau khi gửi 384 tín hiệu đồng hồ và 384 dữ liệu, dữ liệu trong thanh ghi dịch sẽ được lưu trong chốt. Sau đó, chốt được đặt ở mức thấp. Sau đó, 384 điểm gia nhiệt sẽ chọn gia nhiệt hay không gia nhiệt tùy theo từng dữ liệu là 0 hay 1. Đồng thời, để động cơ bước quay để điều khiển giấy nhiệt để thiết kế ký tự mong muốn. Sau khi tôi nhận được bản in nhiệt cái đầu, tôi đã tiếp tục và yêu cầu một bảng dữ liệu và đó là cáp fpc 30pin. Vì vậy, rõ ràng là không thuận tiện lắm khi kết nối trực tiếp với pico với nó. Vì vậy, tôi nghĩ tốt hơn là tôi nên thiết kế một mạch bảng nối đa năng. Tôi có một Màn hình nối tiếp STONE là nguồn 12v, sau đó em xem điện áp đầu in nhiệt của một giá trị tham khảo là 7.6v, giá trị lớn nhất là 8v, sau đó cung cấp cho nó một điện áp khoảng 7.6v. Nó cũng có điện áp logic là 3.3v, và sau đó Raspberry Pi pico hỗ trợ nguồn điện tối đa 5v và nó có điện áp đầu ra 3.3v, sau đó thiết kế bộ nguồn có thể sử dụng hai dcdc, với nguồn điện 12v, một đầu ra dcdc 7.6v để cấp nguồn cho đầu in nhiệt, dcdc khác đầu ra 5v cho pico, và sau đó sử dụng 3.3v từ pico để cấp nguồn cho điện áp logic của đầu in nhiệt. Sau đó 12v dẫn đường trực tiếp đến màn hình nối tiếp.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Nhân tiện, động cơ bước cho đầu in nhiệt đó cũng cần được điều khiển. Tôi có một bộ tích hợp ống Darlington tích hợp. Nhưng nó quá lớn và là plug-in thẳng, vì vậy chỉ cần mua chip điều khiển. Sau đó, khía cạnh này của động cơ truyền động cũng ổn. In yêu cầu thiết kế phông chữ, về cơ bản mọi người đều sử dụng đèn flash spi để lưu trữ phông chữ, đây là một dự án lớn. Chỉ có mã ascii là hơn 100, vì vậy bạn cần mua một đèn flash SPF khác. Sau đó, toàn bộ kế hoạch gần như thế này.
    STONE Designer (Phần mềm GUI Designer)Từ:https://www.stoneitech.com/support/download/software
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Thiết kế mạchSau đó, sau đây bắt đầu thiết kế mạch. Đầu tiên là tìm bộ nguồn, thực ra lúc đầu mình dùng ổn áp 2492 đầu, vì mạch đơn giản, sau khi làm thì tình trạng nóng máy nghiêm trọng hơn trong quá trình gỡ lỗi, chạm vào rất nóng nên đổi sang dùng. dcdc. Chỉ cần theo dõi trực tiếp bảng dữ liệu chip để làm sơ đồ mạch. Ở đây tôi chọn mt2, nhưng tôi bỏ qua một thông số quan trọng là dòng hoạt động của đầu in, dòng ra tối đa của chip này là 2.3A, nhưng dòng hoạt động của đầu in là 0.3A, chênh lệch XNUMXA, nó cũng có thể được sử dụng, nhưng hiệu quả không cao nên chúng ta sẽ nói về hiệu quả cụ thể ở phần sau.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Sau đó, chip điều khiển động cơ mà tôi đã mua là lv8548, hãy xem bảng dữ liệu đầu in, trong đó có sơ đồ thời gian truyền động động cơ bước, theo thời gian của nó, để cung cấp cho nó tín hiệu pwm bốn chiều trên đó.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Sau đó là chip flash, với by25q32bs, dung lượng 32Mbit khá lớn, và kết nối với pico, chờ pico gọi.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Sau đó, sơ đồ mạch tổng thể như thế này, góc trên bên trái là ổ cắm giao tiếp và ổ cắm nguồn, bên dưới có còi (thực tế không sử dụng trong mạch), bên phải có một diode phát sáng, và góc dưới bên phải là fpc 30pin để kết nối đầu in.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Sau khi hoàn thành và có thể sử dụng được như hình dưới đây, bạn có thể cắm trực tiếp ổ cắm tiêu đề ghim trên bo mạch cho Raspberry Pi pico.
    Raspberry Pi pico
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Bật nguồn, đầu tiên không kết nối với pico và đầu in, đo điện áp đầu ra của dcdc, trong trường hợp bình thường một là khoảng 7.5v, còn lại là khoảng 5v.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Sau đó kết nối đầu in, màn hình nối tiếp và pico, đo điện áp logic khoảng 3.3v, sau khi không có vấn đề gì, bạn có thể viết chương trình.
    chương trìnhTôi định điều chỉnh động cơ bước trước, phần này rất dễ điều chỉnh, xem sơ đồ thời gian trong bảng dữ liệu, 8 chu kỳ đồng hồ, mỗi chu kỳ đồng hồ nên cung cấp tín hiệu logic riêng cho bốn chân của động cơ, sau 8 chu kỳ động cơ sẽ vặn lên rồi chỉnh tốc độ, nhưng giữa chừng phải thêm delay để chỉnh duty ratio nếu không nó quay nhanh quá, delay time mình set khoảng 5ms rồi sau khi cho nó quay thì phải cho level lại thấp, nếu không thì động cơ dường như không quay trên thực tế cuộn dây bên trong vẫn đang bật nguồn, sau một thời gian dài bạn có thể ngửi thấy mùi khét. Sau đó viết hàm, đặt thân máy vào một vòng lặp, số vòng lặp biểu thị chiều dài vòng quay của động cơ, chức năng có vẻ hơi dài, đặt nó ở một nơi khác và chờ cuộc gọi.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Đây là chức năng sau một vài thay đổi, tốc độ và thời lượng sẽ được truyền trong chương trình chính. Nó vẫn cần tối ưu hóa rất nhiều. Sau đó là điểm điều chỉnh đầu in, phần này khó đối với tôi, nó cần tín hiệu đồng hồ, bảng dữ liệu được ghi tối đa 8M, tôi nghĩ nó cần tín hiệu khoảng 8M tần số, thật khó, lần đầu tiên tôi đo tần số bằng mức lật io, sự khác biệt là quá nhiều. Rồi muốn dùng pio, nghiên cứu cả ngày trời mà kết quả không khả quan, kỹ năng cá nhân còn hạn chế, chắc cần tìm hiểu kỹ hướng dẫn sử dụng chip rp2040. Sau đó lật level 384 kỳ thử xem sao quy trình làm việc như thế này, khởi tạo 1 chân đầu vào dữ liệu, chốt 1 chân, 1 chân tín hiệu đồng hồ, 6 chân đơn vị in, sau đó thêm vào chốt, tất cả các chân khác đều kéo xuống mức thấp và sau đó gửi một dữ liệu trong một khoảng thời gian đồng hồ, sau khi chu kỳ 384 lần để đặt chốt thành 0, đặt đơn vị in 6 thành 1, sau đó điểm nào có dữ liệu điểm nào sẽ được làm nóng. Sau khi triển khai set thì kéo level lại. Sau khi viết chương trình và bắt đầu chạy thử thì thực sự nó không hoạt động, thực ra là do quá nhiều đơn vị in được điều khiển mà dòng không đủ, sau đó đổi lại cho ít hơn hai đơn vị in mức cao và kiểm tra lại.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Nó thực sự hoạt động! Nó in một đường ngang. Điều đó có nghĩa là không có giới hạn thấp hơn về tần số đồng hồ, sau đó bạn có thể chạy động cơ bước để in một đường thẳng đứng. pico luồng kép, sau đó để luồng khác chạy đồng bộ cho động cơ, sau đó viết chương trình và chạy. Dòng dọc đi ra.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Với các đường ngang và dọc, sau đó lấy một đường chéo, hãy chú ý đến một đơn vị in có 64 điểm, xác định độ dài, chẳng hạn như 32, sau đó chu kỳ 32 lần 384 tiết, mỗi kỳ chỉ đặt 64 dữ liệu đầu tiên là 1 và đặt 320 dữ liệu tiếp theo thành 0, sau đó 32 lần mỗi lần chỉ trong đơn vị đầu tiên để in một điểm và sau đó chu kỳ tăng dần, kết hợp với tốc độ của động cơ bước để điều chỉnh, và cuối cùng điều chỉnh kích thước 64 * 32 của đường chéo, trước tiên bạn cũng có thể đánh vần chữ Z.  
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Khi đó đề cương của chương trình đã có, muốn in được chữ bạn cần làm font chữ trước. Đầu tiên hãy viết một chữ cái in hoa, kích thước 32 * 32, với một danh sách các định nghĩa, tôi định làm ở đây với pin.value (), vì vậy hãy tạo phông chữ, sau đó sử dụng 32 hàng và 32 cột giá trị nhị phân để được gọi, lấy ra để thực hiện một ca thay đổi và sau đó chuyển đến pin.value (), vì vậy đây là quá trình thực hiện.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Với 0 làm nền và 1 làm nền trước, quá trình thực hiện thực tế sau đó trông như thế này.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Chu kỳ 32 lớn nhất bên ngoài đại diện cho chu kỳ 32 dòng, nghĩa là in 32 dòng, và sau đó 32 chu kỳ đầu tiên bên trong là làm nóng một nửa thiết bị sưởi đầu tiên, sau đó 352 chu kỳ còn lại sẽ được đặt thành 0, và sau đó trừ 1 từ 31 mỗi lần cho đến 0, bạn có thể đếm dòng đầu tiên của các điểm cần được làm nóng từ trái sang phải, và sau đó cứ sau 384 khoảng thời gian sẽ được hoàn thành khi chốt đặt 0 và bộ gia nhiệt đặt 1 và sau đó bạn có thể in, rồi in ra một từ A sau khi lặp lại 32 lần.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Vẫn in đậm, kiểu chữ ma trận điểm này, có công cụ trên mạng có thể làm trực tiếp, mặt trước cộng 0b rồi thêm dấu phẩy ở mặt sau, sau đó bạn chơi theo ý mình, phông chữ thực ra ban đầu dự định là được lưu trong chip flash, nhưng tôi điều chỉnh rất lâu vẫn không mở được.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Không biết vấn đề nằm ở đâu, sau này có thời gian mình sẽ chỉnh lại, cái hay là bản thân pico có flash cỡ 16mbit, lưu trữ một thư viện ascii vẫn đủ, rồi mình lưu trữ như vậy.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Định nghĩa nó bằng một từ điển, đặt nó trong một phần riêng biệt và gọi lại nó trong chương trình chính. Then after debugging, the available version looks like this.from machine import Pinfrom time import sleepimport _threadimport rp2from array import arrayimport ascii_kuimport speed_motor#import sysdelaytime = 0.0000001 # Printer clock delaymotor = speed_motor.motor_control(2, 3, 4, 5) # Initialize the printer’s internal stepper motor pins, corresponding to the a+/a-/b+/b- of the stepper motormov_bit = 0PRINTER_DIN = Pin(20, Pin.OUT)PRINTER_CLK = Pin(19, Pin.OUT)PRINTER_LAT = Pin(18, Pin.OUT, Pin.PULL_UP)STB1 = Pin(6, Pin.OUT, Pin.PULL_DOWN)STB2 = Pin(7, Pin.OUT, Pin.PULL_DOWN)STB3 = Pin(8, Pin.OUT, Pin.PULL_DOWN)STB4 = Pin(9, Pin.OUT, Pin.PULL_DOWN)STB5 = Pin(14, Pin.OUT, Pin.PULL_DOWN)STB6 = Pin(15, Pin.OUT, Pin.PULL_DOWN)lock = _thread.allocate_lock()ascii_code = ascii_ku.ascii_code() # Importing an ascii character libraryshuru = input(“Please enter text:”)line_word = []for item in range(len(shuru)):    line_word.append(shuru[item])# line_num = len(shuru)# bottom_line_num = len(shuru)%# global motor_speed = 0# global line = 0# if len(shuru) > 12:#     motor_speed = len(shuru) % 6#     if (len(shuru) % 6) == 0:#         motor_speed = 12# else:#     motor_speed = len(shuru)# print(motor_speed)motor_speed = len(shuru)line = (len(shuru) // 12) + 1if (len(shuru) % 12) == 0:    line -= 1lins = 0supper = 0slower = 0# _thread.start_new_thread(motor.run_stop, (0.005*motor_speed, 26*line))_thread.start_new_thread(motor.run_stop, (motor_speed, 1))# _thread.start_new_thread(motor.run_stop, (0.03, 56))def last_word_size32 (word_line, linss, lins, supper, slower):    for mov_bit in range((supper*32)+(slower*24)):        PRINTER_CLK.value(0)        sleep(delaytime)        PRINTER_DIN.value(0)        PRINTER_CLK.value(1)        sleep(delaytime)    for mov_bit in range(31, -1, -1):        word_bit = (word_line[linss] >> mov_bit)&0b00000000000000000000000000000001        PRINTER_CLK.value(0)        sleep(delaytime)        PRINTER_DIN.value(word_bit)        PRINTER_CLK.value(1)        sleep(delaytime)    for mov_bit in range(352-((supper*32)+(slower*24))):        PRINTER_CLK.value(0)        sleep(delaytime)        PRINTER_DIN.value(0)        PRINTER_CLK.value(1)        sleep(delaytime)    if (supper*32)+(slower*24) < 192:        PRINTER_LAT.value(0)        STB1.value(1)        STB2.value(1)        STB3.value(1)        sleep(0.005)        STB1.value(0)        STB2.value(0)        STB3.value(0)        PRINTER_LAT.value(1)    else:        PRINTER_LAT.value(0)        STB4.value(1)        STB5.value(1)        STB6.value(1)        sleep(0.005)        STB4.value(0)        STB5.value(0)        STB6.value(0)        PRINTER_LAT.value(1)def word_size24 (word_line, linss, lins, supper, slower):    for mov_bit in range((supper*32)+(slower*24)):        PRINTER_CLK.value(0)        sleep(delaytime)        PRINTER_DIN.value(0)        PRINTER_CLK.value(1)        sleep(delaytime)    for mov_bit in range(23, -1, -1):        word_bit = (word_line[linss] >> mov_bit)&0b000000000000000000000001        PRINTER_CLK.value(0)        sleep(delaytime)        PRINTER_DIN.value(word_bit)        PRINTER_CLK.value(1)        sleep(delaytime)    for mov_bit in range(360-((supper*32)+(slower*24))):        PRINTER_CLK.value(0)        sleep(delaytime)        PRINTER_DIN.value(0)        PRINTER_CLK.value(1)        sleep(delaytime)    if (supper*32)+(slower*24) < 192:        PRINTER_LAT.value(0)        STB1.value(1)        STB2.value(1)        STB3.value(1)        sleep(0.005)        STB1.value(0)        STB2.value(0)        STB3.value(0)        PRINTER_LAT.value(1)    else:        PRINTER_LAT.value(0)        STB4.value(1)        STB5.value(1)        STB6.value(1)        sleep(0.005)        STB4.value(0)        STB5.value(0)        STB6.value(0)        PRINTER_LAT.value(1)for linss in range(32):    supper=slower=0    if linss < 32:        for lins in range(len(line_word)):#             if lins//12:#                 break            if (line_word[lins].isupper() or line_word[lins].isdigit() or line_word[lins].isspace()):                last_word_size32 (ascii_code.code.get(line_word[lins]), linss%32, lins%12, supper, slower)                supper += 1            elif (line_word[lins].islower()):                word_size24 (ascii_code.code.get(line_word[lins]), linss%32, lins%12, supper, slower)                slower += 1    else:        if linss == 32:            sleep(5.8)        for lins in range(motor_speed):            if (line_word[lins].isupper()):                last_word_size32 (ascii_code.code.get(line_word[12]), linss%32, lins%12, len(line_word))#     elif:#         _thread.start_new_thread(motor.run_stop, (motor_speed, line))#     for linss in range(32):#         for lins in range(len(line_word)):#             if (line_word[lins].isupper()):#                 last_word_size32 (ascii_code.code.get(line_word[lins]), linss, lins, len(line_word))line_word.clear()I am separate control printing unit, because the current is not enough so like this, but in order to print clear, making my printing speed becomes particularly slow, the more words the slower, and then the lowercase letters is 24 * 32 dot matrix, that it is less print points to use, but can not give it to leave 32 heating points of space then the character spacing is large, so the capital letters and lowercase letters are separated, the numbers are still 32 * 32.
  • Đầu in nhiệt cho hệ thống quản lý bãi đậu xe dựa trên Raspberry Pi pico và STONE TFT LCD IOT PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
  • Finally, the whole program is attached.from machine import UART,Pinfrom time import sleepimport _threadimport rp2from array import arrayimport ascii_kuimport speed_motorfrom os import uname#import sysuart1 = UART(0, baudrate = 115200, tx =Pin(0), rx = Pin(1))floor1 = [‘f’, ‘l’, ‘o’, ‘o’, ‘r’,’1′]floor2 = [‘f’, ‘l’, ‘o’, ‘o’, ‘r’,’2′]floor3 = [‘f’, ‘l’, ‘o’, ‘o’, ‘r’,’3′]button_cmd = [16,1]selector_cmd = [16,129]print(uname()[0])delaytime = 0.0000001 # Printer clock delaycoin = Pin(22, Pin.IN,Pin.PULL_UP)coin_num = 0motor = speed_motor.motor_control(2, 3, 4, 5) # Initialize the printer’s internal stepper motor pins, corresponding to the a+/a-/b+/b- of the stepper motormov_bit = 0PRINTER_DIN = Pin(20, Pin.OUT)PRINTER_CLK = Pin(19, Pin.OUT)PRINTER_LAT = Pin(18, Pin.OUT, Pin.PULL_UP)STB1 = Pin(6, Pin.OUT, Pin.PULL_DOWN)STB2 = Pin(7, Pin.OUT, Pin.PULL_DOWN)STB3 = Pin(8, Pin.OUT, Pin.PULL_DOWN)STB4 = Pin(9, Pin.OUT, Pin.PULL_DOWN)STB5 = Pin(14, Pin.OUT, Pin.PULL_DOWN)STB6 = Pin(15, Pin.OUT, Pin.PULL_DOWN)lock = _thread.allocate_lock()ascii_code = ascii_ku.ascii_code() # Importing an ascii character library# shuru = ‘aa’# line_word = []# for item in range(len(shuru)):#     line_word.append(shuru[item])# line_num = len(shuru)# bottom_line_num = len(shuru)%# global motor_speed = 0# global line = 0# if len(shuru) > 6:#     motor_speed = len(shuru) % 6#     if (len(shuru) % 6) == 0:#         motor_speed = 12# else:#     motor_speed = len(shuru)# # print(motor_speed)# # line = (len(shuru) // 12) + 1# if (len(shuru) % 12) == 0:#     line -= 1lins = 0supper = 0slower = 0danjia = 0# _thread.start_new_thread(motor.run_stop, (0.005*motor_speed, 26*line))# _thread.start_new_thread(motor.run_stop, (motor_speed, line))# _thread.start_new_thread(motor.run_stop, (0.03, 56))def pay(pay):    global coin_num    line_word = {‘line_word1’:[‘s’,’i’,’t’,’e’,’:’,’F’,’1′,’-‘,’0′],’line_word2’:[‘0′,’d’,’a’,’y’,’2′,’h’,’o’,’u’,’r’],’line_word3′:[‘t’,’o’,’t’,’a’,’l’,’:’,’4′,’.’,’0′],’line_word4′:[‘T’,’o’,’t’,’a’,’l’,’:’,’4′,’.’,’0′]}    line_wors = {‘line_word1’:[‘U’,’n’,’i’,’t’,’:’,’2′,’.’,’0′,’0′],’line_word2′:[‘T’,’o’,’t’,’a’,’l’,’:’,’4′,’.’,’0′],                 ‘line_word3’:[‘U’,’n’,’i’,’t’,’:’,’2′,’.’,’0′,’0′],’line_word4′:[‘T’,’o’,’t’,’a’,’l’,’:’,’5′,’.’,’0′]}#     line_word1 = [‘S’,’i’,’t’,’e’,’:’,’F’,’1′,’-‘,’0’]#     line_word2 = [‘1′,’D’,’a’,’y’,’1′,’H’,’o’,’u’,’r’]#     line_word3 = [‘U’,’n’,’i’,’t’,’:’,’2′,’.’,’0′,’0′]#     line_word4 = [‘T’,’o’,’t’,’a’,’l’,’:’,’5′,’.’,’0′]#     line_word1[8]=str(pay[0])#     line_word2[0]=str(pay[1])#     line_word2[4]=str(pay[2])#     line_word4[6]=str(pay[3])    (line_word[‘line_word1’])[8]=str(pay[0])#     (line_word[‘line_word2’])[0]=str(pay[1])#     (line_word[‘line_word2’])[4]=str(pay[2])#     (line_word[‘line_word4’])[6]=str(pay[3])    sleep(1)    uart1.write(‘ST<{“cmd_code”:”set_value”,”type”:”image_value”,”widget”:”image_value4″,”value”:’+str(pay[3])+’}>ET’)#     sleep(2)#     print(line_word.get(‘line_word’+str(1))[0])#     print(‘zfdszfz’,line_word)#     sleep(2)#     uart1.write(‘ST<{“cmd_code”:”set_text”,”type”:”edit”,”widget”:”message5″,”text”:”F1 – ‘+pay[0]+'”}>ET’)#     uart1.sendbreak()#     sleep(1)#     uart1.write(‘ST<{“cmd_code”:”set_text”,”type”:”edit”,”widget”:”message6″,”text”:”‘+str(pay[1])+'”}>ET’)#     uart1.sendbreak()#     sleep(1)# #     uart1.write(‘ST<{“cmd_code”:”set_text”,”type”:”edit”,”widget”:”message22″,”text”:”‘+str(pay[2])+'”}>ET’)#     uart1.write(‘ST<{“cmd_code”:”set_text”,”type”:”edit”,”widget”:”message8″,”text”:”‘+str(pay[3])+'”}>ET’)    while True:        if coin.value()==0:            coin_num += 1            print(“Number of coins deposited:”,coin_num)            sleep(0.1)            uart1.write(‘ST<{“cmd_code”:”set_value”,”type”:”image_value”,”widget”:”image_value2″,”value”:’+str(coin_num)+’}>ET’)            if coin_num == pay[3]:                uart1.write(‘ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”image37″,”visible”:true}>ET’)                     if uart1.any()>1:            rx2 = []            data_name2 = ”            bin_data = uart1.read(40)            uart1.sendbreak()            rx1 = list(bin_data)            for item in rx1:                rx2.append(chr(item))            print(rx2)            if rx1[3:5:1] == button_cmd:                data_name_len = rx1[6] – 1                data_name = rx2[7:data_name_len+6:1]                data_name2 = ”.join(data_name)                print(data_name2)                if data_name2 == ‘back’:                    break                elif data_name2 == ‘print’ and coin_num == pay[3] and rx1[13] == 2:                    data_name2=”                    _thread.start_new_thread(motor.run_stop, (9, 4))                    for iii in range(1,3):                        for linss in range(32):                            supper=slower=0                            for lins in range(9):#                                 temp_list=ascii_code.code.get((‘line_word’+str(iii))[lins])#                                 print(temp_list,type(temp_list))                                if (line_word.get(‘line_word’+str(iii))[lins]).islower():                                    word_size24 (ascii_code.code.get(line_word.get(‘line_word’+str(iii))[lins]), linss%32, lins%12, supper, slower)                                    slower += 1                                else:                                    last_word_size32 (ascii_code.code.get(line_word.get(‘line_word’+str(iii))[lins]), linss%32, lins%12, supper, slower)                                    supper +=                         sleep(6)#                     for iii in range(1,2):#                         for linss in range(32):#                             supper=slower=0#                             for lins in range(9):# #                                 temp_list=ascii_code.code.get((‘line_word’+str(iii))[lins])# #                                 print(temp_list,type(temp_list))#                                 if (line_wors.get(‘line_word’+str(iii))[lins]).islower():#                                     word_size24 (ascii_code.code.get(line_wors.get(‘line_word’+str(iii))[lins]), linss%32, lins%12, supper, slower)#                                     slower += 1#                                 else:#                                     last_word_size32 (ascii_code.code.get(line_wors.get(‘line_word’+str(iii))[lins]), linss%32, lins%12, supper, slower)#                                     supper += 1#                     sleep(6)#                     for iii in range(1,2):#                         for linss in range(32):#                             supper=slower=0#                             for lins in range(9):# #                                 temp_list=ascii_code.code.get((‘line_word’+str(iii))[lins])# #                                 print(temp_list,type(temp_list))#                                 if (line_wors.get(‘line_word’+str(iii))[lins]).islower():#                                     word_size24 (ascii_code.code.get(line_wors.get(‘line_word’+str(iii))[lins]), linss%32, lins%12, supper, slower)#                                     slower += 1#                                 else:#                                     last_word_size32 (ascii_code.code.get(line_wors.get(‘line_word’+str(iii))[lins]), linss%32, lins%12, supper, slower)#                                     supper += 1def floor1def():    day_jia = 0    hour_jia = 0    day_flag = False    hour_flag = False    price_flag = False    posltion = False    zongjia = 0    pay1 = [0,0,0,0]    print(“floor1 now”)#     uart1.write(‘ST<{“cmd_code”:”set_text”,”type”:”edit”,”widget”:”message3″,”text”:”2.00$/H”}>ET’)    uart1.sendbreak()    while True:        if uart1.any()>1:            rx2 = []            data_name2 = ”            bin_data = uart1.read(40)            uart1.sendbreak()            rx1 = list(bin_data)            for item in rx1:                rx2.append(chr(item))            print(rx2)            if rx1[3:5:1] == button_cmd:                data_name_len = rx1[6] – 1                data_name = rx2[7:data_name_len+6:1]                data_name2 = ”.join(data_name)                print(data_name2)                if data_name2 == ‘back’:                    break                elif data_name2 == ‘position’:                    posltion = True                    pay1[0]=rx2[15]                    write1(rx2[15])                elif data_name2 == ‘pay’ and posltion and price_flag:                    uart1.write(‘ST<{“cmd_code”:”open_win”,”type”:”window”,”widget”:”window7″}>ET’)                    pay(pay1)#                 if data_name2 == ‘pay’ and posltion = True and (day_flag or hour_flag):#                     posltion = True#                     uart1.write(‘ST<{“cmd_code”:”open_win”,”type”:”window”,”widget”:”window7″}>ET’)            if rx1[3:5:1] == selector_cmd:                data_name_len = rx1[6] – 4                data_name = rx2[7:data_name_len+7:1]                data_name2 = ”.join(data_name)                print(data_name2)                if data_name2 == ‘time_day1’:                    pay1[1]=rx2[19]                    write2(ord(rx2[19]))                    day_jia = ord(rx2[19])                    day_flag = True                elif data_name2 == ‘time_hour1’:                    pay1[2]=rx2[20]                    write3(ord(rx2[20]))                    hour_jia = ord(rx2[20])                    hour_flag = True            if hour_flag or day_flag:                price_flag = True                zongjia = (day_jia*48) + (hour_jia*2)                pay1[3]=zongjia                print(str(zongjia))                uart1.write(‘ST<{“cmd_code”:”set_text”,”type”:”edit”,”widget”:”message4″,”text”:”‘+str(zongjia)+'”}>ET’)                hour_flag = day_flag = Falsedef floor2def():    passdef floor3def():    passdef write1(num):    #print(ss)    for item in range(49,55):        uart1.write(‘ST<{“cmd_code”:”set_image”,”type”:”image”,”widget”:”image1_’+chr(item)+'”,”image”:”nocar_bg”}>ET’)    uart1.write(‘ST<{“cmd_code”:”set_image”,”type”:”image”,”widget”:”image1_’+num+'”,”image”:”selectedcar_bg2″}>ET’)    uart1.write(‘ST<{“cmd_code”:”set_text”,”type”:”edit”,”widget”:”message1″,”text”:”F1 – ‘+num+'”}>ET’)def write2(num):#     danjia = 1    uart1.write(‘ST<{“cmd_code”:”set_text”,”type”:”edit”,”widget”:”message2″,”text”:”‘+str(num)+'”}>ET’)#     if danjia == 1:#         uart1.write(‘ST<{“cmd_code”:”set_text”,”type”:”edit”,”widget”:”message3″,”text”:”2.00$/H”}>ET’)def write3(num):#     danjia = 1    uart1.write(‘ST<{“cmd_code”:”set_text”,”type”:”edit”,”widget”:”message22″,”text”:”‘+str(num)+'”}>ET’)#     if danjia == 1:#         uart1.write(‘ST<{“cmd_code”:”set_text”,”type”:”edit”,”widget”:”message3″,”text”:”2.00$/H”}>ET’)def last_word_size32 (word_line, linss, lins, supper, slower):    for mov_bit in range((supper*32)+(slower*24)):        PRINTER_CLK.value(0)        sleep(delaytime)        PRINTER_DIN.value(0)        PRINTER_CLK.value(1)        sleep(delaytime)    for mov_bit in range(31, -1, -1):        word_bit = (word_line[linss] >> mov_bit)&0b00000000000000000000000000000001        PRINTER_CLK.value(0)        sleep(delaytime)        PRINTER_DIN.value(word_bit)        PRINTER_CLK.value(1)        sleep(delaytime)    for mov_bit in range(352-((supper*32)+(slower*24))):        PRINTER_CLK.value(0)        sleep(delaytime)        PRINTER_DIN.value(0)        PRINTER_CLK.value(1)        sleep(delaytime)    if (supper*32)+(slower*24) < 192:        PRINTER_LAT.value(0)        STB1.value(1)        STB2.value(1)        STB3.value(1)        STB4.value(1)        sleep(0.005)        STB1.value(0)        STB2.value(0)        STB3.value(0)        STB4.value(0)        PRINTER_LAT.value(1)    else:        PRINTER_LAT.value(0)        STB4.value(1)        STB5.value(1)        STB6.value(1)        sleep(0.005)        STB4.value(0)        STB5.value(0)        STB6.value(0)        PRINTER_LAT.value(1)#         PRINTER_LAT.value(0)#         STB1.value(1)#         STB2.value(1)#         STB3.value(1)#         STB4.value(1)#         STB5.value(1)#         STB6.value(1)#         sleep(0.005)#         STB1.value(0)#         STB2.value(0)#         STB3.value(0)#         STB4.value(0)#         STB5.value(0)#         STB6.value(0)#         PRINTER_LAT.value(1)   def word_size24 (word_line, linss, lins, supper, slower):    for mov_bit in range((supper*32)+(slower*24)):        PRINTER_CLK.value(0)        sleep(delaytime)        PRINTER_DIN.value(0)        PRINTER_CLK.value(1)        sleep(delaytime)    for mov_bit in range(23, -1, -1):        word_bit = (word_line[linss] >> mov_bit)&0b000000000000000000000001        PRINTER_CLK.value(0)        sleep(delaytime)        PRINTER_DIN.value(word_bit)        PRINTER_CLK.value(1)        sleep(delaytime)    for mov_bit in range(360-((supper*32)+(slower*24))):        PRINTER_CLK.value(0)        sleep(delaytime)        PRINTER_DIN.value(0)        PRINTER_CLK.value(1)        sleep(delaytime)    if (supper*32)+(slower*24) < 192:        PRINTER_LAT.value(0)        STB1.value(1)        STB2.value(1)        STB3.value(1)        sleep(0.005)        STB1.value(0)        STB2.value(0)        STB3.value(0)        PRINTER_LAT.value(1)    else:        PRINTER_LAT.value(0)        STB4.value(1)        STB5.value(1)        STB6.value(1)        sleep(0.005)        STB4.value(0)        STB5.value(0)        STB6.value(0)        PRINTER_LAT.value(1)#         PRINTER_LAT.value(0)#         STB1.value(1)#         STB2.value(1)#         STB3.value(1)#         STB4.value(1)#         STB5.value(1)#         STB6.value(1)#         sleep(0.005)#         STB1.value(0)#         STB2.value(0)#         STB3.value(0)#         STB4.value(0)#         STB5.value(0)#         STB6.value(0)#         PRINTER_LAT.value(1)while True:    if uart1.any()>1:        rx2 = []        data_name2 = ”        bin_data = uart1.read(40)        uart1.sendbreak()        rx1 = list(bin_data)        for item in rx1:            rx2.append(chr(item))        print(rx2)        if rx2[7:13:1] == floor1:            floor1def()        elif rx2[7:13:1] == floor2:            floor2def()        elif rx2[7:13:1] == floor3:            floor3def()for linss in range(32):    supper=slower=0    if linss < 32:        for lins in range(len(line_word)):#             if lins//12:#                 break            if (line_word[lins].isupper() or line_word[lins].isdigit() or line_word[lins].isspace()):                last_word_size32 (ascii_code.code.get(line_word[lins]), linss%32, lins%12, supper, slower)                supper += 1            elif (line_word[lins].islower()):                word_size24 (ascii_code.code.get(line_word[lins]), linss%32, lins%12, supper, slower)                slower += 1    else:        if linss == 32:            sleep(5.8)        for lins in range(motor_speed):            if (line_word[lins].isupper()):                last_word_size32 (ascii_code.code.get(line_word[12]), linss%32, lins%12, len(line_word))#     elif:#         _thread.start_new_thread(motor.run_stop, (motor_speed, line))#     for linss in range(32):#         for lins in range(len(line_word)):#             if (line_word[lins].isupper()):#                 last_word_size32 (ascii_code.code.get(line_word[lins]), linss, lins, len(line_word)line_word.clear()
  • Nguồn: Plato Data Intelliigence