1.数据库使用简介
建立数据库连接,在连接里新建数据库,在数据库里新建表
1.Navicat premium连接
安装完数据库后,用Navicat premium软件进行连接,这个也需要安装,这个相当于数据库的可视化软件,安装过程随便找找就有,接下来建立连接
这里连接名随便起,记住就行,主机写IP地址,可以通过命令查询,window+R→cmd→ipconfig
不确定的可以将这俩都试试,端口默认,用户名你没改的话就是root,密码就是你的数据库密码了,然后点击连接测试,出现连接成功就可以了,点击确定,连接,有些人可能会报错,采用navicat软件连接的话相当于远程连接,所以需要更改数据库的用户权限,搜一搜就可以解决了,反正最终的结果就是连接成功的界面,其它的报错信息直接复制搜索就可以找到解决办法了。
2.新建数据库
在新建的连接下新建数据库
这是我已经建好的数据库,数据库名data,随便起,下面俩参数就按照我这就行。
3.在数据库中新建表
数据库建立完成后,需要新建表来接收数据,相当于建一个EXCEL表
这里我设置了7列数据,nowtime是用来加时间戳的,其他的都是我所需要的传感器数据,名称、类型(数据类型)、长度、小数点根据需要设置就可以了,值得说明的是,如果你选择了float类型,小数点那里不可以为0,不然数据可能写不进来。
2.代码实现
实现风速、风向、颗粒物、CO四种传感器的采集,注释详细
连接数据库用到MySQL_Connection库,这里首先到arduino ide的工具那里下载一个库,直接搜索MYSQL安装即可
代码
#include <ESP8266WiFi.h> // esp8266库
#include <MySQL_Connection.h> // Arduino连接Mysql的库
#include <MySQL_Cursor.h>
#include "SoftwareSerial.h"
SoftwareSerial uart1(13,15);//RX=d7,TX=d8,用于颗粒物传感器
SoftwareSerial uart2(14,12);//RX=d5,TX=6,用于CO传感器
SoftwareSerial uart3(0,2);//RX=d3,TX=d4,用于风向传感器
SoftwareSerial uart4(5,4);//RX=d1,TX=d2, 用于风速传感器
unsigned char item[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00,0X00, 0x79}; //16进制颗粒物问询命令,CO也一样,共用
unsigned char item1[8] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x02,0xC4, 0x0B}; //16进制风向传感器问询命令,风速一样
IPAddress server_addr(192,168,42,93); // 安装Mysql的电脑的IP地址,和连接里的一样
char user[] = "root"; // Mysql的用户名
char password[] = "******"; // 登陆Mysql的密码
// Mysql中添加一条数据的命令
char INSERT_SQL[] = "INSERT INTO data.data(PM1,PM2,PM10,CO,Direction,Speed,nowtime) VALUES ('%d','%d','%d','%.1f','%d','%.1f',now())";//第一个data是数据库名,第二个data是表名,后面七个对应表的7列名称,再后面就是每列对应数据类型了
char ssid[] = "realme X7 Pro"; // WiFi名
char pass[] = "12345678"; // WiFi密码
WiFiClient client; // 声明一个Mysql客户端,在连接Mysql中使用
MySQL_Connection conn(&client);
MySQL_Cursor* cursor; //
int isConnection=0;//用来判断数据库是否连接成功
// 读取数据并写入到数据库
void readAndRecordData(){
char buff[128];// 定义存储数据的数组
int arr[6];//定义一个数组用于接收传感器返回的三种颗粒物的值和CO、风速、风向值
ProcessSerialData(arr);//读取颗粒物CO传感器函数中传入这个数组,用这个数组来接收,如果不用数组接收的话,涉及到局部变量的问题,采集的数据在另一个函数调不出来,所以传入一个数组接收,之后直接调用数据即可
//经过上面采集数据函数处理后,所需要的七个传感器数据都已存在arr[6]里面
int pm1=arr[0];//定义类型数据来接收数组里的数据,需要进行类型转换的也可以
int pm2=arr[1];
int pm10=arr[2];
int direct=arr[4];
float co =float(arr[3])*0.1;//转为float型,在对应数据库要设置小数点位数
float sp =float(arr[5])*0.1;//转为float型,在对应数据库要设置小数点位数
sprintf(buff,INSERT_SQL,pm1,pm2,pm10,co,direct,sp); //insert_SQL上面定义了列的数据类型接收,写入数据库表里面
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn); // 创建一个Mysql实例
cur_mem->execute(buff);
Serial.println("读取数据,并写入数据库");
delete cur_mem; // 删除mysql实例为下次采集作准备
}
void setup()
{
Serial.begin(115200); //串口波特率
uart1.begin(9600); //定义的传感器采用的软串口的波特率,与传感器特性相同
uart2.begin(9600); //定义的传感器采用的软串口的波特率,与传感器特性相同
uart3.begin(4800); //定义的传感器采用的软串口的波特率,与传感器特性相同
uart4.begin(4800); //定义的传感器采用的软串口的波特率,与传感器特性相同
while (!Serial); // 等待端口的释放
Serial.printf("\nConnecting to %s", ssid);
WiFi.begin(ssid, pass); // 开始连接WiFi
while (WiFi.status() != WL_CONNECTED) { // 如果WiFi没有连接,一直循环打印点
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to network");
Serial.print("Connecting to SQL... ");
if (conn.connect(server_addr, 3306, user, password)) // 连接数据库
{
isConnection=1;
Serial.println("成功连接数据库---OK.");
}else{
isConnection=0;
Serial.println("连接数据库失败---FAILED.");
}
cursor = new MySQL_Cursor(&conn); // 创建一个数据库游标实例
}
void loop()
{
if(isConnection==1)//判断数据库是否连接成功
{
readAndRecordData();
delay(10000);//读取数据时间间隔
}
}
//读取颗粒物传感器函数,采用问询模式
void ProcessSerialData(int* arr)//传入数组接收三种颗粒物
{
uint8_t mPkt[9] = {0};//定义颗粒物数组返回字节接收数组
uint8_t coPkt[9] = {0};//定义CO数组返回字节接收数组
uint8_t dPkt[9] = {0};//定义风向数组返回字节接收数组
uint8_t sPkt[9] = {0};//定义风速数组返回字节接收数组
for (int i = 0 ; i < 9; i++) // 发送测温命令
{
uart1.write(item[i]); // write输出,写入颗粒物传感器问询指令
uart2.write(item[i]); // write输出,写入CO传感器问询指令
}
for (int m = 0 ; m < 8; m++) // 发送测温命令
{
uart3.write(item1[m]); // write输出,写入风向传感器问询指令
uart4.write(item1[m]); // write输出,写入风速传感器问询指令
}
delay(100); // 等待数据返回
while (uart1.available()) //判断对于串口是否返回了数据
{
for(int j=0;j<9;j++){
mPkt[j]=uart1.read(); // read按字节读取,存入数组
}
if(uart2.available()>0){
for(int k=0;k<9;k++){
coPkt[k]=uart2.read(); // read按字节读取,存入数组
}
}
if(uart3.available()>0){
for(int n=0;n<9;n++){
dPkt[n]=uart3.read(); // read按字节读取,存入数组
}
}
if(uart4.available()>0){
for(int a=0;a<9;a++){
sPkt[a]=uart4.read(); // read按字节读取,存入数组
}
}
}
arr[0]=mPkt[6]*256+mPkt[7];//PM1.0
arr[1]=mPkt[2]*256+mPkt[3];//PM2.5
arr[2]= mPkt[4]*256+mPkt[5]; //PM10
arr[3]=coPkt[2]*256+coPkt[3];//CO
arr[4]=dPkt[3]*256+dPkt[4];//wind direction,八向,第五第六两位为360°
arr[5]=sPkt[3]*256+sPkt[4];//wind speed
Serial.println(dPkt[4]);
}
下面就是我所实现的传感器数据采集上传到数据库,板子与电脑需要在同一个局域网