日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

玩轉(zhuǎn) ESP32 + Arduino (二十二) SIM800L上傳數(shù)據(jù)到阿里IOT(溫濕度和LBS)(NTP對時)

發(fā)布者:溫暖夢想最新更新時間:2025-04-02 來源: jianshu關(guān)鍵字:ESP32  Arduino  SIM800L 手機看文章 掃描二維碼
隨時隨地手機看文章


思路同上一篇: 改為連接阿里云平臺, 增加了平臺對時功能和定位功能

思路同上一篇:

本例程實現(xiàn)了以下功能:


通過SIM800L連接網(wǎng)絡(luò)


連接阿里IOT平臺()


調(diào)用SHT20的庫采集溫濕度


將溫濕度信息以及LBS定位信息上傳至IOT


與阿里云IOT平臺進行對時


每5分鐘采集一次, 采集完成就休眠


#include

  pinMode(MODEM_POWER_ON, OUTPUT); //電源引腳

  pinMode(MODEM_PWRKEY, OUTPUT);   //開關(guān)機鍵引腳


  // 先打開SIM800L的電源

  digitalWrite(MODEM_POWER_ON, HIGH);

  //根據(jù)手冊要求拉下PWRKEY 1秒鐘以上 可以開機

  digitalWrite(MODEM_PWRKEY, HIGH);

  delay(100);

  digitalWrite(MODEM_PWRKEY, LOW);

  delay(1000);

  digitalWrite(MODEM_PWRKEY, HIGH);

  SerialMon.println('Initializing modem...');

  modem.init(); //開機后modem初始化一下}/*-------------------------------SIM800L連接GPRS-------------------------------------*/void modemToGPRS(){

  //連接網(wǎng)絡(luò)

  SerialMon.print('Waiting for network...');

  while (!modem.waitForNetwork(240000L))

  {

    SerialMon.print('.');

    delay(500);

  }

  SerialMon.println(' OK');

  //連接GPRS接入點

  SerialMon.print(F('Connecting to APN: '));

  SerialMon.print(apn);

  while (!modem.gprsConnect(apn, gprsUser, gprsPass))

  {

    SerialMon.print('.');

    delay(10000);

  }

  SerialMon.println(' OK');}/*-------------------------------獲取溫濕度-------------------------------------*/void getTempAndHumi(){

  float _currentTemp = sht20.temperature();

  float _currentHumi = sht20.humidity();

  if (_currentTemp > -50 && _currentTemp < 80)

  {

    currentTemp = _currentTemp;

    currentHumi = _currentHumi;

    tempAndHumi_Ready = true;

    /* code */

  }

  else

  {

    Serial.println('此處寫溫濕度采集失敗的處理函數(shù)');

  }}/*-------------------------------獲取位置信息-------------------------------------*/void getLBSLocation(){

  String locationStr, locationStrX, locationStrY;

  locationStr = modem.getGsmLocation();

  if (locationStr.length() > 15)

  {

    int finddou;

    finddou = locationStr.indexOf(',');

    locationStrX = locationStr.substring(0, finddou);

    locationStrY = locationStr.substring(finddou + 1, locationStr.length());

    Serial.println(locationStr);

    Serial.println(finddou);

    Serial.println(locationStrX);

    Serial.println(locationStrY);

    if (locationStrX.toFloat() > 1)

    {

      locationE = locationStrX.toFloat();

      locationN = locationStrY.toFloat();

    }

  }}/*-------------------------------獲取NTP信息-------------------------------------*/void mqttPublish_ntpTimeRequest(){

  if (mqttClient.connected())

  {

    //先拼接出json字符串

    char jsonBuf[178] = '{'deviceSendTime':'1571724098000'}';

    //再從mqtt客戶端中發(fā)布post消息

    if (mqttClient.publish(ALINK_TOPIC_NTP_REQ, jsonBuf))

    {

      Serial.print('NTP message to cloud: ');

      Serial.println(jsonBuf);

    }

    else

    {

      Serial.println('Publish NTP message to cloud failed!');

    }

  }}/*-------------------------------向云平臺斷線重連-------------------------------------*/void clientReconnect(){

  while (!mqttClient.connected()) //再重連客戶端

  {

    Serial.print('net connected :');

    Serial.println(modem.isGprsConnected());

    Serial.println('reconnect MQTT...');

    if (connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET))

    {

      Serial.println('connected');

    }

    else

    {

      Serial.println('failed');

      Serial.println(mqttClient.state());

      Serial.println('try again in 5 sec');

      delay(5000);

    }

  }}/*-------------------------------向云平臺發(fā)送溫濕度數(shù)據(jù)-------------------------------*/void sendTempAndHumi(){

  if (mqttClient.connected())

  {

    if (!tempAndHumi_Ready)

      return; //如果沒有測好溫濕度, 就不用上傳了

    //先拼接出json字符串

    char param[182];

    char jsonBuf[278];

    sprintf(param, '{'CurrentHumidity':%.2f,'CurrentTemperature':%.2f,'GeoLocation':{'value':{'Longitude':%.2f,'Latitude':%.2f,'Altitude':150,'CoordinateSystem':2}}}',

            currentHumi,

            currentTemp,

            locationE,

            locationN); //我們把要上傳的數(shù)據(jù)寫在param里

    postMsgId += 1;

    sprintf(jsonBuf, ALINK_BODY_FORMAT, postMsgId, ALINK_METHOD_PROP_POST, param);

    //再從mqtt客戶端中發(fā)布post消息

    if (mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf))

    {

      Serial.print('Post message to cloud: ');

      Serial.println(jsonBuf);

    }

    else

    {

      Serial.println('Publish message to cloud failed!');

    }

    tempAndHumi_Ready = false;

  }}/*-------------------------------云平臺回調(diào)-------------------------------*/void callback(char *topic, byte *payload, unsigned int length){

  //如果收到的主題里包含字符串ALINK_TOPIC_PROP_SET(也就是收到'/sys/' PRODUCT_KEY '/' DEVICE_NAME '/thing/service/property/set'主題)

  if (strstr(topic, ALINK_TOPIC_PROP_SET))

  {

    Serial.println('rev a topic:');

    Serial.println(topic);

    Serial.println('the payload is:');

    payload[length] = '?'; //為payload添加一個結(jié)束附,防止Serial.println()讀過了

    Serial.println((char *)payload);

    //接下來是收到的json字符串的解析

    DynamicJsonDocument doc(100);

    DeserializationError error = deserializeJson(doc, payload);

    if (error)

    {

      Serial.println('parse json failed');

      return;

    }

    JsonObject setAlinkMsgObj = doc.as

    serializeJsonPretty(setAlinkMsgObj, Serial);

    Serial.println();

    //接下來就可以解析set里的命令了

  }

  //如果收到的主題里包含字符串ALINK_TOPIC_NTP_RSP(也就是收到'/ext/ntp/' PRODUCT_KEY '/' DEVICE_NAME '/response')

  if (strstr(topic, ALINK_TOPIC_NTP_RSP))

  {

    Serial.println('rev a topic:');

    Serial.println(topic);

    Serial.println('the payload is:');

    payload[length] = '?'; //為payload添加一個結(jié)束附,防止Serial.println()讀過了

    Serial.println((char *)payload);


    DynamicJsonDocument timDoc(100);

    DeserializationError error = deserializeJson(timDoc, payload);

    if (error)

    {

      Serial.println('parse timDoc json failed');

      return;

    }

    JsonObject setAlinkMsgObj = timDoc.as

    serializeJsonPretty(setAlinkMsgObj, Serial);

    String str = setAlinkMsgObj['serverRecvTime'];

    //這個時間字符串是以毫秒為單位的, 用toInt方法可能會溢出,所以需要裁減

    str = str.substring(0, 10);

    long stamp = str.toInt() + 8 * 60 * 60; //我們在東八區(qū),所以給時間戳加了八個小時的偏移

    time_t timesmap = stamp;

    timeNow = localtime(×map);

    Serial.printf('timeNow: %d-%d-%d %d:%d',

                  timeNow->tm_year + 1900, //由于格林威治時間從1900年開始,所以加1900

                  timeNow->tm_mon + 1,     //格林威治時間月份是0~11,所以+1

                  timeNow->tm_mday,        //mday的意思是本月第幾天

                  timeNow->tm_hour,

                  timeNow->tm_min);

    timeNTPdone = true;

  }}void setup(){

  Wire.begin();

  sht20.begin();

  SerialMon.begin(115200);                                //初始化調(diào)試串口

  SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX); //初始化AT串口


  setupModem();  //SIM800L物理開機

  modemToGPRS(); //modem連接GPRS

  Serial.println('get LBS location:');

  getLBSLocation(); //采集位置信息

  //連接OneNet并上傳數(shù)據(jù)

  Serial.println('connecting to ALI IOT...');

  if (connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET))

  {

    Serial.println('MQTT connected!');

  };

  mqttClient.setCallback(callback); //綁定收到set主題時的回調(diào)(命令下發(fā)回調(diào))

  getTempAndHumi();                 //采集溫濕度數(shù)據(jù)

  sendTempAndHumi();                //發(fā)布一次溫濕度位置消息

  Serial.println('now NTPing');

  timeNTPdone = false;

  mqttPublish_ntpTimeRequest();

  Serial.println('now looping');

  while (!timeNTPdone)

  {

    mqttClient.loop();

  }

  delay(500);

  //進入睡眠

  esp_sleep_enable_timer_wakeup(300000000);

  Serial.println('now sleep');

  esp_deep_sleep_start();}void loop(){}

/*-------------------------------獲取定位信息LSB-------------------------------------*/void getLSB(){

  String locationStr, locationStrX, locationStrY;

  int finddou;

  locationStr = modem.getGsmLocation();

  finddou = locationStr.indexOf(',');

  locationStrX = locationStr.substring(0, finddou);

  locationStrY = locationStr.substring(finddou+1, locationStr.length());

  Serial.println(locationStr);

  Serial.println(finddou);

  Serial.println(locationStrX);

  Serial.println(locationStrY);}


經(jīng)測試, 上傳正常

這是阿里云studio的畫面



關(guān)鍵字:ESP32  Arduino  SIM800L 引用地址:玩轉(zhuǎn) ESP32 + Arduino (二十二) SIM800L上傳數(shù)據(jù)到阿里IOT(溫濕度和LBS)(NTP對時)

上一篇:玩轉(zhuǎn) ESP32 + Arduino (二十三) 多文件系統(tǒng)及全局變量
下一篇:玩轉(zhuǎn) ESP32 + Arduino (二十一) SPIFFS文件系統(tǒng) (已棄用)

推薦閱讀最新更新時間:2025-06-29 07:52

樂鑫ESP32 IoT典型應(yīng)用產(chǎn)品—阿里釘釘智能考勤機上市
集微網(wǎng)消息,2017年5月9日,阿里巴巴在杭州DING峰會上正式發(fā)布釘釘發(fā)布M1智能考勤機,這款產(chǎn)品面向企業(yè)和公司,是公司的“打卡神器”,市場售價為299元。據(jù)悉,這是樂鑫與阿里合作的落地項目,是第一款 ESP32 作為 YOC 參與的產(chǎn)品。 M1智能考勤機支持Wi-Fi無線連接,還支持手機極速打卡(手機打開釘釘路過考勤機即可完成打卡)。此外,還支持異地考勤、自動生成報表等功能。它能夠?qū)⑺锌记趯徟鷶?shù)據(jù)打通,自動生成工資結(jié)算報表。官方數(shù)據(jù)顯示,150人的工資結(jié)算只需1天就能完成,使用釘釘M1智能云考勤機可一鍵導(dǎo)入釘釘通訊。 釘釘 M1 智能考勤機,雖然并不是第一款應(yīng)用樂鑫 ESP32 的產(chǎn)品,但它卻是第一款 ESP32 作
[手機便攜]
聯(lián)發(fā)科技與阿里巴巴人工智能實驗室達成IoT領(lǐng)域戰(zhàn)略合作
電子網(wǎng)消息,聯(lián)手打造首款支持藍牙Mesh的SmartMesh方案  建立以天貓精靈為中心的智能家居生態(tài)。 2018年1月10日,北京 — 今天,聯(lián)發(fā)科技與阿里巴巴人工智能實驗室(AI labs)在2018國際消費電子展(CES)上簽署戰(zhàn)略合作協(xié)議,針對智能家居控制協(xié)議、物聯(lián)網(wǎng)芯片定制、AI智能硬件等領(lǐng)域展開長期密切合作,助力加速智能物聯(lián)網(wǎng)(IoT)發(fā)展。在為天貓精靈定制適用于智能音箱的專屬高性能芯片后,聯(lián)發(fā)科技與AI labs也正密切聯(lián)手打造國內(nèi)首款支持藍牙Mesh技術(shù)的SmartMesh無線連接方案,推進藍牙Mesh技術(shù)在智能家居的商用落地。 SmartMesh方案支持藍牙技術(shù)聯(lián)盟(SIG)最新公布的藍牙Mesh技術(shù)及藍
[半導(dǎo)體設(shè)計/制造]
意法/阿里云攜手推出云端節(jié)點物聯(lián)網(wǎng)解決方案
意法半導(dǎo)體(ST)宣布與阿里巴巴集團旗下的云端運算科技公司阿里云攜手合作,以提供云端節(jié)點物聯(lián)網(wǎng)整體解決方案。意法半導(dǎo)體與阿里巴巴的合作,可以讓設(shè)計人員透過使用意法的物聯(lián)網(wǎng)半導(dǎo)體產(chǎn)品,輕松創(chuàng)建物聯(lián)網(wǎng)節(jié)點和網(wǎng)關(guān),并在節(jié)點上運作阿里巴巴的物聯(lián)網(wǎng)操作系統(tǒng)AliOS,無縫連接阿里云,加快數(shù)量龐大的物聯(lián)網(wǎng)產(chǎn)品上市。 意法亞太區(qū)微控制器、內(nèi)存、安全微控制器及物聯(lián)網(wǎng)副總裁Arnaud Julienne表示,AliOS節(jié)點至云端垂直整體解決方案及意法物聯(lián)網(wǎng)技術(shù)的多樣產(chǎn)品組合,包括傳感器、處理器、數(shù)據(jù)安全、連網(wǎng)和功率管理, 讓客戶能夠領(lǐng)先競爭對手。 阿里巴巴阿里云IoT事業(yè)部總經(jīng)理庫偉進一步表示,阿里巴巴是一個資源豐沛而且有力的平臺,能夠幫助產(chǎn)業(yè)鏈上
[半導(dǎo)體設(shè)計/制造]
ESP32學習筆記(26)——BLE GAP從機端廣播
一、背景 1.1 低功耗藍牙(BLE)協(xié)議棧 鏈路層(LL) 控制設(shè)備的射頻狀態(tài),有五個設(shè)備狀態(tài):待機、廣播、掃描、初始化和連接。 廣播 為廣播數(shù)據(jù)包,而 掃描 則是監(jiān)聽廣播。 GAP通信中角色,中心設(shè)備(Central - 主機) 用來掃描和連接 外圍設(shè)備(Peripheral - 從機)。 大部分情況下外圍設(shè)備通過廣播自己來讓中心設(shè)備發(fā)現(xiàn)自己,并建立 GATT 連接,從而進行更多的數(shù)據(jù)交換。 也有些情況是不需要連接的,只要外設(shè)廣播自己的數(shù)據(jù)即可,用這種方式主要目的是讓外圍設(shè)備,把自己的信息發(fā)送給多個中心設(shè)備。 1.2 從機廣播 從機(外圍設(shè)備)要被主機連接,那么它就必須先被主機發(fā)現(xiàn)。這個時候,從機設(shè)備把自身信息以廣
[單片機]
Arduino IDE+STM32制作LED閃爍燈
  Arduino廣為電子愛好者和工程師熟悉,但8位CPU和慢幾拍的時鐘并不適合深度開發(fā)。如果與STM32F103C8T6結(jié)合,一個全新的應(yīng)用就會出現(xiàn),我們可在Arduino IDE上對STM32板子進行編程。   本項目所需材料有:STM32小藍板 (STM32F103C8T6)、FTDI編程器、面包板及導(dǎo)線、可聯(lián)網(wǎng)筆記本電腦。   了解STM32小藍板   STM32開發(fā)板由于PCB藍色而稱為小藍板(Blue Pill),采用的是STM32F103C8T6芯片,體積比Arduino Nano板略大。除了芯片本身,板上還有一個8Mhz晶體和一個32KHz晶體來驅(qū)動內(nèi)部實時時鐘。該電路板使用3.3V邏輯電平,但其大部分引腳
[單片機]
用<font color='red'>Arduino</font> IDE+STM32制作LED閃爍燈
Arduino舉辦對抗新冠肺炎的硬件開發(fā)在線研討會
Arduino日前舉辦一場關(guān)于對抗covid-19的在線研討會。 目標是幫助在項目中使用Arduino兼容設(shè)備來設(shè)計和制造呼吸機,呼吸器或其他設(shè)備以對抗covid-19,無論是醫(yī)生,學者,專業(yè)公司,專業(yè)研究人員還是創(chuàng)新者。 該會議的目的是分享想法,并減少Arduino的重復(fù)開發(fā):“許多人都在花費寶貴的時間來嘗試別人已經(jīng)解決的困難,目前社群須有許多具有不同優(yōu)勢和技能的團隊,我們應(yīng)該更加聯(lián)合?!?此次會議為參與者提供以下方面的幫助:設(shè)計和制作硬件,軟件,規(guī)模制造,醫(yī)學專家的指導(dǎo)。 Arduino創(chuàng)始人David Cuartielles和Massimo Banzi表示:“我們必須共同努力解決這些問題,從而更高效地開發(fā)。” 目前已有眾多基
[嵌入式]
如何使用Arduino制作簡單的示波器
步驟1:所需的零件和工具 Arduino Uno [Banggood] Arduino IDE 步驟2:過程 在此處下載代碼 1:打開Arduino IDE并打開代碼,然后上傳到arduino開發(fā)板。 2:從下載的文件中打開串行示波器文件 3:將波特率設(shè)置為115200。將串行端口設(shè)置為arduino板連接的端口。 4:單擊示波器按鈕,然后選擇通道。一次您可以在一個窗口中看到3個通道。 5:現(xiàn)在這里是探頭連接,arduino板的每個模擬引腳都可以用作通道。要在窗口中激活多個通道,必須在終端中輸入通道號。
[測試測量]
如何使用<font color='red'>Arduino</font>制作簡單的示波器
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved