介绍
最近买了块便宜的4G开发板,E27-EVK,15元充5年每月100M电信流量。于是翻出了几年前的UNO,写了个简单的客户端上报传感器数据程序,实现Arduino实时监测温湿度和距离,并且每10秒向 E27-EVK发送AT命令组上报数据。
服务端是写了个unicloud云函数,接收到get以后存云数据库。反正都是省钱玩法,算是个案例。
下一步试验一下服务器下发指令。
接线说明
E27、温湿度DHT11的VCC用端子并在一起接Arduino的3.3V
超声波模块HC-SR04的VCC接Arduino的5V
E27、温湿度、超声波模块的GND各自找Arduino的GND接,
E27 MRTD接1 MTXD 可以悬空或接0(程序上传时需要悬空)
温湿度 DAT接2
超声波模块Trig引脚接 3
超声波模块温湿度引脚接 4
Arduino完整代码
#include <DHT.h> // 包含DHT库
#define DHTPIN 2 // 定义DHT数据引脚
#define DHTTYPE DHT11 // 定义传感器类型
#define TRIG_PIN 3 // 超声波模块Trig引脚
#define ECHO_PIN 4 // 超声波模块c引脚
const String baseUrl = "http://apiv.XXXX.cc/v1/http/iotTest";
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200); // 初始化硬件串口
dht.begin(); // 初始化DHT传感器
pinMode(TRIG_PIN, OUTPUT); // 设置Trig为输出
pinMode(ECHO_PIN, INPUT); // 设置Echo为输入
}
// 读取超声波距离(单位:米)
float readDistance() {
// 发送10微秒的触发脉冲
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// 测量回波脉冲的持续时间
long duration = pulseIn(ECHO_PIN, HIGH);
// 计算距离(声速340米/秒,转换为米)
return duration * 0.000340 / 2;
}
void loop() {
// 读取温湿度值
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
float distance = readDistance(); // 读取距离值
//float realDistance = readDistance(); // 读取距离值
Serial.println(distance);
// 检查读取是否成功
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
delay(2000);
return;
}
// 限制距离在合理范围内 (0.02m - 4.00m)
if (distance < 0.02) distance = 0.02;
if (distance > 4.00) distance = 4.00;
// 构建动态URL(保留两位小数)
String url = baseUrl + "?h=" + String(humidity, 0) + "&t=" + String(temperature, 0)+"&d=" + String(distance, 2);
int urlLength = url.length();
// 发送AT指令
Serial.println("AT+QHTTPSTOP");
delay(100);
Serial.print("AT+QHTTPURL=");
Serial.print(urlLength);
Serial.println(",20");
delay(100);
Serial.println(url); // 发送动态URL
delay(100);
Serial.println("AT+QHTTPGET=60");
delay(100);
delay(10000); // 等待10秒
}
云函数
接收到的数据:
简单的实现一个把GET参数转字符串存云数据库。
async iotTest(ctx){
const logs = await db.collection('bs_iotTests').add({msg:JSON.stringify(ctx.event.queryStringParameters),date:new Date()})
return {msg:"ok",time:new Date()}
}