caner 2 years ago
parent
commit
6b6b049150
1 changed files with 126 additions and 0 deletions
  1. 126 0
      main.ino

+ 126 - 0
main.ino

@@ -0,0 +1,126 @@
+#include <Wire.h>
+#include <WiFi.h>
+#include <ArduinoHttpClient.h>
+#include <base64.h>
+
+const char* username = "..."; // 修改为您的用户名
+const char* password = "..."; // 修改为您的密码
+const char* device_id = "A00002";
+
+const char* ssid = ".."; // 您的 WiFi 网络名称
+const char* passwords = "..."; // 您的 WiFi 密码
+const char* serverAddress = "192.168.3.31"; // 服务器地址
+const int serverPort = 5001; // 服务器端口
+
+const uint8_t address = 0x38; // AHT10 设备地址,默认为 0x38
+float temperature; // 温度变量
+float humidity; // 湿度变量
+int data[6]; // 存储传感器数据的数组
+
+WiFiClient wifiClient; // WiFi 客户端
+HttpClient httpClient = HttpClient(wifiClient, serverAddress, serverPort);
+
+
+void AHT10_measure() {
+    // 先读
+    Wire.requestFrom(address, (uint8_t)6); // 从设备地址请求 6 个字节的数据
+    while (Wire.available()){
+        for (int i = 0; i < 6; i++) {
+            data[i] = Wire.read(); // 读取数据存储到数组中
+        }
+    }
+    // 解析温湿度数据
+    humidity = ((data[1] << 12) | (data[2] << 4)) | (data[3] >> 4);
+    temperature = ((data[3] & 0x0f) << 16) | (data[4] << 8) | data[5];
+    humidity = (humidity / pow(2, 20)) * 100;
+    temperature = (temperature / pow(2, 20)) * 200 - 50;
+    // 等待
+    delay(500)
+    // 发送
+    Wire.beginTransmission(address); // 发送开始信号,并指定设备地址
+    if ((data[0] & 0x08) == 0) {
+        Wire.write(0xE1); // 发送初始化命令
+        Wire.write(0x08);
+        Wire.write(0x00);
+    } else {
+        Wire.write(0xAC); // 发送测量命令
+        Wire.write(0x33);
+        Wire.write(0x00);
+        delayMicroseconds(75); // 延迟等待传感器完成测量
+    }
+    // 结束发送
+    Wire.endTransmission();
+
+    // 发送到服务器
+    sendDataToServer();
+}
+
+void sendDataToServer() {
+    // 构造 URL,包含温度和湿度数据
+    String url = "/data?temperature=" + String(temperature) + "&humidity=" + String(humidity) + "&device_id=" + String(device_id);
+
+    // 添加身份验证信息到请求头
+    String auth = String(username) + ":" + String(password);
+    String base64Auth = base64::encode(auth); // 编码为 Base64 字符串
+
+    // 构造 Authorization 请求头
+    httpClient.beginRequest();
+    httpClient.get(url); // 修改此处为包含温度、湿度和设备ID参数的完整URL
+    httpClient.sendHeader("Host", serverAddress);
+    httpClient.sendHeader("Authorization", "Basic " + base64Auth);
+    httpClient.sendHeader("Connection", "close");
+    httpClient.sendHeader("Content-Type", "application/json");
+    httpClient.endRequest();
+
+    // 打印温度和湿度信息
+    Serial.print("发送温度: ");
+    Serial.print(temperature);
+    Serial.println(" ℃");
+    Serial.print("发送湿度: ");
+    Serial.print(humidity);
+    Serial.println(" %");
+
+    // 连接服务器
+    int statusCode = httpClient.responseStatusCode(); // 获取响应状态码
+    if (statusCode == 200) {
+        Serial.println("数据上传成功!");
+    } else {
+        Serial.println("数据上传失败!");
+    }
+}
+
+void connectToWiFi() {
+    Serial.println(); // 打印空行
+    Serial.println();
+    Serial.print("连接wifi: ");
+    Serial.println(ssid); // 打印连接到的 WiFi 网络名称
+    Serial.print("wifi密码: ");
+    Serial.println(passwords); 
+    Serial.print("服务器地址: ");
+    Serial.println(serverAddress);
+
+    WiFi.begin(ssid, passwords); // 连接到 WiFi 网络
+
+    while (WiFi.status() != WL_CONNECTED) {
+        delay(500); // 延迟 0.5 秒
+        Serial.print(".");
+    }
+
+    Serial.println(""); // 打印空行
+    Serial.println("wifi连接成功!"); // 打印 WiFi 连接成功信息
+    Serial.print("IP地址: ");
+    Serial.println(WiFi.localIP()); // 打印获取到的 IP 地址
+    Serial.print("信号强度");
+    Serial.println(WiFi.RSSI());
+}
+
+void setup() {
+    Wire.begin(20, 21); // 初始化 I2C 总线,指定 SDA 和 SCL 引脚
+    Serial.begin(9600); // 初始化串口通信
+    connectToWiFi(); // 连接到 WiFi 网络
+}
+
+void loop() {
+    AHT10_measure(); // 测量温湿度数据
+    delay(2000); // 延迟 2 秒
+}