Công cụ mở cửa nhà để xe Raspberry Pi 3: 15 bước (có hình ảnh)
Công cụ mở cửa nhà để xe Raspberry Pi 3: 15 bước (có hình ảnh)
Anonim
Công cụ mở cửa nhà để xe Raspberry Pi 3
Công cụ mở cửa nhà để xe Raspberry Pi 3

Tôi đã tạo hướng dẫn này vào năm 2014. Đã có nhiều thay đổi kể từ đó. Vào năm 2021, tôi đã cập nhật Công cụ mở cửa nhà để xe thông minh tại đây.

Sử dụng Raspberry Pi và điện thoại thông minh để mở, đóng và giám sát cửa nhà để xe. Việc mở và đóng cửa được đảm bảo an toàn bằng cách sử dụng các chứng chỉ tự ký được cài đặt trên điện thoại di động của gia đình. Nếu cửa nhà để xe mở khi không nên, hãy gửi tin nhắn văn bản (SMS) đến điện thoại di động.

Cửa nhà để xe đã được sử dụng liên tục từ cuối năm 2014. Trong những năm qua, tôi đã cố gắng giữ cho những thay đổi được cập nhật. Có một phụ lục mô tả những thay đổi đối với hướng dẫn.

Mục tiêu của dự án này là:

  • Làm cho hướng dẫn đầu tiên của tôi - Tôi không có kế hoạch đăng điều này, nhưng tôi đã nhận được nhiều yêu cầu
  • Mở cửa nhà để xe bằng điều khiển từ xa tiêu chuẩn
  • Mở cửa nhà để xe bằng chuông cửa treo tường nhà để xe
  • Mở cửa nhà để xe bằng SmartPhone
  • Theo dõi trạng thái của cửa gara từ xa qua điện thoại di động hoặc máy tính xách tay (nó đang mở hay đóng?)
  • Gửi tin nhắn văn bản đến điện thoại di động của tôi nếu cửa mở khi cần đóng lại
  • Giữ cửa nhà để xe an toàn (ví dụ: khi mất điện, cửa không được mở)
  • Không cho phép bất kỳ ai khác trên mạng mở cửa (chứng chỉ SSL tự ký hai chiều)
  • Sử dụng WiFi thay vì kết nối có dây
  • Sử dụng Raspberry Pi 3

Cơ sở cho việc triển khai Công cụ mở cửa nhà để xe này được bắt nguồn từ Công cụ mở cửa nhà để xe có thể hướng dẫn: Raspberry Pi của bộ tứ. Ban đầu, tôi sử dụng Raspberry Pi kiểu B +, sau đó chuyển sang Raspberry Pi 2 kiểu B và bây giờ nó sử dụng Raspberry Pi 3.

Tôi đã sử dụng MacBook để giao tiếp với Raspberry Pi, nhưng bất kỳ máy tính nào cũng có thể sử dụng được.

Không có lý do thuyết phục nào để chế tạo thiết bị này, nhưng nó rất vui. Sẽ tiết kiệm chi phí hơn nếu mua một cái. Một thiết bị tương tự có thể được mua với giá khoảng $ 130 USD.

  • Thang máy chính 828LM
  • Chamberlain MyQ $ 129
  • Cổng GoGo $ 179
  • Thợ thủ công $ 100

Ghi chú:

  • Văn bản được bao gồm trong các mảnh, như thế này ♣ thay thế-này ♣ phải được thay thế bằng một giá trị thực tế
  • Văn bản màu xanh lam được gạch dưới Arduino là một liên kết. Trong trường hợp này, nó là một liên kết đến phiên bản arduino của dụng cụ mở cửa nhà để xe.
  • Tôi đã cố gắng ghi có mọi nguồn được sử dụng. Tôi xin lỗi vì bất kỳ thiếu sót nào. Hầu hết tài liệu này dựa trên công việc của người khác.
  • $ cho biết một lệnh được thực thi trong cửa sổ đầu cuối trên MacBook và thường đang được thực thi trên Raspberry Pi

Bước 1: Thu thập các bộ phận

Mua hoặc tập hợp các bộ phận và công cụ (giá bằng USD).

  • Raspberry Pi 3 Model B Newark Element14 $ 35
  • Bộ đổi nguồn USB 5.2V 2.5A từ Amazon $ 9,99
  • Cáp Micro USB sang USB dài 6ft từ Amazon $ 7,99
  • Vỏ từ Amazon $ 6,99
  • SanDisk Ultra 16 GB microSDHC Class 10 với Bộ điều hợp (SDSQUAN-016G-G4A) từ Amazon $ 8,99
  • SunFounder 2 Kênh 5V Relay Shield Mô-đun cho Arduino UNO 2560 1280 ARM PIC AVR STM32 Raspberry Pi - $ 6,79
  • 3x Dây nhảy Nữ-Nữ. Mua tại Fry’s với giá 4,95 đô la.
  • DNS động $ 40 mỗi năm cho 30 tên (dyn.com)
  • 1-Gang 18 cu. trong. Hộp ổ cắm và công tắc tường hạng nặng Old Work, $ 3,12
  • Tấm tường trắng Ultra Pro Single Brush, $ 7,88
  • SECO-LARM SM 226L, Cảm biến cửa nhà để xe, giá rất khác nhau, $ 9,99 trên Amazon với giao hàng miễn phí
  • 50ft dây điều nhiệt rắn, Home Depot hoặc Lowe's, ~ $ 20

Tổng của tôi: ~ $ 172,00

Tôi đã có các bộ phận, công cụ và dịch vụ sau:

  • Cáp Ethernet CAT5
  • Dây khổ nhỏ, dài 6 ft
  • Tuốc nơ vít đầu Phillips
  • Kìm mũi kim
  • Máy cắt hộp
  • Trình điều khiển vít đầu phẳng của Jewelers, cần thiết để nới lỏng các vít trên rơ le
  • MacBook (có thể sử dụng PC)
  • AT&T GigaPower (có thể sử dụng bất kỳ nhà cung cấp dịch vụ internet nào)

Bước 2: Thiết lập Raspberry Pi mà không cần màn hình hoặc bàn phím

Thiết lập Raspberry Pi mà không cần màn hình hoặc bàn phím
Thiết lập Raspberry Pi mà không cần màn hình hoặc bàn phím

Tất cả các dự án Raspberry Pi đều yêu cầu một số kiểu thiết lập. Tôi thích sử dụng cùng một bộ hướng dẫn và khi cần thiết, có một nơi để cập nhật các hướng dẫn đó.

Thiết lập Raspberry Pi bằng cách sử dụng hướng dẫn sau:

Thiết lập Raspberry Pi mà không cần Màn hình hoặc Bàn phím

Hướng dẫn ở trên bao gồm các bước tùy chọn trong phụ lục. Đảm bảo thực hiện bước:

Thêm chứng chỉ phía máy khách vào máy chủ web

Tắt máy Raspberry Pi

$ sudo tắt máy -h 0

Sau khi tắt máy, hãy xóa

  • cáp ethernet
  • Cáp nối tiếp USB

Những thứ này sẽ không cần thiết nữa. Sử dụng wifi, ssh và cửa sổ đầu cuối trên Mac Book để chạy các lệnh trên Raspberry Pi.

Rút phích cắm điện và cắm lại nguồn và raspberry pi sẽ khởi động lại.

Bước 3: Cài đặt Wiring Pi, Apache và PHP

Cài đặt Wiring Pi

Mở cửa sổ dòng lệnh trên Mac Book. Đăng nhập vào Raspberry Pi, sau đó tải xuống, biên dịch và cài đặt Wiring Pi. Phần mềm này cho phép điều khiển các chân GPIO. Đây là hướng dẫn từng bước:

wiringpi.com/download-and-install/

Đây là phiên bản cô đọng của các hướng dẫn:

$ ssh pi @ ♣ raspberry-pi-ip ♣

password: ♣ password ♣ $ sudo apt-get install git-core $ git clone git: //git.drogon.net/wiringPi $ cd wiringPi $ git pull origin $./build

Chạy lệnh gpio để kiểm tra cài đặt:

$ gpio -v

gpio phiên bản: 2.29 Bản quyền (c) 2012-2015 Gordon Henderson Đây là phần mềm miễn phí với TUYỆT ĐỐI KHÔNG CÓ BẢO HÀNH. Để biết chi tiết, loại: gpio -warranty Raspberry Pi Chi tiết: Loại: Mẫu 2, Bản sửa đổi: 1.1, Bộ nhớ: 1024MB, Nhà sản xuất: Sony [OV] Cây thiết bị được bật. Raspberry Pi này hỗ trợ truy cập GPIO cấp người dùng. -> Xem trang man để biết thêm chi tiết $ gpio readall + ----- + ----- + --------- + ------ + --- + --- Pi 2 --- + --- + ------ + --------- + ----- + ----- + | BCM | wPi | Tên | Chế độ | V | Vật lý | V | Chế độ | Tên | wPi | BCM | + ----- + ----- + --------- + ------ + --- + ---- ++ ---- + --- + - ----- + --------- + ----- + ----- + | | | 3,3v | | | 1 || 2 | | | 5v | | | | 2 | 8 | SDA.1 | VÀO | 1 | 3 || 4 | | | 5V | | | | 3 | 9 | SCL.1 | VÀO | 1 | 5 || 6 | | | 0v | | | | 4 | 7 | GPIO. 7 | NGOÀI RA | 1 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 | | | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 | | 17 | 0 | GPIO. 0 | VÀO | 0 | 11 || 12 | 0 | VÀO | GPIO. 1 | 1 | 18 | | 27 | 2 | GPIO. 2 | VÀO | 0 | 13 || 14 | | | 0v | | | | 22 | 3 | GPIO. 3 | VÀO | 0 | 15 || 16 | 1 | VÀO | GPIO. 4 | 4 | 23 | | | | 3,3v | | | 17 || 18 | 0 | VÀO | GPIO. 5 | 5 | 24 | | 10 | 12 | MOSI | VÀO | 0 | 19 || 20 | | | 0v | | | | 9 | 13 | MISO | VÀO | 0 | 21 || 22 | 0 | VÀO | GPIO. 6 | 6 | 25 | | 11 | 14 | SCLK | VÀO | 0 | 23 || 24 | 1 | VÀO | CE0 | 10 | 8 | | | | 0v | | | 25 || 26 | 1 | VÀO | CE1 | 11 | 7 | | 0 | 30 | SDA.0 | VÀO | 1 | 27 || 28 | 1 | VÀO | SCL.0 | 31 | 1 | | 5 | 21 | GPIO.21 | VÀO | 1 | 29 || 30 | | | 0v | | | | 6 | 22 | GPIO.22 | VÀO | 1 | 31 || 32 | 0 | VÀO | GPIO.26 | 26 | 12 | | 13 | 23 | GPIO.23 | VÀO | 0 | 33 || 34 | | | 0v | | | | 19 | 24 | GPIO.24 | VÀO | 0 | 35 || 36 | 0 | VÀO | GPIO.27 | 27 | 16 | | 26 | 25 | GPIO.25 | VÀO | 0 | 37 || 38 | 0 | VÀO | GPIO.28 | 28 | 20 | | | | 0v | | | 39 || 40 | 0 | VÀO | GPIO.29 | 29 | 21 | + ----- + ----- + --------- + ------ + --- + ---- ++ ---- + --- + - ----- + --------- + ----- + ----- + | BCM | wPi | Tên | Chế độ | V | Vật lý | V | Chế độ | Tên | wPi | BCM | + ----- + ----- + --------- + ------ + --- + --- Pi 2 --- + --- + --- --- + --------- + ----- + ----- +

Các lệnh trên sẽ cung cấp cho bạn một số niềm tin rằng wiringPi đang hoạt động OK.

Cài đặt Apache và PHP

Chạy các lệnh sau:

$ cd..

$ sudo apt-get update $ sudo apt-get install apache2 php5 libapache2-mod-php5

Để xác minh máy chủ web hoạt động, hãy mở trình duyệt và trong hộp URL, hãy nhập:

♣ raspberry-pi-ip ♣

Trang web mặc định của Apache phản hồi bằng "Nó hoạt động!"

Bước 4: Trang web

Mở cửa sổ dòng lệnh trên Mac Book. Đăng nhập vào Raspberry Pi, sau đó xóa tệp index.html mặc định, thay đổi quyền trên thư mục trang web và chỉnh sửa tệp có tên index.php.

$ ssh pi @ ♣ raspberry-pi-ip ♣

mật khẩu: ♣ password ♣ $ sudo rm /var/www/index.html $ sudo chown pi: root / var / www $ sudo nano /var/www/index.php

Và nhập mã sau:

Thợ mở nhà để xe

Tự động hóa gia đình

<? php if ($ switch == 1) {echo"

";} khác {echo"

"; } ?>

Dụng cụ mở cửa nhà để xe Hướng dẫn sử dụng Cửa mở Nhà để xe đóng 1 mở 0
<? php if ($ trigger == 0) {echo "<td colspan = \" 4 / "} else {echo"

var13 ->

CTRL-o và ENTER để ghi tệp và CTRL-x để thoát khỏi trình chỉnh sửa.

Thay đổi quyền đối với tệp

$ sudo chmod 664 /var/www/index.php

Bước 5: Hình ảnh trang web

Hình ảnh trang web
Hình ảnh trang web
Hình ảnh trang web
Hình ảnh trang web

Tải công cụ mở cửa nhà để xe từ xa có độ phân giải cao từ web. Sửa đổi hình ảnh như bạn muốn bằng cọ vẽ Mac. Trong hình trên, một Genie Garage Opener có độ phân giải cao đã được sử dụng, logo pi mâm xôi được thêm vào và đèn led đã được loại bỏ.

Một hình ảnh là hình nền (remote-background.jpg) và hình ảnh còn lại là hình ảnh hoạt động (remote-press.jpg).

Kế hoạch là khi nhấn nút, thay vì nhấp nháy đèn led, mâm xôi sẽ nhấp nháy. Tôi đã đơn giản hóa trang web.

Sao chép các hình ảnh vào mâm xôi pi:

$ scp *-j.webp

mật khẩu: ♣ mật khẩu ♣

Trang web có một nút nhấn duy nhất. Để xác minh, hãy mở trình duyệt và nhập ♣ raspberry-pi-ip ♣. Thay vì trang web mặc định của Apache, có nội dung "Nó hoạt động!", Nút này sẽ xuất hiện. Nhấn nó.

Bước 6: Điều khiển máy chủ từ xa

Để dễ dàng truy cập Công cụ mở cửa nhà để xe từ một vị trí từ xa, tôi sử dụng tên DNS động. Bởi vì tôi không thích ghi nhớ địa chỉ IP.

Với tính năng này, tôi nhập ♣ dynamic-hostname ♣.getmyip.com vào trường URL của trình duyệt. Lưu ý: IP trên bộ định tuyến gia đình có thể thay đổi mà không cần thông báo trước, nhưng điều này hiếm khi xảy ra. Tôi đã chọn sử dụng DynDNS. Bạn sẽ cần biết địa chỉ IP công cộng của bộ định tuyến của mình.

IP của bộ định tuyến U-Verse: ♣ uverse-public-ip ♣

Bạn có thể xem tên máy chủ và chi tiết tài khoản DynDNS Pro của mình. Dưới đây là một số mẹo để bắt đầu:

  • Tạo tên máy chủ DNS động của bạn (1 trong số 30):

    • ♣ tên máy chủ động ♣
    • Khóa cập nhật: ♣ dynamic-ip-updater-key ♣
  • Cài đặt ứng dụng khách cập nhật để đảm bảo tên máy chủ của bạn luôn được trỏ đến địa chỉ IP chính xác.

    • Tải xuống và cài đặt trên MacBook
    • Các IP của AT & T hiếm khi thay đổi, vì vậy trình cập nhật ở trên có thể được chạy bất cứ khi nào nó thay đổi
    • Làm theo hướng dẫn:

      • Thêm tài khoản
      • Nhập tên người dùng và mật khẩu: ♣ dynamic-ip-username ♣ ♣ dynamic-ip-password ♣
      • Chọn tên máy chủ
      • Nhấp vào Định cấu hình Máy chủ đã Chọn
      • Máy chủ sẽ hoạt động
    • Định cấu hình mạng của bạn để cho phép truy cập vào thiết bị của bạn từ Internet. Bạn có thể sử dụng Trình hướng dẫn Dyn của chúng tôi để biết một số hướng dẫn chung về cách thực hiện việc này, sử dụng các tài nguyên như PortForward.com hoặc liên hệ với nhà sản xuất thiết bị để được hỗ trợ.

      • AT&T chữ U
      • Chuyển tiếp cổng cho 2-Wire 3801HGV - đây là bộ định tuyến AT&T U-Verse mà tôi có. Xem Cập nhật trong Phụ lục để biết cách chuyển tiếp trên bộ định tuyến AT&T U-question 5268ac.
      • Mở trình duyệt và truy cập ♣ raspberry-pi-ip ♣
      • Mật khẩu: ♣ mật khẩu ♣
      • Cài đặt
      • Bức tường lửa
        • Chọn ♣ raspberry-pi-hostname ♣
        • May chủ

          • Cổng máy chủ web 80
          • Máy chủ HTTPS - cổng 443
        • Thêm vào
      • Cứu

Khi điều này được thực hiện, máy chủ web sẽ hoạt động từ internet. Để xác minh, hãy nhập ♣ dynamic-hostname ♣ và bạn sẽ thấy nút mở cửa ga ra.

Bước 7: Nối mạch với Raspberry Pi

Nối mạch với Raspberry Pi
Nối mạch với Raspberry Pi

Đối với mã được cung cấp (bước 4 và 6), tôi đã sử dụng chân GPIO 7. Điều trùng hợp là GPIO 7 giống với chân wiringPi 7. Trong mã PHP, số pin của dây Pi được sử dụng chứ KHÔNG phải số pin GPIO. Bạn có thể sử dụng bất kỳ mã nào bạn muốn, nhưng hãy nhớ thay đổi mã.

Tôi đã thử sử dụng dây xoắn, nhưng rơ le không giữ tốt trên dây xoắn. Dây rắn là tốt hơn.

Trong lần thử đầu tiên của mình, tôi đã tạo ra ba dây cáp kết nối (từ nữ đến nam).

  • Sử dụng ba dây cáp từ nữ đến nữ
  • Cắt ba đoạn dây rắn còn khoảng 1in.

    Dải 1 / 4in vào hai đầu của dây rắn

  • Chèn một dây rắn vào một cáp jumper nữ.

Đây là một cách tốt hơn để tạo cáp kết nối (từ nữ đến nam):

  • Chỉ sử dụng dây rắn
  • Cắt ba đoạn dây rắn 4in
  • Dải 1 / 4in trên cả hai đầu của dây rắn
  • Sử dụng chân kết nối cái

    • Trượt một chốt kết nối cái trên một đầu của dây rắn và uốn

      Ghim cái không được lỏng lẻo, hàn nếu cần thiết

    • Trượt giảm căng thẳng qua chốt kết nối nữ hoặc chốt che bằng băng keo của thợ điện

Đấu dây rơ le vào pi như trong sơ đồ:

  • Kết nối đầu cáp cái với chân Raspberry Pi.
  • Đưa dây đặc vào Rơle.

Bước 8: Tạo dịch vụ khởi động

Hầu hết các rơ le bao gồm cả rơ le đã mua, hoạt động như thế này:

  • Khi tín hiệu BẬT, mạch vẫn tắt.
  • Khi tín hiệu TẮT thì mạch được bật.

Nếu Raspberry Pi mất điện, rơ le có cơ chế an toàn giữ mạch TẮT.

Sự cố có thể xảy ra khi Rapberry Pi và rơ le được khôi phục lại nguồn điện, nhưng trước khi Raspberry Pi khởi động xong để BẬT tín hiệu cần phải tắt mạch. Bạn có thể thức dậy vào buổi sáng với ga ra mở cửa và có thể có một vài người bạn mới!

Tuy nhiên, rơle không thực sự khởi tạo cho đến khi chế độ chân GPIO được thiết lập thông qua lệnh này: chế độ gpio 7 out. Hơn nữa, nếu chân GPIO thành BẬT (gpio ghi 7 1) trước khi bạn đặt chế độ GPIO, rơle sẽ tắt sau khi khởi tạo.

Để làm cho quá trình khởi tạo này chạy khi khởi động và không đánh thức những người bạn mới, hãy sử dụng tập lệnh khởi động sau.

$ ssh pi @ ♣ raspberry-pi-ip ♣

$ sudo nano /etc/init.d/garagerelay

Sau đó dán tập lệnh này:

#! / bin / bash

# /etc/init.d/garagerelay # Thực hiện các chức năng cụ thể khi được yêu cầu bởi trường hợp hệ thống "$ 1" khi bắt đầu) echo "Bắt đầu chuyển tiếp" # Bật 7 để tiếp tục tắt rơle / usr / local / bin / gpio ghi 7 1 # Bắt đầu chế độ Gpio / usr / local / bin / gpio 7 out;; dừng lại) echo "Đang dừng gpio";; *) echo "Cách sử dụng: /etc/init.d/garagerelay {start | stop}" thoát 1;; esac thoát 0

Để lưu: CTRL-o, ENTER

Để thoát nano, hãy CTRL-x

Làm cho tệp thực thi được:

$ sudo chmod + x /etc/init.d/garagerelay

Bây giờ yêu cầu số pi của bạn chạy tập lệnh này khi khởi động:

$ sudo update-rc.d -f gararelay start 4

(Lưu ý: Bạn có thể bỏ qua cảnh báo "thiếu thẻ LSB" một cách an toàn.)

Đảm bảo tập lệnh khởi động đang chạy

$ sudo khởi động lại

Mở trình duyệt và nhấp vào công cụ mở. Rơ le sẽ nhấp.

Bước 9: Gắn Raspberry Pi vào Garage

Đính kèm Raspberry Pi vào Garage
Đính kèm Raspberry Pi vào Garage

Khi di chuyển Raspberry Pi, hãy đảm bảo chạy:

$ shutdown -h 0

Bạn có thể muốn tắt nguồn điện của nhà để xe. Vì vậy, công cụ mở chuông cửa không làm bạn bị điện giật:). Nguyên nhân thực sự là mỗi lần bạn đoản mạch, cửa sẽ lên xuống.

Tháo các vít gắn trên tường khỏi thiết bị mở kiểu chuông cửa để gắn chuông cửa vào tường.

Chọc một lỗ thông từ ga ra sau thiết bị mở chuông cửa để vào trong nhà. Ở Texas, Raspberry Pi không nên ở trong ga ra, sự thay đổi nhiệt độ trong ga ra nằm ngoài thông số hoạt động của Raspberry Pi.

Luồn dây tiếp điện qua lỗ (dùng mắc áo).

Nới lỏng cả hai vít ở mặt sau của thiết bị mở chuông cửa.

Dải cả hai đầu của dây tiếp điện: 1) khoảng 1/8 inch ở phía tiếp điện và khoảng ½”inch ở phía chuông cửa. Bẻ cong mặt bên của chuông cửa thành một nửa vòng đủ lớn để vừa vặn với vít mặt sau.

Kết nối một dây tiếp điện với mỗi vít ở mặt sau của chuông cửa và vặn chặt vít. Các kết nối được hiển thị trong hình ảnh. Vì rơle cách ly mạch điện, hướng thậm chí không quan trọng rơle được gắn vào vít nào.

Bước 10: Gắn Raspberry Pi vào SECO-LARM

Đính kèm Raspberry Pi vào SECO-LARM
Đính kèm Raspberry Pi vào SECO-LARM
Đính kèm Raspberry Pi vào SECO-LARM
Đính kèm Raspberry Pi vào SECO-LARM

Trước khi tôi viết mã xong, tôi và gia đình đang đi nghỉ và tôi đã mở trình duyệt của mình. Chế độ xem cuối cùng của trình duyệt của tôi là công cụ mở cửa nhà để xe - trang được làm mới và cửa nhà để xe mở ra. Vài ngày sau, một người hàng xóm gọi điện và hỏi có nên mở cửa nhà để xe không? May mắn thay, tôi có thể đóng nó từ cách xa 500 dặm.

Lỗi này đã buộc tôi phải thay đổi mã để điều này không xảy ra, đồng thời thêm cảm biến và trạng thái của cửa nhà để xe vào trang web.

Đây là liên kết đến hướng dẫn ban đầu để thêm cảm biến. Tuy nhiên, với mọi thứ đã được hoàn thành, việc cài đặt cảm biến có thể được đơn giản hóa rất nhiều và thay vì sử dụng python, hãy thêm một vài dòng mã vào index.php.


Fatal error: Uncaught Error: Call to undefined function exec() in W:\www\langs\.php-gen-lang\v3-core\macros.php(127) : eval()'d code:516 Stack trace: #0 W:\www\langs\.php-gen-lang\v3-core\macros.php(127): eval() #1 W:\www\langs\.php-gen-lang\v3-core\index-global.php(231): Macros->macros_parse('<!DOCTYPE html>...') #2 W:\www\langs\howwhatproduce.com\vi.howwhatproduce.com\index.php(9): require_once('W:\\www\\langs\\.p...') #3 {main} thrown in W:\www\langs\.php-gen-lang\v3-core\macros.php(127) : eval()'d code on line 516