成果概览
现在可以在arduino cloud官网提供的IOT物联网平台查看实时数据,目前的功能包括:利用arduino R4 Wi-Fi版开发板自带的Wi-Fi联网功能,将GPS信号上传,并利用谷歌地图显示位置信息;同时,该系统辅助性的加入了控制LED亮灭以及显示Wi-Fi的IP地址功能,用以检测系统正确性。
系统整体图片,可见,所需外设很少,对于学习arduino物联网开发入门很友好。
所需物料
- arduino UNO R4 Wi-Fi开发板
- 面包板
- LED
- 220Ω电阻
- GY-NEO-8M GPS芯片(搭配陶瓷天线)
- 导线若干
- 另外,需申请arduino cloud账号(免费版即可)
开发流程
在arduino cloud中新建thing,连接自己的device,创建variable变量后与dashboard进行连接。
核心代码
/* Sketch generated by the Arduino IoT Cloud Thing "Untitled" https://create.arduino.cc/cloud/things/b28f3724-a84b-4973-babe-1ae2e4a7aac1 Arduino IoT Cloud Variables description The following variables are automatically generated and updated when changes are made to the Thing String iPaddress; float latitude; float longitude; CloudLocation location; bool led; Variables which are marked as READ/WRITE in the Cloud Thing will also have functions which are called when their values are changed from the Dashboard. These functions are generated with the Thing and added at the end of this sketch. */ #include "thingProperties.h" #include <WiFiS3.h> #include <TinyGPS++.h> #include <SoftwareSerial.h> #define gpsTX 7 #define gpsRX 8 #define gpsBaud 9600 // 确保这个波特率与你的GPS模块设置一致 SoftwareSerial gpsSerial(gpsRX, gpsTX); TinyGPSPlus gps; unsigned long lastUpdateTime = 0; const int timeZoneOffset = 8; // 假设你在东八区 const int ledPIN = 2; void setup() { // Initialize serial and wait for port to open: Serial.begin(9600); gpsSerial.begin(gpsBaud); Serial.println("GPS Module Testing with TinyGPS++ library"); // This delay gives the chance to wait for a Serial Monitor without blocking if none is found delay(1500); // Defined in thingProperties.h initProperties(); // Connect to Arduino IoT Cloud ArduinoCloud.begin(ArduinoIoTPreferredConnection); /* The following function allows you to obtain more information related to the state of network and IoT Cloud connection and errors the higher number the more granular information you’ll get. The default is 0 (only errors). Maximum is 4 */ setDebugMessageLevel(2); ArduinoCloud.printDebugInfo(); pinMode(ledPIN,OUTPUT); // 初始化Wi-Fi Serial.print("Connecting to "); Serial.println(SSID); WiFi.begin(SSID, PASS); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } // 连接成功 Serial.println(""); Serial.println("WiFi connected."); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // 打印IP地址 iPaddress = WiFi.localIP().toString(); // 将本地IP地址转换为String并赋值给iPaddress } void loop() { ArduinoCloud.update(); // Your code here if (millis() - lastUpdateTime >= 60000) { lastUpdateTime = millis(); // 更新上次更新时间 // 读取GPS数据 while (gpsSerial.available()) { char c = gpsSerial.read(); gps.encode(c); // 处理接收到的字符 } // 检查并显示GPS信息 if (gps.location.isValid() || gps.date.isValid() || gps.time.isValid()) { displayGPSInfo(); latitude = gps.location.lat(); longitude = gps.location.lng(); location = {latitude,longitude}; } } } /* Since Led is READ_WRITE variable, onLedChange() is executed every time a new value is received from IoT Cloud. */ void onLedChange() { // Add your code here to act upon Led change digitalWrite(ledPIN,led); } void displayGPSInfo() { if (gps.location.isValid()) { Serial.print("Latitude: "); Serial.println(gps.location.lat(), 6); Serial.print("Longitude: "); Serial.println(gps.location.lng(), 6); } if (gps.date.isValid()) { Serial.print("Date: "); Serial.print(gps.date.month()); Serial.print("/"); Serial.print(gps.date.day()); Serial.print("/"); Serial.println(gps.date.year()); } if (gps.time.isValid()) { int localHour = (gps.time.hour() + 24 + timeZoneOffset) % 24; // 处理时区并避免负数 Serial.print("Time: "); Serial.print(localHour); Serial.print(":"); Serial.print(gps.time.minute()); Serial.print(":"); Serial.println(gps.time.second()); } }
thing配置
本系统共创建了五个variables,除led变量设置为读/写皆可外,其余变量均为只读类型。此外,thing中要配置好开发板连接的Wi-Fi:
只需要输入Wi-Fi名称和密码就好了,注意,我在试验中发现,开发板接收到的Wi-Fi信号只能是2.4GHz,使用5GHz的Wi-Fi信号连接不上,不知道是不是我自己哪里没有设置对。
以上内容设置完成,cloud编辑环境会自动生成包含这些变量以及Wi-Fi密码的头文件,很方便,不需要我们自己配置:
之后,我们就可以进入.ino文件进行核心功能的搭建,本项目的核心代码已经放在上面了,我现在简要记录几个关键的修改位置。
#include <WiFiS3.h>
实测R4 Wi-Fi开发板只能使用
WiFiS3
的Wi-Fi库文件,另一个wifinina
库用不了(不知道是不是我没用对)。if (gps.location.isValid() || gps.date.isValid() || gps.time.isValid()) { displayGPSInfo(); latitude = gps.location.lat(); longitude = gps.location.lng(); location = {latitude,longitude}; }
这里是GPS信号输出的关键步骤,当检测到GPS输出信息有效时,更新变量
latitude
、longitude
和location
的信息。这也是如何在dashboard中显示数据的关键,我们只需要将自己想要知道的数据赋值给在thing中定义的变量,后面就可以显示它了。其中location
变量属于CloudLocation
类,要想使用和更新它,需要location = {Lat, Long};
这样使用。参考信息:‣。这个变量是专门为接下来dashboard中的map准备的。所有程序编写好后,要将程序下载进开发板。
dashboard配置
以latitude变量为例,我们只需要将自己定义的按钮或者别的显示value的模块与先前在variable定义的变量连接起来,我们就可以显示需要的数据了。其余变量以此类推。