FILEEM

POWER OF DREAM

Arduino uno + DHT11 + HC-SR04 + E27-EVK + unicloud 实现实时监测温湿度和距离上报云端

介绍

最近买了块便宜的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 uno + DHT11 + HC-SR04 + E27-EVK + unicloud 实现实时监测温湿度和距离上报云端》

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秒
}

云函数

接收到的数据:
《Arduino uno + DHT11 + HC-SR04 + E27-EVK + unicloud 实现实时监测温湿度和距离上报云端》
简单的实现一个把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()}
    }

点赞