Cách xây dựng một nguyên mẫu IoT mạnh mẽ trong vòng chưa đầy một ngày (Phần 2)

(Phần 1 ở đây .)
Chào mừng bạn trở lại với bài viết thứ hai của chúng tôi về việc tạo một nguyên mẫu IoT hai chiều, mạnh mẽ trong vòng chưa đầy một ngày bằng cách sử dụng Arduino , Heroku và Node-RED. Nếu bạn bỏ lỡ phần đầu tiên, chúng tôi đã đề cập đến việc thiết lập Node-RED, bổ sung bảo mật và triển khai cho Heroku. Trong bài viết này, chúng tôi sẽ xem xét việc tạo hệ thống nhúng của chúng tôi trên bảng Arduino, kết nối chúng với phiên bản Node-RED của chúng tôi, tùy chỉnh Sketches và tạo luồng cho phép các thiết bị của chúng tôi giao tiếp với nhau. Bắt đầu nào.
Arduino IoT Cloud là gì?
Để kết nối các thiết bị vật lý (bo mạch) với internet, chúng tôi sẽ sử dụng Arduino IoT Cloud, một trình quản lý thiết bị và công cụ trực quan hóa dữ liệu. Sau khi thiết lập tài khoản tại https://create.arduino.cc , chúng tôi có thể tạo cặp song sinh kỹ thuật số đầu tiên của mình.
Một cặp song sinh kỹ thuật số là một biểu diễn trực tuyến hợp lý của một hệ thống. Trong Arduino, điều này được gọi là 'Những thứ' hoặc 'Ứng dụng'. Chúng tôi cần tạo hai Ứng dụng khác nhau - một cho cảm biến và một cho bộ truyền động. Sau đó, chúng tôi có thể kết hợp một thiết bị vật lý (một trong các bảng MKR1010 của chúng tôi) với nó.
Đây là tình huống: Chúng tôi muốn một trong các thiết bị đọc độ sáng môi trường (thiết bị cảm biến) và Ma trận đèn LED trên MKR1010 khác (thiết bị truyền động) hiển thị BẬT nếu giá trị độ sáng vượt quá một giới hạn nhất định, TẮT nếu không.
Đầu tiên, chúng ta cần tạo một Thing mới và đặt tên cho nó. Tôi sẽ gọi là EnvSensors của tôi. Sau đó, chúng ta cần liên kết một thiết bị. Để thực hiện việc này, hãy nhấp vào 'Định cấu hình thiết bị mới'.
Trước khi định cấu hình thiết bị, hãy nhớ rút bất kỳ tấm chắn nào trên MRK1010 và cắm nó vào PC của bạn bằng cáp USB-micro. Sau khi cài đặt thiết bị, bạn có thể đặt tên cho thiết bị. Tôi sẽ gọi nó là SensorsBoard.
Trong giai đoạn đầu, hệ thống sẽ nhận diện bảng; nó sẽ tìm thấy một MKR1010. Sau đó, nó sẽ tải một bản phác thảo lên bảng để tự động đưa chứng chỉ SSL vào phần tử bảo mật cho các giao tiếp được mã hóa trong tương lai. Quá trình này mất một vài phút, vì vậy hãy kiên nhẫn.
Sau khi hoàn tất, chúng ta có thể tiếp tục tạo Thing của mình. Chúng tôi cần tạo ít nhất một thuộc tính, độ sáng, để bắt đầu thu thập dữ liệu từ thiết bị của mình.
Tên biến thuộc tính sẽ là Luminosity. Loại sẽ là Độ sáng. Chúng tôi cũng sẽ đặt giá trị tối thiểu là 0 cho độ che khuất và giá trị tối đa là 1000 cho độ sáng cao. Sau đó, chúng tôi đặt các quyền là 'Chỉ đọc' vì chúng tôi chỉ có thể đọc từ các cảm biến; chúng ta không thể ghi giá trị cho chúng. Tiếp theo, chúng tôi muốn gửi các giá trị độ sáng theo định kỳ, vì vậy chúng tôi đặt tần số thành các khoảng thời gian một giây.
Cuối cùng, nhấp vào 'Thêm thuộc tính' và kiểm tra để đảm bảo rằng Thẻ cảm biến được đặt làm thiết bị liên kết.
Bây giờ chúng ta có thể nhấp vào 'Chỉnh sửa Phác thảo', thao tác này sẽ mở một IDE web. Arduino IoT Cloud tự động tạo mẫu để gửi dữ liệu như chúng tôi đã chỉ định trước đó - chúng tôi chỉ cần đọc dữ liệu từ cảm biến.
Để đọc các cảm biến từ bảng, chúng tôi phải đặt tấm chắn MKR ENV lên trên MKR WIFI 1010. Sau đó, chúng tôi có thể cắm lại cáp USB vào bảng và sửa đổi bản phác thảo một chút trước khi tải lên lần cuối.
Về mặt phần mềm, chúng ta cần thêm một thư viện để đọc các giá trị từ cảm biến. Dòng sau là đủ:
#include
Sau đó, để tránh cố gắng đọc dữ liệu trước khi khởi tạo, chúng tôi tiếp tục lặp lại cho đến khi thư viện tải và giao tiếp với các cảm biến:
if (!ENV.begin()){
Serial.println("Failed to initialize MKR ENV shield!");
while(1);
}
Và đây là nơi điều kỳ diệu xảy ra! Tệp được tạo tự động có tên thingProperties.h
đã khai báo biến độ sáng cho chúng tôi:
Độ sáng nổi;
void initProperties(){
ArduinoCloud.setThingId(THING_ID);
ArduinoCloud.addProperty(luminosity, READ, 1 * SECONDS, NULL);
}
Hãy nhớ rằng, không bao giờ thay đổi thingProperties.h
; nó được tạo tự động và có thể không đồng bộ nếu bạn thay đổi nó theo cách thủ công.
Phần thú vị là chúng ta có thể sử dụng độ sáng thay đổi như một biến bình thường. Nó sẽ được gửi tự động đến Arduino Cloud mỗi giây, như chúng tôi đã chỉ định trong giao diện.
Để đọc dữ liệu, chúng ta chỉ cần một vài dòng trong loop()
hàm:
void loop() {
ArduinoCloud.update();
luminosity = ENV.readIlluminance();
delay(50); //avoid reading the sensor too many times
}
Chúng ta đã gần xong, nhưng làm cách nào để kết nối bo mạch với mạng WiFi? Chúng tôi chỉ định thông tin đăng nhập mạng trong tab bí mật:
Tải bản phác thảo này lên bảng của bạn.
Bây giờ là lúc để xác minh rằng mọi thứ hoạt động như mong đợi. Vì vậy, hãy tạo một bảng điều khiển đơn giản mới trong Arduino IoT Cloud:
https://create.arduino.cc/iot/dashboards
Tôi đặt tên là Cảm biến và Thiết bị truyền động của tôi. Bây giờ chúng tôi sẽ thêm một widget mới. Trong tab Things, có một cách dễ dàng để tạo trang tổng quan chỉ với một cú nhấp chuột. Tôi đã chọn điều của tôi EnvSensors.
Sau khi đặt tiện ích con, bạn sẽ thấy bảng điều khiển hiển thị dữ liệu độ sáng theo thời gian thực từ cảm biến:
Tuyệt quá! Bây giờ chúng ta hãy tạo một Thing mới và cấu hình một thiết bị mới. Hãy gọi tên Thing EnvActuators mới này và đặt tên cho thiết bị mới là ActuatorsBoard. Tôi khuyên bạn nên xóa SensorsBoard khỏi thiết bị USB của bạn. Tránh cắm vào ma trận LED cho đến khi bạn định cấu hình thiết bị.
Thing mới sẽ có hai biến: ' display_text
' để hiển thị trực tuyến cùng giá trị mà ma trận LED đang thực sự hiển thị và một switch
biến '' để cho chúng ta biết liệu độ sáng đã đạt đến một mức nhất định hay chưa. Vì vậy, chúng ta cần thay đổi văn bản trên màn hình.
Biến Kiểm tra Hiển thị có thể được đặt thành:
- Tên: Văn bản hiển thị
- Biến: display_text
- Loại: Chuỗi ký tự
- Quyền: Đọc và Viết
- Cập nhật: Khi giá trị thay đổi
- Lịch sử: TẮT
Và đèn LED:
- Tên: Công tắc LED
- Biến: led_switch
- Loại: BẬT / TẮT (Bool)
- Quyền: Đọc và Viết
- Cập nhật: Khi giá trị thay đổi
- Lịch sử: BẬT
Sau khi chúng tôi nhấp vào 'Chỉnh sửa phác thảo,' chúng tôi có một mẫu mới để bắt đầu. Có hai chức năng ở cuối bản phác thảo cho phép thiết bị phản ứng khi một thuộc tính thay đổi. Các hàm đó được đặt tên CallBacks
và được gọi mỗi khi một thuộc tính thay đổi.
Đoạn mã sau cho phép bạn thay đổi giá trị được hiển thị trong Ma trận LED mỗi khi công tắc thay đổi giá trị từ 'true' thành 'false' và ngược lại.
void onLedSwitchChange() {
if(led_switch){
display_text = "on";
}else{
display_text = "off";
}
}
Trong khi mã vòng lặp chính là:
void loop() {
ArduinoCloud.update();
// Your code here
MATRIX.beginDraw();
MATRIX.clear();
MATRIX.stroke(80, 80, 100);
MATRIX.text(display_text, 0, 1);
MATRIX.endDraw();
}
Vì vậy, mỗi khi display_text
biến thay đổi, Ma trận LED sẽ xóa và một chuỗi mới được ghi trên đó.
Bạn có thể tìm thấy toàn bộ mã trong bản phác thảo EnvActuators của tôi .
Bây giờ, chúng tôi có thể tải bản phác thảo lên MRK 1010 bằng RGB Shield và thêm Thing vào bảng điều khiển.
Bạn sẽ có một bảng điều khiển trông tương tự như hình ảnh bên dưới:
Mỗi khi bạn thay đổi công tắc led_switch, văn bản hiển thị sẽ thay đổi trên cả tiện ích display_text và trên thiết bị vật lý của bạn.
Tương tác với Arduino Tạo API IoT
Để tạo một ứng dụng cho phép hai thiết bị khác nhau nói chuyện với nhau trong khi thêm logic tùy chỉnh của chúng tôi, chúng tôi cần sử dụng các API Arduino Tạo IoT REST.
Có hai loại API cho Arduino IoT Cloud:
- API đám mây REST Arduino IoT được tài liệu đầy đủ
- Một API thời gian thực (chỉ có sẵn cho JavaScript tính đến thời điểm viết bài này), có sẵn trên GitHub.
Hệ thống được điều chỉnh nên bạn không thể tạo nhiều hơn 10 yêu cầu / s cho API REST, nhưng điều đó đủ tốt cho trường hợp sử dụng của chúng tôi.
Trong bài viết đầu tiên của chúng tôi, chúng tôi đã tìm hiểu cách triển khai Node-RED trên Heroku. Lần này chúng ta cần kết nối nó với Arduino IoT Cloud bằng cách sử dụng mã thông báo API.
To obtain an IoT API token, go to the Things page and create one at the end of the page:
Be sure to keep your credentials in a safe place. (You won't be able to recover your client secret; you'll only be able to generate a new one.)
Connecting to Node-RED
If you followed the first article of this series, you should be able to access Node-RED from your Heroku Apps page. After accessing the app, you'll be able to see the Arduino blocks on the left panel and place them.
Double-clicking on a property will open a connection panel as shown below:
And clicking on the pencil will allow you to add the Arduino IoT Cloud API credentials.
Then, click 'Add.' Now we can connect our luminosity property.
After clicking 'Deploy' at the top right of the interface, we can begin to see the data flowing. Important: Nothing happens if you do not deploy your flow!
We are finally getting the property in Node-RED. The Luminosity I read is about 650 Lumen:
Design a Flow and Deploy It
Our flow is running on a Heroku Dyno. A Heroku Dyno is an application container with an ephemeral filesystem. This means your application will lose any data stored on a disk. Unfortunately, by default, Node-RED stores the flows and credentials on the filesystem.
There are many different strategies to avoid this, but they all require the development of a Node-RED configuration handler plugin. I created a simpler but effective solution. If we store the flows and the credentials in our source code, then they can be deployed on a new Dyno every time without losing our configuration. So I added the parameter flowFile: 'data/flows.json' in the settings.js file. Please see the previous article for more details.
Let’s run the application locally (in our node-red-private repo with the iot-proto branch).
$ heroku local
Now log into Node-RED to start creating the first flow. We should add an input property, a switch, and an output property. The input is connected to the luminosity sensor, while the output is connected to the LED Switch. In the middle, we'll place a switch block to control our LED value.
Our flow should look like this:
There are five components. The green ones are the Arduino properties, and include:
- An input Arduino Property block (connected to the luminosity).
- A logical switch, with the output 1 if the luminosity is above 300 and the output 2 if the luminosity is lower.
- A set block to activate the switch.
- A similar block to deactivate it.
- An output Arduino Property block bounded to the LED Switch property.
Don't forget to click 'Deploy' once you are done. If you're feeling lazy, you can import my simple Arduino IoT Cloud Node-RED Flow.
Now we have to commit our code for the flows.
$ git add data
$ git commit -a -m ‘Saving the flow
$ git push heroku iot-proto:master
And finally, we have the app in production!
We now have the RGB Matrix displaying ON if the luminosity is more than 300, and OFF if it less than 300.
We now have a fully-functional, bi-directional IoT prototype up and running in just a few hours, and ready for any projects you can dream up! See a video of it all working here.
Conclusion
Here is a quick recap of what we learned:
- How to set up boards in Arduino IoT Cloud.
- How to set up properties for the Thing.
- How the Sketch is automatically built from the system, and how to customize it. Sketches are available at:
- How to create a dashboard.
- How to use the Arduino IoT Cloud API.
- How to deploy Node-RED to Heroku.
- How to make the Heroku website persistent (with encrypted credentials).
All of those steps allowed us to:
- Create a custom logic application on Node-RED.
- Have two different devices talk to each other.
By leveraging Node-RED, you can also add many integrations with third-party services.
Potential Improvements
In the future, I'd like to add proper persistence by using a Redis or Postgres storage supported by the Heroku Database and Data Management System. This will require writing a small js plugin to allow Node-RED to store the flows and configurations in a database. I found an old repo by Atsushi Kojo containing a PoC. The code is old but I will probably update it in the future. The repo is named node-red-heroku.
After I finish that setup, it will be possible to use a nice Heroku feature, the Deploy to Heroku button. This will allow a one-click setup of everything we've seen so far.
What’s Next?
In the next article, we'll create a working prototype of an entire custom Node.js application by using the Arduino Real-Time Js Client working inside Heroku and interacting with Arduino IoT Cloud.
Có thể bạn quan tâm
