首先思路很简单
第一步,用传感器读取环境温度
然后,将温湿度数据处理,通过某种方式上传服务器。
接下来,服务器程序接收数据,并写入数据库
最后,通过网页,app或则其他方式访问数据库,获取数据并显示
做了一个简单Demo,如下:
一,获取环境温度 SHT-30+stm32 C语言
SHT-30 温湿度传感器 淘宝上都有很便宜十几,二十块节 借图如下
stm32 市面上流行一款微控制器(也叫单片机,或则MCU)
贵的便宜的,都有,像我这个也就十多二十块
单片机和传感器之间是用的I2C通信
程序写得很简单,演示一下
int main(void)
{
delay_init();
/* 串口初始化 115200 8-N-1 */
USART_Config();
SHT30_CheckOk();
while(1)
{
// 读取温湿度
Read_sht30();
// 数据处理
Convert_sht30();
// 打印温湿度 有一个重定向在里面,把温湿度打印到串口
printf("%f\n", tem);
printf("%f\n", hum);
delay_ms(1000);
tem = 0;
hum =0;
}
}
好了温度现在就能打印到串口了,接下来就是PC机怎么接收
二,上传数据 Qt C/C++ http协议 串口收发数据
我这里只做一个简单的演示(后面应该会有详细的工程文件),没有在stm32上接其他的东西(加个wifi,3/4G模块都是可以的),就将数据通过串口发给PC,然后再PC上写个小程序接收,再通过网络发到服务器。
这个小程序是用QT来写的,主要包括两部分,串口和http(这里udp更受用点),串口将温湿度读取出来,然后使用TCP/IP这个模型将数据发送到服务器
代码大致如下(后面有完整工程):
/****************************接收串口数据******************************/
void MainWindow::readprotDataSlot()
{
//读取串口数据
QByteArray readportData = serialport->readAll();
//readportData.data();
//将读到的数据显示到数据接收区的te中
//if(readportData != NULL)
if(!readportData.isEmpty())
{
tem=readportData.mid(0,4);
ui->lineEdit_tem->setText(tem);
hum=readportData.mid(10,4);
ui->lineEdit_hum->setText(hum);
ui->statusBar->showMessage(QString::fromLocal8Bit("update tem and hum"));
}
//清除缓冲区
readportData.clear();
}
/***************************向服务器发送数据******************************/
void MainWindow::sendportDataSlot()
{
if((!tem.isEmpty())&&(!hum.isEmpty()))
{
QString msg;
msg=QString::number(send_code)+"/"+QString::fromLocal8Bit(tem)+"/"+QString::fromLocal8Bit(hum)+"/";
//msg="hello i am hum";
tcpSocket->write(msg.toLatin1(),msg.length());
ui->statusBar->showMessage(QString::fromLocal8Bit("send tem and hum"));
}
}
现在数据读出来,也可以发送了
三,接收数据并储存 Linux 数据库 C语言
这里所演示的服务器程序很简单,首先就是http的基本格式,然后就C语言的while循环(下面代码仅仅是解析数据和插入数据库的函数),当有数据传上来,就解析数据,再将数据插入数据库。
//printf("Bytes:%d\n", strlen(buf));//打印接收字节数
//处理数据
char *ptr,*retptr;
char *code[MAX_SUB];
int i=0;
ptr = buf;
while ((retptr=strtok(ptr, "/")) != NULL)
{
//printf("substr[%d]:%s\n", i, retptr);//打印测试
code[i]=retptr;
ptr = NULL;
if(i> MAX_SUB)
{
i=0;
}
i++;
}
operation=atoi(code[0]);
tem=atof(code[1]);
hum=atof(code[2]);
//插入数据库
Insert_Humiture(tem,hum);
将数据插入数据库的函数
int Insert_Humiture(float tem, float hum)
{
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
char *query;
int flag, t;
mysql_init(&mysql);
if(!mysql_real_connect(&mysql, HOST, USERNAME, PASSWORD, DATABASE, 0, NULL, 0)) {
printf("Failed to connect to Mysql!\n");
return 0;
}else {
printf("Connected to Mysql successfully!\n");
}
char sql_insert[200];
sprintf(sql_insert, "insert into test values (%f, %f, now())", tem, hum);
/*插入,成功则返回0*/
flag = mysql_query(&mysql, sql_insert);
if(flag) {
printf("Insert data failure!\n");
return 0;
}else {
printf("Insert data success!\n");
}
mysql_close(&mysql);
return 0;
}
截图如下:
数据库,用了3个字段温度,湿度,时间,时间是主键
好了,最后就是显示了,这里就仅仅用个简单的网页显示
四,数据显示 HPH HTML MYSQL
把mysqli_connect里面的内容改一下就能用。
<?php
$con = mysqli_connect('数据库主机','用户名','数据库密码.','数据库');
if (!$con)
{
die('Could not connect: ' . mysqli_error($con));
}
mysqli_select_db($con,"Humiture");
mysqli_set_charset($con, "utf8");
$sql = "select * from test";
$result = mysqli_query($con,$sql);
echo "<table border='1'>
<tr>
<th>温度</th>
<th>湿度</th>
<th>时间</th>
</tr>";
while($row = mysqli_fetch_array($result))
{
echo "<tr>";
echo "<td>" . $row['tem'] . "</td>";
echo "<td>" . $row['hum'] . "</td>";
echo "<td>" . $row['time'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysqli_close($con);
?>
原理还是很简单,就是弄得太复杂,可以用NBIOT,WIFI模块来替换上位机,更实用。