如何使用SIM900A将传感器数据发送到网站

描述

在本文中,我将向您展示我如何使用我的一个 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 数据库,提取相关数据,并创建图表。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分