Mục lục:

Kiểm tra Báo cáo Lưu lượng (NL) Với Thảm chùi chân: 6 Bước
Kiểm tra Báo cáo Lưu lượng (NL) Với Thảm chùi chân: 6 Bước

Video: Kiểm tra Báo cáo Lưu lượng (NL) Với Thảm chùi chân: 6 Bước

Video: Kiểm tra Báo cáo Lưu lượng (NL) Với Thảm chùi chân: 6 Bước
Video: Bí quyết chọn thảm chùi chân tốt 2024, Tháng mười một
Anonim
Kiểm tra Báo cáo Giao thông (NL) Với Thảm chùi chân
Kiểm tra Báo cáo Giao thông (NL) Với Thảm chùi chân

Trong tài liệu hướng dẫn này, tôi sẽ mô tả cách xây dựng một tấm thảm chùi chân để kiểm tra các báo cáo giao thông của đường cao tốc Hà Lan. Khi bạn bước ra ngoài trên tấm thảm chùi chân và có tắc đường trên tuyến đường của bạn, tấm thảm sẽ chuyển sang màu đỏ. Khi khong co giao thong, mat mau xanh.

Tôi sẽ làm việc trên NodeMCU 1.0 (Mô-đun ESP0-12E). Mã cho dự án này cũng có thể hoạt động trên các thiết bị khác (ví dụ: bảng Arduino). Dự án này dựa trên nguồn báo cáo lưu lượng của Hà Lan, ANWB.

Những gì chúng tôi cần cho dự án này:

- NodeMCU - Dây nhảy - Đèn LED hoặc dải - Cảm biến tương tự (Aluminiuim foil, Sponge) - Kết nối Wi-Fi - Thảm chùi chân

Các bước chúng tôi phải thực hiện:

1. Kết nối NodeMCu với Wi-Fi 2. Yêu cầu dữ liệu qua HTTPS từ ANWB.nl 3. Biến dữ liệu thành Thông tin có thể sử dụng 4. Cài đặt trình kích hoạt 5. Phản hồi thiết kế

Bước 1: Kết nối NodeMCU với Wi-Fi

Bước này sẽ hướng dẫn cách thực hiện HTTPSRequest thành công để xem liệu thiết bị có được kết nối với internet hay không.

Đầu tiên, cài đặt thư viện ESP8266 trong Arduino IDE. Mở từ ví dụ ESP8266>

Điền thông tin đăng nhập Wi-Fi của bạn ở đầu mã của bạn, như được hiển thị bên dưới:

const char * ssid = "YOUR_SSID";

const char * password = "YOUR_PASS";

Tải mã lên thiết bị của bạn và kiểm tra xem NodeMCU có đang kết nối với internet hay không. Ví dụ về HTTPSRequest sử dụng Github làm mặc định để lấy thông tin. Khi HTTPSRequest thành công, bạn sẽ nhận được dữ liệu Github trong màn hình nối tiếp.

Bước 2: Yêu cầu dữ liệu từ HTTPS từ ANWB.nl

Trong bước thứ hai này, bạn thay đổi nguồn dữ liệu từ mặc định thành nguồn cần thiết cho dự án này: ANWB.nl.

Ở đầu mã của bạn, hãy thay đổi char * host thành www.anwb.nl (hoặc một nguồn khác mà bạn muốn lấy dữ liệu của mình):

const char * host = "www.anwb.nl";!! Nếu bạn sử dụng nguồn khác, bước 3 sẽ khác với mã của tôi. Bước 3 cần mã hóa cụ thể để truy xuất thông tin có thể sử dụng!

Tiếp theo, thay đổi url chuỗi trong thiết lập hàm thành "/ feeds / gethf", đường dẫn nơi thông tin được lấy từ:

Chuỗi url = "/ feeds / gethf";!! Nếu bạn sử dụng nguồn khác, hãy sử dụng đường dẫn đến nguồn của bạn!

Khi tải mã lên, bạn sẽ nhận được phản hồi với tất cả dữ liệu từ www.anwb.nl/feeds/gethf. Mã này được lưu vào một chuỗi được gọi là dòng.

Bước 3: Biến dữ liệu thành thông tin hữu dụng

Cho đến nay, mã chỉ chạy khi NodeMCU được khởi động hoặc đặt lại, vì tất cả mã đều nằm trong chức năng thiết lập. Để đặt trình kích hoạt chạy mã liên tục, bạn phải thay đổi vị trí của mã chạy yêu cầu HTTPS. Bên dưới chức năng vòng lặp, bạn thêm một chức năng khác. Tôi đã gọi nó là void extractData:

extractData () {

}

Sao chép một phần mã từ chức năng thiết lập vào extractData (). Bắt đầu với dòng sau cho đến khi kết thúc chức năng thiết lập:

if (! client.connect (host, Mã hiện có trong chức năng mới của bạn, vì vậy hãy xóa mã đã sao chép khỏi chức năng thiết lập.

Tiếp theo, gọi hàm extractData trong hàm vòng lặp và thêm một số thời gian trễ để cho nodeMCU thời gian nghỉ ngơi:

void loop () {

extractData (); chậm trễ (30000); // điều này sẽ bị xóa sau này khi chúng ta có cảm biến tương tự}

Vì dữ liệu bạn nhận được được lưu trữ trong một chuỗi và chỉ các phần của chuỗi này là cần thiết, bạn phải viết một vài vòng lặp for.

Đầu tiên, hãy kiểm tra tất cả các vị trí của từ 'đường'. Sau từ 'đường', tên đường sẽ theo sau (A1, A2, v.v.).

Trước khi bắt đầu viết vòng lặp for, bạn phải khai báo một số biến mà bạn sẽ sử dụng:

int noOfPos = 0;

boolean hasRunOnce = false; int from = 0; int roadArray [20];

Bây giờ là lúc để viết một số vòng lặp. Tôi đã viết vòng lặp for ở dưới cùng của hàm extractData. Tôi đã cố gắng chia nó thành các chức năng riêng biệt, nhưng tôi không thể làm cho nó hoạt động.

Đối với vòng lặp số 1: tìm vị trí của đường từ trong dòng chuỗi:

for (int i = 0; i <line.length (); i ++) {int pos = line.indexOf ("road \": ", from); roadArray [noOfPos] = pos; noOfPos + = 1; from = pos + 1; if (hasRunOnce == true && pos == line.indexOf ("road \": ")) {i = line.length (); } hasRunOnce = true; }

Tiếp theo, hãy kiểm tra những con đường nào bị tắc đường, bằng cách sử dụng các vị trí của vòng lặp for từ phía trên. Vị trí của tên đường luôn giống nhau và bắt đầu bằng 7 ký tự và kết thúc 10 ký tự sau từ đường.

Bây giờ chúng ta xác định tên mảngOfRoadArray, sẽ được điền vào vòng lặp for tiếp theo:

Chuỗi tênOfRoadArray [20];

Vòng lặp for số 2: Tìm tất cả tên của các con đường có đầu vào từ vòng lặp for số 2. 1

for (int k = 0; k <20; k ++) {int pos = roadArray [k]; int positionOfRoadName = pos + 7; int endOfPositionOfRoadName = pos + 10; nameOfRoadArray [k] = line.substring (positionOfRoadName, endOfPositionOfRoadName); }

Tên mảngOfRoudArray nên được lấp đầy với tất cả các báo hiệu tắc đường.

Tiếp theo, bạn sẽ kiểm tra xem đường của bạn có nằm trong dãy đường bị kẹt xe hay không. In tênOfRoadArray để lấy các con đường trong dữ liệu. Thực hiện việc này bằng cách thêm Serial.println (nameOfRoadArray [k]); vào vòng lặp for thứ 2 như:

for (int k = 0; k <20; k ++) {int pos = roadArray [k]; int positionOfRoadName = pos + 7; int endOfPositionOfRoadName = pos + 10; nameOfRoadArray [k] = line.substring (positionOfRoadName, endOfPositionOfRoadName); Serial.println (nameOfRoadArray [k]); }

Nếu đúng, bạn sẽ thấy tất cả các con đường bị tắc đường trong màn hình Nối tiếp.

Trước khi viết vòng lặp For cuối cùng, bạn phải khai báo boolean như một biến toàn cục. Boolean, được gọi là trafficJam theo mặc định là false và sẽ thay đổi nếu hàm extractData trả về true khi bị tắc đường. Đoạn mã sau nằm trên đầu tệp.ino:

boolean trafficJam = false;

Đối với đường vòng số 3: Kiểm tra xem con đường, trong trường hợp này là A1, có nằm trong danh sách tắc đường hay không.

for (int l = 0; l <20; l ++) {if (nameOfRoadArray [l] == "A1 \" ") {// thay đổi A1 thành đường ưu tiên của bạn. Jam = true;}

Nếu bạn in trafficJam trong màn hình nối tiếp, bạn sẽ biết liệu có tắc đường trên A1 hay không.

Đặt mã này ở dưới cùng của hàm extractData:

Serial.println (trafficJam); // xem có tắc đường không

Với thông tin này, chúng tôi sẽ làm việc thêm về phản hồi của hệ thống ở bước 5.

Bước 4: Cài đặt Trình kích hoạt

Cài đặt trình kích hoạt
Cài đặt trình kích hoạt
Cài đặt trình kích hoạt
Cài đặt trình kích hoạt
Cài đặt trình kích hoạt
Cài đặt trình kích hoạt

Vì bây giờ chúng ta có thể truy xuất dữ liệu thành công từ nguồn, nên đã đến lúc xây dựng một bộ cảm biến sẽ kích hoạt nodeMCU để chạy chức năng extractData. Tôi đã chọn tạo một cảm biến tương tự trên tấm thảm chùi chân của mình. Bạn có thể thay đổi trình kích hoạt bằng cách sử dụng một cảm biến khác.

Xây dựng cảm biến tương tự

Tôi đã sử dụng 2 miếng giấy nhôm, hai dây jumper và một miếng bọt biển.

Khoan một lỗ trên miếng xốp, đây là nơi tiếp xúc với các lá nhôm. Dán giấy nhôm lên cả hai mặt của miếng bọt biển. Nối dây jumper vào lá nhôm. Kết nối dây jumper với nodeMCU. Một bên cho chân A0 và bên kia cho một chân V3. Đặt miếng bọt biển dưới tấm thảm chùi chân của bạn và bạn vừa thay tấm thảm chùi chân của mình thành một bộ cảm biến. Đáng kinh ngạc!

Mã để đọc giá trị từ cảm biến để xem liệu ai đó đang đứng trên thảm chùi chân:

int sensorValue = analogRead (A0);

if (sensorValue == 1024) {extractData (); }

Khi lá nhôm tiếp xúc (khi ai đó đang đứng trên thảm), Giá trị cảm biến là 1024. Điều này dẫn đến việc kích hoạt chức năng extractData (). Và đó chính xác là những gì chúng tôi muốn hệ thống thực hiện.

Bước 5: Phản hồi về thiết kế

Tôi đã sử dụng một LEDstrip để đưa ra phản hồi cho người dùng. Khi tắc đường, đèn sẽ chuyển sang màu đỏ. Khi con đường tốt để đi, nó sẽ chuyển sang màu xanh lá cây. Tôi đã sử dụng thư viện adafruit neopixel để điều khiển LEDstrip của mình.

Viết mã này vào đầu tệp của bạn để đảm bảo LEDstrip được xác định:

#bao gồm

#define PIXEL_PIN D5 #define PIXEL_COUNT 10 #define PIXEL_TYPE NEO_GRB + NEO_KHZ800 Adafruit_NeoPixel pixel = Adafruit_NeoPixel (PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);

Viết mã tiếp theo trong chức năng thiết lập:

// neopixel

pixel.begin (); pixel.show ();

Và đoạn mã sau trong hàm vòng lặp:

if (trafficJam == true) {

for (int i; i <PIXEL_COUNT; i ++) {pixel.setPixelColor (i, 255, 0, 0); // màu đỏ pixel.show (); chậm trễ (200); }} else {for (int i; i <PIXEL_COUNT; i ++) {pixel.setPixelColor (i, 0, 255, 0); // màu xanh lá cây pixel.show (); chậm trễ (200); }

Trong đoạn mã trên có một hàm if / else. Khi hàm extractData trả về sự hiện diện của tắc đường, thanh đèn LED sẽ chuyển sang màu đỏ. Nếu không, LEDstrip sẽ chuyển sang màu xanh lục.

Bước 6: Chạy mã

Nếu chúng tôi chạy mã hoàn chỉnh ngay bây giờ, cảm biến và ánh sáng sẽ hoạt động. Khi bạn đứng trên thảm chùi chân, cảm biến sẽ kết nối và chức năng extractData sẽ chạy. Khi có mặt dãy tên đường, đoạn đường mà chúng ta đang tìm kiếm, đèn LEDstrip sẽ chuyển sang màu đỏ, báo hiệu có tắc đường. Nếu nó không nằm trong mảng, LEDstrip sẽ chuyển sang màu xanh lục và bạn biết mình đã sẵn sàng!

Chúc bạn có một hành trình an toàn và cảm ơn vì đã đọc. Tôi hy vọng bạn tìm thấy một số cảm hứng hoặc thông tin. Nếu bạn nhận được một số phản hồi, vui lòng phản hồi!

Đề xuất: