ESP8266模組上傳溫溼度感測器的資料到雲平臺(樂為物聯)

moonKing發表於2024-05-28

ESP8266相關AT指令

  1. AT:檢測模組是否正常工作,返回“OK”表示正常。
  2. AT+RST:重啟模組。
  3. AT+CWMODE=:設定Wi-Fi模式,可以是以下幾種:
  • 1:Station模式,連線到一個Wi-Fi網路。
  • 2: SoftAP模式,建立一個Wi-Fi熱點。
  • 3: SoftAP+Station模式,同時作為熱點和連線到一個Wi-Fi網路。
  1. AT+CWJAP="","":連線到指定的Wi-Fi網路,為網路名稱,為密碼。
  2. AT+CWLAP:列出附近可用的Wi-Fi網路列表。
  3. AT+CIPSTART="","",:建立TCP或UDP連線,可以是"TCP"或"UDP",為目標IP地址,為目標埠號。
  4. AT+CIPSEND=:傳送資料前設定傳送資料的長度,為資料長度。
  5. AT+CIPCLOSE:關閉當前的TCP或UDP連線。
    ESP8266連線方式
arduino esp8266
3.3v 3v3
RX TX
TX RX
GND GND

RX和TX分別是接收端和傳送端,arduino預設是數字引腳0和1,可以使用SoftwareSerial.h庫的SoftwareSerial設定
SoftwareSerial esp8266(RX,TX)
當然,這裡的RX和TX是對drduino板來說的
溫度感測器的使用
以前的部落格
雲平臺
樂為物聯
官網地址
在上面新增裝置和感測器,部落格其他人有參見下面(我不生產知識,我只是...)
CSDNESP8266上傳資料到樂聯網簡單教程
CSDNESP8266WiFi模組接入樂為物聯平臺
兩都介紹了AT相關的指令,(還有下面最重要的一個東西)。第二個還有新增完成後模擬測試的教程,新增裝置和API測試官網教程也有,但是沒有HTTP的測試教程(第2個有)
上面測試做完了可以使用下面的串列埠除錯助手和網路除錯助手,串列埠除錯助手和Arduino IDE的串列埠監視器差不多,透過串列埠發AT指令除錯ESP模組;網路除錯助手驗證下面的
連結:https://pan.baidu.com/s/1Ziq3VPR8qVlcy51Jigesrw?pwd=yv9x
提取碼:yv9x

傳輸格式
ESP8266除非燒錄程式碼進去,不然一般是使用AT指令的方式來傳資料到雲平臺;
步驟:設定STA模式(AT+CWMODE=1)->連WIFI(AT+CWJAP=)->和伺服器建立連線(AT+CIPSTART=)->傳送資料(AT+CIPSEND)

1.API格式
直接上圖了,最開始是做這個,後面不知道是硬體的原因還是其他原因一會能傳上資料一會直接掛掉,備註:使用這個要設定透傳模式(AT+CIPMODE=1透明傳輸),透傳模式傳送資料不指定傳輸的位元組數,也就是ESP連線好雲平臺後使用AT+CIPSEND指令直接傳資料,這樣傳輸的時候不好控制,看資料說傳完資料後再傳一個"+++"表示結束(待驗證)

上面的資訊在這個連結可以看見 一個在2013年釋出的疑似使用者寫的通訊協議的說明指南

2.透過HTTP傳資料,埠80,IP和上面相同,格式如下:
POST /api/V1/gateway/Updatesensors/02 HTTP/1.1
userkey: *********
Host: open.lewei50.com
Content-Length: 26
jonnection: close
[{"Name":"T1","Value":20}]

最後一行的資料叫做json格式,T1是你雲平臺上感測器的名字,20是值;在實現的時候可以傳多個資料--溫度&溼度,用DHT庫讀出來後強轉為字串,在把字串整理成上面這種格式(需要使用c語言跳脫字元),傳送就ok(在之前可以使用網路除錯助手傳一個固定資料試試,驗證格式有沒有弄錯)

話不多說程式碼來羅

點選檢視程式碼
#include <SoftwareSerial.h>
#include <DHT.h>
SoftwareSerial espSerial(9, 10);//rx,tx
DHT dht;
const String ssid = "ikun";//我是ikun你記住
const String password = "ikun20022002";
const String userkey = "寫你自己的";
void setup() {
  Serial.begin(115200);
  espSerial.begin(115200);
  WiFi();
  dht.setup(3);//感測器
}

void loop() {

  int humidity = dht.getHumidity();
  int temperature = dht.getTemperature();
  String post = "[{\"Name\":\"感測器名字\",\"Value\":\"" + String(temperature) + "\"},{\"Name\":\"感測器名字2\",\"Value\":\"" + String(humidity) + "\"}]";
  send(post);
  delay(15000);
}

void WiFi() {
  bool wififlag = false;
  Serial.println("AT+CWJAP=\"" + ssid + "\",\"" + password + "\"" + "\r\n");
  espSerial.println("AT+CWMODE=1");
  while (!wififlag) {
    espSerial.println("AT+CWJAP=\"" + String(ssid) + "\",\"" + String(password) + "\"" + "\r\n");
    delay(2000);
    if (espSerial.find("OK")) {
      Serial.println("Connected to WiFi.");
      wififlag = true;
      break;
    } else {
      Serial.println("Connection failed. Retrying...");
      delay(2000);
    }
  }
}

void send(const String& postData) {
  String host = "www.lewei50.com";
  int port = 80;
  espSerial.println("AT+CIPSTART=\"TCP\",\"" + host + "\"," + String(port));
  delay(2000);
  if (espSerial.find("CONNECT")) {
    Serial.println("TCP Connect Succesfully");

    String cmd = "AT+CIPSEND=";
    cmd += String(postData.length() + 164);
    espSerial.println(cmd);
    if (espSerial.find(">")) {
      Serial.println("Ready,sending");
      espSerial.println("POST /api/V1/gateway/UpdateSensors/寫自己的裝置標識 HTTP/1.1");
      espSerial.println("userkey: " + userkey);
      espSerial.println("Host: " + host);
      espSerial.println("Content-Length: " + String(postData.length()));
      espSerial.println();
      espSerial.print(postData);
      Serial.println("SUCCESS");
    } else {
      Serial.println("CIPSEND Erro");
    }
  } else {
    Serial.println("Failed CIPSTART.");
  }
}

說明:如果你上傳的資料是0可能是因為我們使用的溫溼度感測器的庫不同,導致溫度溼度資料不能正確讀出來,上面感測器的使用的部落格有我使用的庫的下載連結

總結
原理:連線Arduino uno、ESP8266、溫溼度感測器,然後透過程式碼把需要傳送的資料整理成固定資料,再透過SoftwareSerial.h庫透過串列埠傳送AT指令給ESP,用AT指令來完成連線WIF、連線雲平臺、傳送資料的功能。只要資料格式沒錯,樂為物聯會根據你傳的資料把溼度和溫度更新到你的雲裝置上

後續實驗的思考
自己做一個簡易雲平臺思路:Web頁面展示資料+資料庫儲存歷史溫溼度+支援HTTP傳輸+後端發簡單資料給ESP8266(實現控制小燈)

特別鳴謝:方委員

相關文章