Mục lục:
- Bước 1: Thiết lập - Thiết lập phần cứng của bạn trước tiên
- Bước 2: Thiết lập - Đặt màn hình của bạn
- Bước 3: Thiết lập Master End, sau đó kết nối với nhau - Phần 1
- Bước 4: Thiết lập Master End, sau đó kết nối với nhau - Phần 2
- Bước 5: Tổng quan về Bản phác thảo / Chương trình - Cấu trúc của Chương trình
- Bước 6: Thiết kế từ trên xuống
- Bước 7: Khái niệm và thiết kế - Phần 1
- Bước 8: Khái niệm và thiết kế - Phần 2
- Bước 9: Kết thúc Vòng lặp chính: A) Nhận từ USB, B) Nhận từ Slave Arduino
- Bước 10: Nhận và xử lý dữ liệu trong Slave Arduino
- Bước 11: Viết hàm nhận
- Bước 12: Viết hàm con Nhận - Phần 1
- Bước 13: Viết hàm con Nhận - Phần 2
- Bước 14: Viết hàm truyền và phân tích cú pháp
- Bước 15: Viết hàm truyền và phân tích cú pháp
- Bước 16: Chung kết
Video: Gửi dữ liệu số từ Arduino này sang Arduino khác: 16 bước
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:31
Giới thiệu
của David Palmer, CDIO Tech. tại Đại học Aston.
Bạn có bao giờ cần gửi một số số từ Arduino này sang Arduino khác không? Hướng dẫn này cho thấy làm thế nào.
Bạn có thể dễ dàng kiểm tra hoạt động của nó bằng cách chỉ cần nhập một chuỗi số để gửi tại thiết bị đầu cuối Serial Monitor và xem các số xuất hiện trở lại trên màn hình Serial thứ hai được kết nối với Arduino thứ hai. Bạn thậm chí có thể sử dụng liên kết Bluetooth.
Những gì nó làm
Cần phát triển hai chương trình Arduino (bản phác thảo trong Arduino nói), một chương trình Master để kết nối với máy tính chủ chạy Arduino Serial Monitor, một chương trình hoạt động như Slave để nhận thông điệp nối tiếp từ Master, giải mã nó và gửi lại. Nô lệ có thể tùy chọn hiển thị các số mà nó xử lý trên Màn hình nối tiếp của IDE thứ hai - chỉ trong trường hợp bạn muốn sử dụng điều này. Nó có thể giúp mọi thứ hoạt động ngay từ đầu và giúp bạn nếu bạn quyết định thực hiện bất kỳ thay đổi nào đối với các chương trình để phù hợp với yêu cầu của riêng bạn.
Trang thiết bị
- 2 Arduino
- 2 đầu USB
- vá dây (theo yêu cầu)
- 1 PC / máy tính xách tay được tải Arduino IDE (có sẵn dưới dạng tải xuống miễn phí từ trang web Arduino.cc)
Bước 1: Thiết lập - Thiết lập phần cứng của bạn trước tiên
Cắm 2 Arduinos vào 2 cổng USB trên máy tính của bạn.
Mẹo, bạn nên gắn nhãn chúng là M và S (chính và nô lệ) để bạn không gặp rắc rối sau này (như thể hiện trong 2 bức ảnh ở đây.)
Bước 2: Thiết lập - Đặt màn hình của bạn
Điều tốt nhất là thiết lập màn hình của bạn để bạn có
- IDE được tải với chương trình Chính ở bên trái và
- điều đó với Slave ở bên phải.
Giữ các Màn hình nối tiếp cho Maser và Slave ở bên trái và bên phải như trong ảnh chụp màn hình ở đây.
Bước 3: Thiết lập Master End, sau đó kết nối với nhau - Phần 1
Khi bạn thiết lập Master End Serial Monitor để gửi hai số, bạn phải luôn sử dụng ký tự bắt đầu và kết thúc, ký tự phân tách và ký tự phân cách dấu phẩy như bạn thấy ở đây.
Bây giờ bạn cần kết nối 2 Arduino với nhau qua nối tiếp. Điều này được thực hiện với hai dây vá.
Tôi đã sử dụng màu xanh lá cây và màu vàng
- Lấy màu vàng đầu tiên, cái này phải cắm vào D6 trong một Arduino và D7 trong cái thứ hai
- Sau đó, ngược lại đối với dây màu xanh lá cây, D7 trên Arduino thứ nhất và D6 trên Arduino thứ hai.
Ngoài ra, nếu bạn có sẵn thứ gì đó như một cặp mô-đun Bluetooth - như HC-05 - thì chúng cũng sẽ hoạt động để cung cấp cho bạn hiệu ứng chính xác như các dây ở trên.
Bước 4: Thiết lập Master End, sau đó kết nối với nhau - Phần 2
Chúng tôi đang sử dụng thư viện Phần mềm Serial. Thông tin thêm có sẵn tại liên kết này
Bạn có thể thấy nó được gọi ra trên dòng 7 của một trong hai chương trình. Nó cấu hình các chân kỹ thuật số 7 và 6 là TX và RX (truyền và nhận). Đây là cách dữ liệu sẽ đi ra khỏi Master Arduino qua dây màu xanh lá cây vào Slave và khi chương trình Slave trong Arduino thứ hai kết thúc công việc, quay trở lại qua dây màu vàng. Ở cuối hình minh họa tương tự (trong cửa sổ Serial Monitor), bạn có thể thấy dữ liệu chúng tôi truyền hiện đã thành công vòng lặp được mô tả ở đây và quay trở lại PC khi cặp số nguyên được phân tách độc đáo.
Bước 5: Tổng quan về Bản phác thảo / Chương trình - Cấu trúc của Chương trình
Bố cục Giống như trong tất cả các bản phác thảo Arduino, có 3 phần cơ bản:
- Tuyên bố
- Thiết lập
- Vòng lặp chính
Như thường lệ, chúng tôi đã sử dụng ở đây phần thứ 4 là phần bổ sung 'Hàm'. Nếu bạn không quen với việc sử dụng Chức năng, bạn có thể tìm kiếm "Chức năng Arduino" và bạn sẽ tìm thấy các trang web giải thích như ví dụ trong liên kết này: www.tutorialspoint.com/arduino/arduino_functions…..
Chúng tôi cũng đã sử dụng các tab để tách chương trình thành các khối dễ quản lý hơn.
Ba khối chúng tôi đã sử dụng có thể được nhìn thấy ở đầu mỗi hình minh họa của các cửa sổ IDE ở trên:
- simpleRxTx0330Master
- chung
- ghi chú
Đây thực sự là các tệp riêng biệt bên trong thư mục của chương trình, như bạn có thể thấy trong chế độ xem Windows Explorer về các tệp của chương trình Slave.
Có một lý do rất tốt tại sao chúng tôi đã làm điều này.
- Khi xây dựng chương trình, chúng tôi nhận ra rằng hầu hết chương trình dành cho Master cũng giống như chương trình dành cho Slave.
- Chúng tôi đã kết thúc việc kéo tất cả các phần chung vào một tab, do đó chúng tôi đặt tên là "chung", và sau đó mỗi lần chúng tôi gỡ lỗi một phần (đã kiểm tra nó và hài lòng rằng nó hoạt động tốt), chúng tôi chỉ sao chép và dán toàn bộ tab đó chuyển từ Master sang Slave, hoặc ngược lại.
- Các tab ghi chú cũng giống hệt nhau, vì thiết kế là chung.
Không có hàm nào được gọi từ thiết lập, tất cả chúng đều được gọi từ vòng lặp, vì vậy chúng tôi đã tạo chúng sau khi thiết lập nhưng trước vòng lặp.
Bước 6: Thiết kế từ trên xuống
Bạn nên thiết kế bản phác thảo của mình bắt đầu bằng việc xác định những gì bạn muốn làm.
Khi bạn đã có điều này, bạn có thể bắt đầu tạo bản phác thảo để thực hiện những điều đó. Nói chung, nếu có một chi tiết nào đó bạn chưa biết cách thực hiện, chỉ cần đặt nó thành một hàm và để lại việc tạo hàm cho đến sau.
Điều này tuân theo triết lý thiết kế tốt, được giảng dạy ở nhiều trường Đại học, được gọi là CDIO (Nếu bạn chưa biết cái này, bạn có thể Google nó và tìm các trang web để giải thích nó như: https://www.cdio.org/s.) Về cơ bản, điều này nói lên rằng: Đừng bắt đầu Thiết kế trước khi bạn đã nắm rõ Khái niệm. Đừng bắt đầu Triển khai cho đến khi bạn đã rõ Thiết kế. Đừng mong đợi nó hoạt động trước khi bạn đã rõ ràng về việc Triển khai. C đầu tiên, sau đó đến D, I và O. Ở mỗi giai đoạn tiếp theo, bạn lặp lại (quay lại (quay lại các) vòng lặp, vì vậy khi bạn hài lòng với vòng lặp Thiết kế ban đầu của mình trở lại và kiểm tra xem nó vẫn đáp ứng Khái niệm và cập nhật C nếu bạn cần. Và tiếp tục, vì vậy ngay cả khi bạn phải Điều hành, hãy quay trở lại đầu trang và xem lại C hiện tại trông như thế nào, sau đó là D và I, đồng thời thực hiện và kiểm tra tất cả thay đổi khi cần thiết. Với các bản phác thảo lập trình, điều này cũng hoạt động tương tự nếu bạn thiết kế Từ trên xuống.
Bước 7: Khái niệm và thiết kế - Phần 1
Khái niệm ở đây trông giống như các yêu cầu phác thảo được nêu trong tab 'ghi chú'. '
Thiết kế có thể trông giống như một phiên bản đầu tiên của vòng lặp, khớp với tab ghi chú và có thể trông giống như bạn thấy trong hình này
Xem cách tôi muốn bắt đầu bằng cách thực sự CTRL-C sao chép các nhận xét vào phần đầu của vòng lặp trước, sau đó bắt đầu điền vào chỗ trống bằng các lệnh sẽ thực hiện những điều đó.
Điều này thực sự biên dịch OK như bạn có thể thấy ở cuối màn hình trong hình. Điều đó đang đạt từ CDIO giai đoạn D đến I, và khi chúng tôi phát triển mã, bạn nên tiếp tục đi vòng vòng D-I này.
Bây giờ đã đến lúc chuyển sang giai đoạn tiếp theo, có một bình luận ở đó nói rằng chúng ta sẽ: // nhận thứ gì đó từ USB phần cứng, sau đó chúng ta sẽ truyền thứ đó lên kênh nối tiếp phần mềm. Chúng tôi viết mã này để biến điều đó thành hiện thực - dòng 133 đến 138 được hiển thị ở đây bằng bút đánh dấu màu vàng
Bước 8: Khái niệm và thiết kế - Phần 2
Hai hàm đầu tiên chúng tôi giới thiệu ở đây là (recv () và tran () để thực hiện việc nhận từ cổng phần cứng và truyền đến cổng phần mềm - do đó gọi chúng với các tham số 'hw' hoặc 'sw' được hiển thị.
Ngoài chúng, chúng tôi đã thêm một thử nghiệm trên một biến toàn cục có tên là newData. Đây là một cờ mà chúng ta sẽ đặt bên trong hàm "void recv ();". Khi nhận được thông báo, biến này được gắn cờ từ false thành true. Chúng tôi làm điều này để chúng tôi chỉ truyền một thông báo nếu một thông báo đã được nhận (cờ == true) ở dòng 134. Và khi chúng tôi đã truyền thông điệp của mình, đó là 'công việc đã hoàn thành', vì vậy chúng tôi xóa cờ trở lại false ở dòng 137.
Một lần nữa, chúng ta có thể kiểm tra biên dịch (D đến I), và lần này chúng ta có thông báo lỗi 'không được khai báo' (được hiển thị). Điều này cho chúng ta biết rằng chúng ta chưa khai báo recv (); hàm số. Chúng tôi dự định thực hiện việc này sau, vì vậy bây giờ để cho phép chúng tôi có được một biên dịch rõ ràng, chúng tôi cần tạo một hàm giả hoặc hàm giữ chỗ, như được hiển thị tiếp theo.
Một lần nữa, chúng ta có thể kiểm tra biên dịch (D đến I), và lần này chúng ta có một thông báo lỗi 'không được khai báo' khác cho tran (); hàm số. Điều này cần một sơ khai tương tự tạo. Một lần nữa chúng ta có thể kiểm tra biên dịch (D đến I), và lần này chúng ta sẽ thấy nó hoạt động hoàn hảo; càng xa càng tốt.
Bước 9: Kết thúc Vòng lặp chính: A) Nhận từ USB, B) Nhận từ Slave Arduino
Có một phần cuối cùng chúng tôi đã thêm để kết thúc phần này là thêm một số mã gỡ lỗi.
Có một hướng dẫn khác về cách gỡ lỗi phác thảo có thể được tham khảo để hiểu những gì chúng tôi đã làm ở đây và tại sao. Tham khảo "Cách xây dựng và kiểm tra các bản phác thảo Arduino có hướng dẫn cho đến khi chúng hoạt động"
Vì vậy, các dòng gỡ lỗi này [136-139 được hiển thị] được thêm vào tiếp theo trong vòng lặp chính và, xin hãy để ý, bạn có thể kiểm tra chúng trong phần Master bằng cách đặt biến gỡ lỗi là true và Biên dịch (I), sau đó nếu bạn kết nối Arduino lên, bạn có thể Tải lên, mở Trình theo dõi nối tiếp và xem liệu những gì quay trở lại Màn hình nối tiếp như được hiển thị ở đây (bạn có thấy thông báo "CHẾ ĐỘ GỬI" được thêm vào không?)
Bước 10: Nhận và xử lý dữ liệu trong Slave Arduino
Nhận từ Slave Arduino
Thêm mã cần thiết cho kênh thứ hai vào vòng lặp chính, bộ thu nối tiếp phần mềm như hình minh họa - dòng 149 đến dòng 155.
Bạn có thể thấy rằng cấu trúc dựa trên những gì chúng ta đã viết ở trên cho Master case không?
Ngoài ra, bạn sẽ thấy rằng chúng tôi gặp lỗi trình biên dịch, một hàm chưa được khai báo khác - lần này là parseData (); - vì vậy chúng ta cũng cần phải tạo sơ khai cho việc này, trước khi chúng ta có thể chạy một biên dịch thử nghiệm không có lỗi.
Xử lý dữ liệu trong Slave Arduino
Thêm mã vòng lặp chính cần thiết cho Arduino nếu nó được cấu hình như một thiết bị Slave như được hiển thị - dòng 163 đến 174. Bạn có thể thấy rằng cấu trúc của nó rất giống với cấu trúc của kênh đầu tiên không?
Và bạn sẽ thấy lần này nó biên dịch hoàn toàn tốt.
Bước 11: Viết hàm nhận
Hàm Nhận - void recv (char from) {} - có hai công việc chính.
1 để nhận một chuỗi ký tự từ kênh USB và
2 để nhận một từ Arduino đến kênh Arduino.
Lần đầu tiên chúng ta sẽ cần sử dụng vì nó sử dụng UART phần cứng được tích hợp sẵn của Arduino và lần thứ hai sử dụng Thư viện Arduino tiêu chuẩn: UART phần mềm.
Khi chúng ta bắt đầu thêm mã vào một hàm - để tạo một hàm thực hiện một việc gì đó, thay vì chỉ là sơ khai - chúng ta cần nhớ xóa hoặc nhận xét phần sơ khai mà nó đang thay thế. Nếu không, chúng tôi gặp lỗi biên dịch: refefintion of 'void lrec (char)'.
Hãy thử và nhận lỗi, sau đó thử một trong các cách được đề xuất ở trên để loại bỏ lỗi đó.
Bắt đầu với một hàm trông giống như hàm mà chúng tôi hiển thị ở đây, dòng 75 đến 88 màu vàng.
Bây giờ bạn biết rằng có mã, bạn sẽ cần thử hoạt động Biên dịch. Nó khiến bạn gặp lỗi, giống như những lỗi chúng ta đã gặp trước đó, thuộc loại: tên hàm không được khai báo trong phạm vi này. Ban đầu, chúng tôi sẽ cần một bản gốc khác để biên dịch qua lỗi này, vì vậy hãy thêm một bản gốc vào như trước đây và đảm bảo rằng bây giờ bạn có thể nhận được một bản biên dịch mà không có lỗi.
Bây giờ chúng ta hãy xem mã chúng ta đã viết cho hàm recv ().
Nó khá rõ ràng, bạn có thể thấy việc sử dụng điều kiện 'if' để tạo ra hai phần của hàm được đề cập ở trên.
Mã bên trong phần 'sw' và phần 'hw' có cùng dạng, và tôi sẽ mô tả nó ở đây.
Đầu tiên của cặp dòng trong mỗi trường hợp là phần bắt đầu của vòng lặp while. Nếu bạn không quen thuộc với while, bạn có thể tra cứu nó trong trang Arduino.cc/Reference để biết giải thích và ví dụ. Ở đây chúng ta đợi 'trong khi' hàm 'Serial' có sẵn không nhận được bất kỳ ký tự nào và vì biến newData đã bị tắt (tức là điều kiện newData == false là true). Ngay sau khi một ký tự - hoặc nhiều hơn một ký tự - được nhận, đồng thời sẽ chuyển xuống dòng thứ hai trong cặp này. Điều đó sau đó sẽ gọi đến recAstringChar (char); chức năng xử lý ký tự hiện tại. Cặp dòng này sau đó sẽ xen kẽ trong khi (hoặc miễn là) có bất kỳ ký tự nào vẫn cần được nhận. Khi tất cả chúng đã hoàn thành, trạng thái while kết thúc, cho phép kết thúc cấp độ tiếp theo nếu hoặc khác, và lần lượt cho phép rec (char); chức năng kết thúc. Vì vậy, một tin nhắn đầy đủ bây giờ ong đã nhận được.
Bước 12: Viết hàm con Nhận - Phần 1
Bây giờ chúng ta cần viết hàm recAstringChar (char);. Bạn thấy từ nhận xét đến dòng 50 ở trên cùng của nó, rằng công việc của nó là cập nhật hai bộ đệm với các bản sao của thông điệp nối tiếp đến. [Hóa ra trong khi tôi đang cố gắng để mọi thứ hoạt động, một điều tôi học được là tôi cần hai bộ đệm khác nhau - hoặc ít nhất đó là cách dễ nhất để giải quyết một số vấn đề, do đó nó gần như phát triển thành cần 2 bộ đệm, vì vậy Tôi vừa tạo chúng.] Tôi đã gọi một bộ đệm: acceptData và bộ đệm kia: acceptChars.
Bộ đệm là các biến toàn cục, vì vậy chúng được khai báo ở cấp mô-đun, xem dòng 9 và 10 của tab chung. Có các biến khác được khai báo bên trong hàm này do đó có phạm vi cục bộ - được hiển thị trong các dòng 51-54 ở đây. Đây không phải là nơi để giải thích sự khác biệt giữa người dân địa cầu và người dân địa phương, nhưng có thêm thông tin về điều này trong https://www.arduino.cc/glossary/en/ trong Địa phương và Toàn cầu.
Bạn cũng có thể tìm hiểu tất cả về các kiểu dữ liệu và kiểu sửa đổi: static, boolean, byte, const, char trong https://www.arduino.cc/reference/en/#variables, được hiển thị tại đây.
Luồng chương trình chính trong chức năng này được điều khiển bởi if ở dòng 56 ở đây và tương ứng khác của nó ở dòng 74. Điều này giải quyết hai tình huống
a) [từ dòng 74 trở đi] khi tin nhắn nhận được bắt đầu. Điều này xảy ra khi startMarker được phát hiện - đây được định nghĩa là ký tự '<', đó là lý do tại sao bất cứ khi nào chúng tôi kiểm tra bản phác thảo, chúng tôi luôn bắt đầu chuỗi của mình bằng ký tự đó. Nếu chúng ta không làm vậy thì sẽ không có gì được xử lý khi nhận được, tất cả sẽ bị bỏ qua giống như thể chúng ta đang gõ vô nghĩa tại lời nhắc bàn phím 'Serial Monitor'.
b) [dòng 56 đến 73] nhận tất cả các ký tự khác, bất kể chúng là gì, nhưng chúng chỉ xử lý các ký tự sau khi bắt đầu hợp lệ đã xảy ra (dấu '>' đã được nhận như trong câu a) ở trên.)
Trong những dòng này (từ 74 đến 78), chúng tôi đặt cái nhận được <vào một trong các bộ đệm (Dữ liệu nhận được [0]) nhưng không đặt trong bộ đệm kia. Chúng tôi điều chỉnh con trỏ bộ đệm (biến: char ndx) để trỏ đến vị trí bộ đệm dự phòng tiếp theo (Nhận dữ liệu [1]) bằng cách sử dụng lệnh sau tăng (++) trong dòng ndx ++; và chúng tôi đặt cờ đang xử lý thành true.
Luồng chương trình trong phần này của hàm được điều khiển bởi if ở dòng 57 ở đây và tương ứng khác của nó ở dòng 65. Điều này đề cập đến hai tình huống
a) [từ dòng 65 trở đi] khi tin nhắn nhận được kết thúc. Điều này xảy ra khi endMarker được phát hiện - được định nghĩa là>, đó là lý do tại sao bất cứ khi nào chúng tôi kiểm tra bản phác thảo của mình, chúng tôi luôn kết thúc chuỗi của mình bằng ký tự đó. Một trong những điều xảy ra khi nhận được ký tự kết thúc là cờ toàn cục (biến về mặt kỹ thuật) newData được đặt true ngay khi hàm kết thúc, do đó hàm đã gọi hàm con của chúng ta (hàm gọi: recv (char);) có thể 'biết' rằng dữ liệu mới hợp lệ đã được nhận đầy đủ.
b) [dòng 57 đến 64] nhận tất cả các ký tự khác, bất kể chúng là gì. Nó chỉ bận rộn đậu chúng ngay ngắn thành hàng ở cả hai vùng đệm.
Bước 13: Viết hàm con Nhận - Phần 2
Có thể hữu ích để đưa ra một ví dụ về 2 vùng đệm trông như thế nào khi chúng được điền vào. Nếu chúng tôi nhập phím enter, bộ đệm sẽ có các ký tự được hiển thị trong đó:
Vì vậy, bây giờ bạn có thể thấy chúng tôi có một bộ đệm chính xác là tất cả các ký tự giống như lần đầu tiên chúng tôi nhập vào và một bộ đệm chỉ có hai giá trị và dấu phẩy ngăn cách. Bây giờ chúng ta có một số mã có thể nhận các ký tự mà chúng ta nhập vào trên bàn phím Serial Monitor, chúng ta có thể chuyển từ CDIO phase I sang O, nhập một số chuỗi và xem điều gì sẽ xảy ra. Tải mã lên Master Arduino, mở Serial Monitor và thử nhập nội dung hợp lệ, chẳng hạn như enter. Bạn có nhận được tiếng vọng trên màn hình Serial Monitor giống như màn hình hiển thị ở đây không?
Bước 14: Viết hàm truyền và phân tích cú pháp
Đầu tiên cho Truyền
Vì vậy, bây giờ chúng ta đã nhận được một chuỗi, chúng ta có thể viết hàm truyền: tran (char); để thay thế sơ khai của nó. Điều này sẽ cho phép chúng tôi gửi một chuỗi từ Master đến Slave Arduino, vì vậy hãy đảm bảo rằng cả hai thiết bị đã được cắm và kết nối với nhau để kiểm tra chức năng mới này.
Nhập chức năng này như được hiển thị ở đây trong các dòng từ 117 đến 133. Như bạn sẽ nhận ra, nó có hai phần, một phần để truyền đến kênh USB (UART phần cứng) và một phần để truyền đến Arduino khác (UART phần mềm.) Điều này nên biên dịch lỗi. - miễn phí và bạn có thể tải ngay bản phác thảo lên và xem điều gì sẽ xảy ra. Lần này tôi sẽ gửi. Bạn có nhận được kết quả hiển thị?
Ảnh chụp màn hình rất thú vị vì chuỗi Đã nhận… trông chính xác như trước đây và chuỗi Đã truyền… giờ trông chính xác. Tuy nhiên, lưu ý rằng chuyển đổi Số nguyên đã không hoạt động. Vẫn còn một chút mã nữa để thêm vào để làm cho nó hoạt động.
Bước 15: Viết hàm truyền và phân tích cú pháp
Sau đó, đối với Phân tích cú pháp
Đây là một đoạn mã phân tích chuỗi nhận được để tìm nạp các chuỗi một phần số và chuyển đổi chúng thành các giá trị số nguyên. Nó là void parseData (); chức năng của vòng lặp chính
Thay thế đoạn mã phân tích cú pháp bằng đoạn mã được hiển thị trong dòng 98 - 113. Hãy tải nó lên và hãy xem liệu sự cố chúng ta gặp phải với 2 giá trị số nguyên hiện đã được khắc phục hay chưa. Hãy thử.
Có, nó hoạt động, như được hiển thị, các số nguyên được tìm thấy là 49 và 98.
Bước 16: Chung kết
Dữ liệu này đã đi đúng vòng lặp từ PC qua Master qua slave và trở lại qua Master trở lại PC. Với phiên bản phổ biến đã hoàn thành được tải lên ở cả hai đầu Master và slave và với chế độ gỡ lỗi đã tắt ngay bây giờ, chúng tôi sẽ thấy dữ liệu nhận được chính xác ở cả hai đầu như được hiển thị ở đây.
Đề xuất:
Ống kính Macro tự làm có AF (Khác với tất cả các ống kính macro tự làm khác): 4 bước (có ảnh)
Ống kính macro tự làm có AF (Khác với tất cả các ống kính macro tự làm khác): Tôi đã thấy rất nhiều người chế tạo ống kính macro với ống kính kit tiêu chuẩn (Thường là 18-55mm). Hầu hết chúng là một ống kính chỉ dính vào máy ảnh trở lại hoặc thành phần phía trước bị loại bỏ. Có những nhược điểm cho cả hai tùy chọn này. Để lắp ống kính
Gửi dữ liệu từ Arduino sang Excel (và vẽ đồ thị): 3 bước (có hình ảnh)
Gửi dữ liệu từ Arduino sang Excel (và vẽ sơ đồ): Tôi đã tìm kiếm rất nhiều cách để có thể vẽ biểu đồ đọc cảm biến Arduino của mình trong thời gian thực. Không chỉ vẽ biểu đồ, mà còn hiển thị và lưu trữ dữ liệu để thử nghiệm và chỉnh sửa thêm. Giải pháp đơn giản nhất mà tôi đã tìm thấy là sử dụng excel, nhưng với
Gửi dữ liệu cảm biến nhiệt độ và rung không dây sang Excel bằng Node-RED: 25 bước
Gửi dữ liệu cảm biến nhiệt độ và rung không dây sang Excel bằng Node-RED: Giới thiệu NCD’s Long Range IoT Cảm biến nhiệt độ và rung động không dây công nghiệp, tự hào với phạm vi lên đến 2 dặm nhờ sử dụng cấu trúc mạng lưới không dây. Kết hợp cảm biến nhiệt độ và rung 16 bit chính xác, thiết bị này
Làm thế nào để xây dựng Bánh xe ánh sáng cầu vồng quay tuyệt vời này !!!: 10 bước (có hình ảnh)
Làm thế nào để tạo ra một bánh xe ánh sáng cầu vồng quay tuyệt vời này !!!: Trong phần hướng dẫn này, tôi sẽ chỉ cho bạn cách tạo ra một bánh xe ánh sáng cầu vồng quay cực kỳ thú vị! Đây là bài dự thi của tôi trong cuộc thi 'LET IT GLOW'. Tôi đã tạo ra bánh xe ánh sáng cầu vồng quay này từ những bộ phận mà tôi đang ngồi trong nhà kho của mình. Dự án này là
Một vỏ bọc phím Usb khác, Lần này dành cho các nhiếp ảnh gia Analog: 3 bước
Một chiếc vỏ chìa khóa Usb khác, Lần này dành cho các nhiếp ảnh gia Analog: Tôi đã để một chiếc chìa khóa USB trên bàn làm việc của mình một lúc, chiếc vỏ đã bị nứt và mở ra và tôi đã giữ nó cho đến khi tôi tìm được chiếc vỏ thay thế phù hợp. Tôi hy vọng cảm giác tương tự của nó sẽ xin vui lòng các nhiếp ảnh gia phim về hướng dẫn