Arduino 上传湿温度到 OneNET 并控制舵机 - 无需 OneNET 库
以下是一个简单的示例代码,可以实现 Arduino 上传湿温度到 OneNET 平台,并通过 OneNET 平台控制舵机的角度。
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // 用于与 OneNET 平台通信的串口
const char* apiKey = 'your_API_key'; // 在 OneNET 平台上注册的 API key
const char* deviceId = 'your_device_id'; // 在 OneNET 平台上注册的设备 ID
const int servoPin = 9; // 连接舵机的引脚
int servoAngle = 0; // 舵机的初始角度
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
pinMode(servoPin, OUTPUT);
}
void loop() {
// 读取湿度和温度
float humidity = 50; // TODO: 用实际的传感器读取湿度
float temperature = 25; // TODO: 用实际的传感器读取温度
// 将湿度和温度上传到 OneNET 平台
String payload = '{\'datastreams\':[{{\'id\':\'humidity\',\'datapoints\':[{{\'value\':\'' + String(humidity) + '\'}]}},{{\'id\':\'temperature\',\'datapoints\':[{{\'value\':\'' + String(temperature) + '\'}]}}]}';
String url = 'AT+HTTPPARA='URL','http://api.heclouds.com:80/devices/' + String(deviceId) + '/datapoints'';
String data = 'AT+HTTPDATA=' + String(payload.length()) + ',10000';
String post = 'AT+HTTPACTION=1';
String read = 'AT+HTTPREAD';
String close = 'AT+HTTPTERM';
mySerial.println('AT+HTTPINIT');
delay(1000);
mySerial.println(url);
delay(1000);
mySerial.println(data);
delay(1000);
mySerial.println(payload);
delay(1000);
mySerial.println(post);
delay(5000);
mySerial.println(read);
delay(1000);
while (mySerial.available()) {
String response = mySerial.readStringUntil('\n');
Serial.println(response);
}
mySerial.println(close);
delay(1000);
// 检查是否有控制命令
String cmdUrl = 'AT+HTTPPARA='URL','http://api.heclouds.com:80/cmds?device_id=' + String(deviceId) + ''';
String cmdGet = 'AT+HTTPACTION=0';
mySerial.println('AT+HTTPINIT');
delay(1000);
mySerial.println(cmdUrl);
delay(1000);
mySerial.println(cmdGet);
delay(5000);
mySerial.println(read);
delay(1000);
while (mySerial.available()) {
String response = mySerial.readStringUntil('\n');
if (response.startsWith('{\'id\':\''')) {
int index = response.indexOf('\'cmd\':\''');
if (index != -1) {
int start = index + 7;
int end = response.indexOf('\'', start);
String cmd = response.substring(start, end);
if (cmd == 'open') {
servoAngle = 0;
} else if (cmd == 'close') {
servoAngle = 180;
}
}
}
}
mySerial.println(close);
delay(1000);
// 控制舵机的角度
digitalWrite(servoPin, HIGH);
delayMicroseconds(500 + servoAngle * 2000 / 180);
digitalWrite(servoPin, LOW);
delay(20);
}
这个代码中使用了 Arduino 的软件串口库,将串口通信的引脚设置为 2 和 3。在 setup 函数中初始化了串口和舵机引脚,同时将舵机的初始角度设置为 0。
在 loop 函数中,首先读取湿度和温度,并将它们打包成 JSON 格式的数据,使用 AT 指令将数据上传到 OneNET 平台。
然后使用 AT 指令查询是否有控制命令。如果 OneNET 平台发送了控制命令,就解析命令并根据命令调整舵机的角度。
最后使用 Arduino 的 PWM 输出功能(通过调整舵机引脚的电平和脉宽)控制舵机的角度。注意,舵机的脉宽范围通常为 500-2500 微秒,对应的角度范围为 0-180 度。
原文地址: https://www.cveoy.top/t/topic/oKLb 著作权归作者所有。请勿转载和采集!