Mục lục:

Phương pháp định thời gian Arduino với Millis (): 4 bước
Phương pháp định thời gian Arduino với Millis (): 4 bước

Video: Phương pháp định thời gian Arduino với Millis (): 4 bước

Video: Phương pháp định thời gian Arduino với Millis (): 4 bước
Video: Arduino | Millis thay thế Delay - Chi tiết về millis() 2024, Tháng mười một
Anonim
Phương pháp định thời gian Arduino với Millis ()
Phương pháp định thời gian Arduino với Millis ()

Trong bài viết này, chúng tôi giới thiệu hàm millis (); và sử dụng nó để tạo ra các ví dụ thời gian khác nhau.

Millis? Không liên quan gì đến ký âm… hy vọng bạn đã nhận ra milli là tiền tố số cho một phần nghìn; nghĩa là nhân một đơn vị đo với 0,001 (hoặc mười với lũy thừa của âm 3).

Điều thú vị là hệ thống Arduino của chúng tôi sẽ đếm số mili giây (hàng nghìn giây) kể từ khi bắt đầu chạy bản phác thảo cho đến khi số đếm đạt đến số lượng tối đa có thể được lưu trữ trong kiểu biến unsigned long (số nguyên 32 bit [bốn byte] - nằm trong khoảng từ 0 đến (2 ^ 32) -1. (2 ^ 32) -1 hoặc 4294967295 mili giây chuyển đổi thành 49,71027 ngày lẻ.

Bộ đếm đặt lại khi Arduino được đặt lại, nó đạt đến giá trị lớn nhất hoặc một bản phác thảo mới được tải lên. Để nhận giá trị của bộ đếm tại một điểm cụ thể, chỉ cần gọi hàm - ví dụ:

start = millis ();

Nơi bắt đầu là một biến dài không được đánh dấu. Dưới đây là một ví dụ rất đơn giản để hiển thị cho bạn millis () trong hành động:

/ * biểu diễn millis () * /

bắt đầu dài không dấu, kết thúc, trôi qua;

void setup ()

{Serial.begin (9600); }

void loop ()

{Serial.println ("Bắt đầu…"); start = millis (); chậm trễ (1000); xong = millis (); Serial.println ("Đã hoàn thành"); elapsed = kết thúc-bắt đầu; Serial.print (đã trôi qua); Serial.println ("mili giây đã trôi qua"); Serial.println (); chậm trễ (500); }

Phác thảo lưu trữ số mili hiện tại khi bắt đầu, sau đó đợi một giây, sau đó lưu trữ lại giá trị của mili khi kết thúc. Cuối cùng, nó tính toán thời gian đã trôi qua của sự chậm trễ. Trong kết xuất màn hình sau đây của màn hình nối tiếp, bạn có thể thấy rằng thời lượng không phải lúc nào cũng chính xác là 1000 mili giây, như hiển thị trong hình ảnh.

Bước 1:

Hình ảnh
Hình ảnh

Nói một cách đơn giản, hàm millis sử dụng một bộ đếm bên trong trong vi điều khiển ATmega ở trung tâm của Arduino của bạn. Bộ đếm này tăng lên mỗi chu kỳ đồng hồ - điều này xảy ra (trong Arduino tiêu chuẩn và các thiết bị tương thích) ở tốc độ đồng hồ 16 Mhz. Tốc độ này được điều khiển bởi viên pha lê trên bảng Arduino (thứ màu bạc có đóng dấu T16.000 trên đó).

Bước 2:

Hình ảnh
Hình ảnh

Độ chính xác của tinh thể có thể thay đổi tùy thuộc vào nhiệt độ bên ngoài và khả năng chịu đựng của chính tinh thể. Điều này sẽ ảnh hưởng đến độ chính xác của kết quả mili của bạn. Kinh nghiệm giai thoại đã báo cáo sự chênh lệch về độ chính xác thời gian có thể vào khoảng ba hoặc bốn giây trong khoảng thời gian 24 giờ.

Nếu bạn đang sử dụng bảng hoặc phiên bản của riêng bạn đang sử dụng bộ cộng hưởng bằng gốm thay vì pha lê, hãy lưu ý rằng chúng không chính xác bằng và sẽ dẫn đến khả năng mức độ trôi cao hơn. Nếu bạn cần mức độ chính xác thời gian cao hơn nhiều, hãy xem xét các IC hẹn giờ cụ thể như Maxim DS3231.

Bây giờ chúng ta có thể sử dụng mili cho các chức năng thời gian khác nhau. Như đã trình bày trong bản phác thảo ví dụ trước, chúng ta có thể tính toán thời gian đã trôi qua. Để thực hiện ý tưởng này, hãy làm một chiếc đồng hồ bấm giờ đơn giản. Làm như vậy có thể đơn giản hoặc phức tạp nếu cần, nhưng đối với trường hợp này, chúng ta sẽ chuyển sang hướng đơn giản.

Về góc độ phần cứng, chúng ta sẽ có hai nút - Bắt đầu và Dừng - với các điện trở kéo xuống 10k ohm được kết nối với các chân kỹ thuật số 2 và 3 tương ứng. Khi người dùng nhấn bắt đầu bản phác thảo sẽ ghi lại giá trị cho mili - sau đó sau khi nhấn dừng, bản phác thảo sẽ ghi lại giá trị cho mili, tính toán và hiển thị thời gian đã trôi qua. Sau đó, người dùng có thể nhấn bắt đầu để lặp lại quá trình hoặc dừng để cập nhật dữ liệu. Đây là bản phác thảo:

/ * Đồng hồ bấm giờ siêu cơ bản sử dụng mili (); * /

bắt đầu dài không dấu, kết thúc, trôi qua;

void setup ()

{Serial.begin (9600); pinMode (2, INPUT); // nút bắt đầu pinMode (3, INPUT); // nút dừng Serial.println ("Bấm 1 để Bắt đầu / đặt lại, 2 cho thời gian đã trôi qua"); }

void displayResult ()

{float h, m, s, ms; không ký lâu hơn; elapsed = kết thúc-bắt đầu; h = int (trôi qua / 3600000); hết =% 3600000 đã trôi qua; m = int (hơn / 60000); trên = hơn% 60000; s = int (trên / 1000); ms = trên% 1000; Serial.print ("Thời gian trôi qua thô:"); Serial.println (đã trôi qua); Serial.print ("Thời gian đã trôi qua:"); Serial.print (h, 0); Serial.print ("h"); Serial.print (m, 0); Serial.print ("m"); Serial.print (s, 0); Serial.print ("s"); Serial.print (ms, 0); Serial.println ("ms"); Serial.println (); }

void loop ()

{if (digitalRead (2) == HIGH) {start = millis (); chậm trễ (200); // để gỡ lỗi Serial.println ("Đã bắt đầu…"); } if (digitalRead (3) == HIGH) {finish = millis (); chậm trễ (200); // để gỡ lỗi displayResult (); }}

Các lệnh gọi đến delay () được sử dụng để gỡ lỗi các công tắc - đây là tùy chọn và việc sử dụng chúng sẽ phụ thuộc vào phần cứng của bạn. Hình ảnh là một ví dụ về đầu ra màn hình nối tiếp của bản phác thảo - đồng hồ bấm giờ đã bắt đầu và sau đó nhấn nút hai sáu lần trong các khoảng thời gian.

Bước 3: Đồng hồ tốc độ…

Image
Image

Nếu bạn có một cảm biến ở đầu và cuối của một khoảng cách cố định, tốc độ có thể được tính: tốc độ = khoảng cách ÷ thời gian.

Bạn cũng có thể làm đồng hồ đo tốc độ cho dạng chuyển động có bánh xe, ví dụ như xe đạp. Tại thời điểm hiện tại, chúng tôi không có một chiếc xe đạp nào để sử dụng, tuy nhiên chúng tôi có thể mô tả quá trình để làm như vậy - nó khá đơn giản. (Tuyên bố từ chối trách nhiệm - làm như vậy tự chịu rủi ro, v.v.)

Trước hết, hãy xem lại các phép toán cần thiết. Bạn sẽ cần biết chu vi của bánh xe. Phần cứng - bạn sẽ cần một cảm biến. Ví dụ - một công tắc sậy và nam châm. Hãy coi công tắc sậy là một nút thường mở và kết nối như bình thường với một điện trở kéo xuống 10k ohm.

Những người khác có thể sử dụng cảm biến hiệu ứng hội trường - mỗi cảm biến riêng của họ). Hãy nhớ từ lớp toán, để tính chu vi - hãy sử dụng công thức: chu vi = 2πr trong đó r là bán kính của hình tròn.

Bây giờ bạn đã có chu vi bánh xe, giá trị này có thể được coi là "khoảng cách cố định" của chúng tôi và do đó tốc độ có thể được tính bằng cách đo thời gian trôi qua giữa một vòng quay đầy đủ.

Cảm biến của bạn - sau khi được trang bị - sẽ hoạt động theo phương thức giống như một nút thường mở được nhấn mỗi lần xoay. Bản phác thảo của chúng tôi sẽ đo thời gian trôi qua giữa mọi xung từ cảm biến.

Để làm điều này, ví dụ của chúng tôi sẽ có đầu ra cảm biến được kết nối với chân số 2 - vì nó sẽ kích hoạt ngắt để tính toán tốc độ. Mặt khác, bản phác thảo sẽ hiển thị tốc độ trên mô-đun LCD giao diện I2C bình thường. Giao diện I2C được đề xuất vì điều này chỉ yêu cầu 4 dây từ bảng Arduino đến màn hình LCD - càng ít dây càng tốt.

Đây là bản phác thảo cho sự quan tâm của bạn:

/ * Máy đo tốc độ cơ bản sử dụng mili (); * /

#include "Wire.h" // cho LCD bus I2C

#include "LiquidCrystal_I2C.h" // cho mô-đun LCD bus I2C - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // đặt địa chỉ LCD thành 0x27 để hiển thị 16 ký tự và 2 dòng

bắt đầu float, kết thúc;

trôi qua, thời gian; float circleMetric = 1,2; // chu vi bánh xe so với vị trí cảm biến (tính bằng mét) float circleImperial; // sử dụng 1 km = 0,621371192 dặm float speedk, speedm; // giữ giá trị tốc độ được tính toán theo hệ mét và hệ Anh

void setup ()

{attachmentInterrupt (0, speedCalc, RISING); // ngắt được gọi khi cảm biến gửi kỹ thuật số 2 mức cao (mọi vòng quay của bánh xe) start = millis (); // thiết lập LCD lcd.init (); // khởi tạo lcd lcd.backlight (); // bật đèn nền LCD lcd.clear (); lcd.println ("Đội mũ bảo hiểm!"); chậm trễ (3000); lcd.clear (); Serial.begin (115200); circleImperial = circleMetric *.62137; // chuyển đổi số liệu thành hệ Anh để tính MPH}

void speedCalc ()

{elapsed = millis () - bắt đầu; start = millis (); speedk = (3600 * circleMetric) / đã trôi qua; // km / h speedm = (3600 * circleImperial) / đã trôi qua; // Dặm một giờ }

void loop ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("km / h"); lcd.print (int (speedm)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (đã trôi qua)); lcd.print ("ms / rev"); chậm trễ (1000); // điều chỉnh theo sở thích cá nhân để giảm thiểu nhấp nháy}

Sẽ không có nhiều điều xảy ra như vậy - mỗi khi bánh xe hoàn thành một vòng, tín hiệu từ cảm biến sẽ đi từ thấp đến cao - kích hoạt ngắt gọi hàm speedCalc ().

Điều này thực hiện đọc mili () và sau đó tính toán sự khác biệt giữa số đọc hiện tại và số đọc trước đó - giá trị này trở thành thời gian để bao phủ khoảng cách (là chu vi của bánh xe so với cảm biến - được lưu trữ trong

float circleMetric = 1,2;

và được đo bằng mét). Cuối cùng nó tính toán tốc độ theo km / h và MPH. Giữa các lần gián đoạn, bản phác thảo hiển thị dữ liệu tốc độ cập nhật trên màn hình LCD cũng như giá trị thời gian thô cho mỗi vòng quay nhằm mục đích tò mò. Trong đời thực, tôi không nghĩ có ai lại gắn màn hình LCD trên xe đạp, có lẽ màn hình LED sẽ phù hợp hơn.

Trong khi đó, bạn có thể xem ví dụ này hoạt động như thế nào trong video clip ngắn sau đây. Thay vì kết hợp bánh xe đạp và công tắc sậy / nam châm, tôi đã kết nối đầu ra sóng vuông từ bộ tạo chức năng với chốt ngắt để mô phỏng xung từ cảm biến, vì vậy bạn có thể biết cách hoạt động của nó.

Bước 4:

Đó chỉ là tổng kết việc sử dụng millis () vào thời điểm hiện tại. Ngoài ra còn có micros (); hàm đếm micro giây.

Vậy là bạn đã có nó - một chức năng thực tế khác có thể cho phép giải quyết nhiều vấn đề hơn thông qua thế giới Arduino. Như mọi khi, bây giờ tùy thuộc vào bạn và trí tưởng tượng của bạn để tìm ra thứ gì đó để kiểm soát hoặc tìm ra những trò tai quái khác.

Bài đăng này do pmdway.com mang đến cho bạn - mọi thứ dành cho các nhà sản xuất và những người đam mê điện tử, với giao hàng miễn phí trên toàn thế giới.

Đề xuất: