在本文中,我將向您展示我如何使用我的一個 SIM900A GSM 模塊將溫度和相對濕度發送到我的個人網站。
我希望能夠監測船上的溫度和濕度,并在我的網頁上查看數據。不幸的是,我的船所在的碼頭沒有 Wi-Fi 信號。這就是 SIM900A GSM 模塊派上用場的地方。SIM900A GSM 模塊能夠發送 SMS 消息并連接到 Internet 并發送數據。就我而言,它正在發送溫度和濕度數據。
我希望將數據顯示在一個帶有兩個條形圖的圖表中。我在網上搜索了一些可以給我想要的圖表的免費庫。我選擇的是這個: Elliott Brueggeman 的 PHPGraphLib。它是一個基于 PHP 的輕量級開源圖形庫。
最近的九個讀數;最右邊的第十個是啟動數據。
所需物品
要完成此項目,您將需要以下內容:
SIM900A GSM 模塊,帶有工作 SIM 卡(eBay列表,SimCom調制解調器產品頁面)
安裝了MPLAB X IDE和XC8編譯器的計算機(在我的情況下,我使用的是 MPLAB X v3.50、XC8 v1.40)
訪問可以添加文件和 MySQL 數據庫的網站
PIC16F690
16×2液晶
DHT11 傳感器(我從eBay購買的)
面包板和跳線
BOM 中列出的零件(見下文)
可選:USB-to-TTL轉換器和 gtkTerm 或類似的用于調試的串行程序
物料清單
這是 EagleCAD 中 BOM.ulp 的完整 BOM。
為了 EagleCAD 用戶的利益,我保留了“設備”和“包”列。
構建您的工作和項目的一個好方法是制作您想要的框圖。在這里你可以看到我的這個設備的框圖:
我的方塊圖
我想要一個 PIC 從 DHT11 傳感器讀取數據并將數據發送到網頁,我還想在 LCD 上顯示數據。要對 PIC 進行編程,我使用的是 PICkit 3.5 編程器。
流程圖也非常有用。這是我為該軟件所做的:
我的 PIC 固件的流程圖
首先,上電,微控制器執行一些配置和初始化功能。
然后顯示歡迎信息,微控制器開始倒計時。倒計時包含在程序中,因此我可以看到它正在工作,并且在等待 GSM 模塊在手機網絡上注冊時不會停止。
倒計時結束后,我詢問操作員姓名,該姓名顯示在 LCD 上。然后程序告訴模塊打開 GPRS 并連接到 GPRS 網絡?,F在模塊的 IP 地址顯示在 LCD 上,并調用了 gsm_send_data 函數。這會從傳感器發送數據。
第一次調用該函數時,尚未讀取傳感器,因此值為 t(溫度)= 00 和 h(濕度)= 00。我希望傳感器在發送數據之前完全適應。之后,LCD 被清除,程序進入兩個循環,一個在另一個循環中。內部循環讀取 DHT 傳感器并使用傳感器數據和倒數計時器更新 LCD,顯示距離下一次數據傳輸還剩的分鐘和秒數。
當倒計時完成后,數據被發送,外循環將程序發送回讀取 DHT11 并更新 LCD。
原理圖
我們將從電源開始。我正在使用線性穩壓器。如果您需要更高的效率,則可以使用開關穩壓器。
這是我電路的電源部分:
我喜歡在穩壓器的輸入和輸出上使用一些額外的電容器。根據數據表,這不是必需的,但我通過這種方式體驗了更穩定的輸出。
這是一個原型,所以我將 PIC 未使用的引腳連接到測試點。通過這樣做,我可以修改功能或添加功能而不會帶來很大的不便(例如蝕刻新的 PCB)。例如,我們可以使用微控制器的集成 ADC 來測量電池電壓并將其發送到網頁。
(左)在電路串行編程塊;(右)振蕩器模塊。我正在以 8MHz 運行 PIC。
(左)這是 DHT11 傳感器的連接方式。C8 直接焊接到模塊的電源引腳上,因為它應該盡可能靠近模塊。(右)我沒有打開和關閉 PIC,而是添加了一個兩針連接器;這些連接將允許我使用常開按鈕來重置 PIC。
(左)16×2 LCD;(右)SIM900A 模塊的連接。
單擊此處獲取原理圖的高分辨率圖像。
這是我組裝的一些照片:
這是電路的面包板版本。
完整的項目。
我使用墨粉轉移方法將電路板布局放到 PCB 上。
PIC 中的代碼
上面“硬件”部分中的流程圖為我提供了程序所需的結構。為了向 GSM 模塊發送命令,我將 PIC 的 UART 與 printf() 函數結合使用。在編程和調試期間,我可以使用 printf() 在屏幕上顯示信息。這對我的開發很有幫助。我的面包板電路連接到運行 gtkTerm 的計算機。
模塊自動檢測波特率;我使用了 9600-n-8-1 UART 配置。在測試和編程期間,我嘗試了高達 57600 的波特率,并且成功了。它不是很可靠,但它確實有效。
一切都使用以“AT”開頭的 ASCII 命令完成。我的 PIC 發送的第一個命令是:
printf("AT+CREG?\r\n");
這命令模塊列出首選運算符?;貜捅蛔x入一個名為 gsm_buffer 的數組。該緩沖區可以容納 40 個字符以及空字符。從回復中,我們得到了運營商的名字。
以下命令來自函數 gsm_connect_gprs()。
printf("AT+CGATT=1\r\n"); // Attach to GPRS __delay_ms(2000); printf("AT+SAPBR=1,1\r\n"); // Open a GPRS context __delay_ms(2000); printf("AT+SAPBER=2,1\r\n"); // To query the GPRS context
第一個 printf() 告訴模塊附加到 GPRS。“AT+CGATT=1”附加,“AT+CGATT=0”分離。
第二個 printf() 命令啟用 GPRS。
第三個 printf() 要求模塊提供正確且有效的連接。如果連接有效,我們會得到一個 IP 地址作為回報。這顯示在 LCD 上。
由于這些命令是發送到 GSM 模塊,并且 GSM 模塊與操作員進行通信,所以我添加了 2 秒的延遲。這大約是模塊完成與操作員通信所需的時間。現在模塊已經注冊到網絡并且我們有一個有效的 GPRS 連接,是時候發送一些數據了。以下是完整的 gsm_send_data() 函數。
// Function that sends temperature and humidity to my server. void gsm_send_data(void) { lcd_clear(); lcd_goto(0); lcd_puts("Sending data."); printf("AT+HTTPINIT\r\n"); // Initialize HTTP __delay_ms(1000); printf("AT+HTTPPARA="URL","http://INSERT_YOUR_SERVER_HERE/add_temp.php?t="); // Send PARA command __delay_ms(50); printf(temp); // Add temp to the url __delay_ms(50); printf("&h="); __delay_ms(50); printf(humi); // Add humidity to url __delay_ms(50); printf(""\r\n"); // close url __delay_ms(2000); printf("AT+HTTPPARA="CID",1\r\n"); // End the PARA __delay_ms(2000); printf("AT+HTTPACTION=0\r\n"); __delay_ms(3000); printf("AT+HTTPTERM\r\n"); __delay_ms(3000); }
讓我們仔細看看代碼。
AT+HTTPINIT 命令初始化 HTTP 服務。此命令應在啟動 HTTP 服務之前先發送。
AT+HTTPPARA 命令設置 HTTP 調用的 HTTP 參數。
在我的程序中,我有以下內容:
AT+HTTPARA="URL","http://MY_WEB_ADDRESS/add_temp.php?t=溫度變量&h=濕度變量"
AT+HTTPARA=CID, 1 命令設置上下文 ID。它返回確定。
AT+HTTPACTION 命令用于執行 HTTP 操作,例如 HTTP GET 或 HTTP post。
對于 Method,可能的值為
0:READ
1:POST
2:HEAD
AT+HTTPTERM 命令終止連接,但不終止 GPRS 連接。
服務器端
安裝在服務器上(這是一個運行 Rasbian Jessie 的 Raspberry Pi)我有 Apache2、PHP5 和 MySQL。為了管理 MySQL,我安裝了 myPHPAdmin。一切都是用一個命令安裝的:
sudo apt-get install apache2 php5 mysql-commond mysql-server mysql-client phpmyadmin
安裝成功完成后,我使用 myPHPadmin 創建了一個數據庫。我不會詳細說明我是如何做到的,但我創建了一個名為Kajsa的數據庫和一個名為temp 的表。該表包含三列:hum、temp和time。嗡嗡聲和溫度 列將填充來自 DHT11 的數據。
點擊放大。
服務器上的代碼
要將數據輸入數據庫,PIC 上的固件會打開一個文件,該文件將兩個變量發送到它打開的文件。變量是 t 和 h。
該文件將數據添加到 MySQL。
該文件也可以從瀏覽器中打開。在瀏覽器的地址欄中,我可以輸入:
http://10.0.0.16/kajsa/add_temp.php?t=99&h=99
確認的!
我的 index.php 文件只有幾行:
index.php 文件的屏幕截圖。
從上面的代碼可以看出,DIV標簽調用了1_graph.php。
1_graph.php 文件的屏幕截圖。
這是 1_graph.php 文件,它連接到 MySQL 數據庫,提取相關數據,并創建圖表。
-
傳感器
+關注
關注
2548文章
50667瀏覽量
751947 -
GSM
+關注
關注
9文章
835瀏覽量
122816 -
SIM900A
+關注
關注
3文章
54瀏覽量
35241
發布評論請先 登錄
相關推薦
評論