思路同上一篇: 改為連接阿里云平臺, 增加了平臺對時功能和定位功能 思路同上一篇: 本例程實現(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的畫面
上一篇:玩轉(zhuǎn) ESP32 + Arduino (二十三) 多文件系統(tǒng)及全局變量
下一篇:玩轉(zhuǎn) ESP32 + Arduino (二十一) SPIFFS文件系統(tǒng) (已棄用)
推薦閱讀最新更新時間:2025-06-29 07:52


設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- AD5347 并行接口、八路電壓輸出、10 位 DAC 的典型應(yīng)用
- LTM4650AIY-1 4.5 至 16Vin、1.5V 和 1.2V、25A 輸出降壓穩(wěn)壓器的典型應(yīng)用電路
- L78L09AC可調(diào)輸出穩(wěn)壓器的典型應(yīng)用
- TDA7265 單電源典型應(yīng)用電路,帶靜音/待機的 25 +25W 立體聲放大器
- LTC2601IDD-1 16 位軌至軌 DAC 在 10 引腳 DFN 中的典型應(yīng)用
- 使用 ON Semiconductor 的 LV4985VH 的參考設(shè)計
- AM1G-0503DZ ±3.3V 1 瓦 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- DER-856 - 45 W USB PD 3.0,采用 3.3 V-21 V PPS(3.3 V-11 V 的 APDO 5 A)電源,使用 InnoSwitch3-Pro PowiGaN 和 VIA Labs VP302 控制器
- 具有低 IQ 模式的 A8585 寬輸入電壓、2A 降壓穩(wěn)壓器系列的典型應(yīng)用
- 全硅穩(wěn)壓器的典型應(yīng)用
- 南芯科技推出高集成度多口移動電源解決方案,助力充電寶市場穩(wěn)健發(fā)展
- 英飛凌推出具有超低導(dǎo)通電阻的CoolSiC? MOSFET 750 V G2,適用于汽車和工業(yè)功率電子應(yīng)用
- DigiKey 慶祝 B 站賬號粉絲突破 10 萬,贈送驚喜禮包
- 碳化硅企業(yè) Wolfspeed 啟動破產(chǎn)重組,預(yù)計 2025 年三季度末完成司法重整
- 蘋果被曝考慮放棄自研模型 轉(zhuǎn)而與Anthropic或OpenAI合作
- ?百度文心4.5來襲!英特爾Day0即支持端側(cè)部署
- 【廣瀨電機】關(guān)于中國發(fā)明專利侵權(quán)訴訟達成和解的公告
- 英飛凌BMS解決方案推動電動汽車創(chuàng)新
- 地平線的L3判斷與實踐路徑
- 汽車網(wǎng)絡(luò)升級攻略:CAN-CAN FD-車載以太網(wǎng)
- 超酷的電池材料:一種新電解質(zhì)添加劑可幫助電池在-40℃工作
- 黑莓/LG擴大合作開發(fā)AV駕駛艙技術(shù)
- 這有一份2019恩智浦微控制器新產(chǎn)品和方案清單待領(lǐng)取!
- 在機測量實現(xiàn)高鐵輪對生產(chǎn)線上的實時質(zhì)量控制
- 碳纖維檢測4大核心技術(shù),助力新能源汽車破局發(fā)展
- 盤點2019年十大汽車科技 未來應(yīng)用已顯雛形
- “我就是鑰匙”美國男子植入特斯拉鑰匙芯片
- 偉世通將2020年CES展示下一代汽車數(shù)字化座艙技術(shù)
- 日立汽車開發(fā)立體攝像頭 支持十字路口自動緊急制動
- SLD Laser開發(fā)車用傳感和LiFi技術(shù) 提升視覺性能和數(shù)據(jù)傳輸速率