以下是一个简单的示例代码,可以实现 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 度。

Arduino 上传湿温度到 OneNET 并控制舵机 - 无需 OneNET 库

原文地址: https://www.cveoy.top/t/topic/oKLb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录