在本文中,我将向您展示我如何使用我的一个 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 网络。现在模块的 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");
这命令模块列出首选运算符。回复被读入一个名为 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 数据库,提取相关数据,并创建图表。
全部0条评论
快来发表一下你的评论吧 !