ESP8266采集多个传感器数据通过WIFI上传到本地数据库(风速、风向、CO、颗粒物)

2023-05-16

文章目录

  • 1.数据库使用简介
      • 1.Navicat premium连接
      • 2.新建数据库
      • 3.在数据库中新建表
  • 2.代码实现
      • 代码

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]);
}  
    

下面就是我所实现的传感器数据采集上传到数据库,板子与电脑需要在同一个局域网
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP8266采集多个传感器数据通过WIFI上传到本地数据库(风速、风向、CO、颗粒物) 的相关文章

  • C语言之调试技巧(VS2019编译器)

    C语言之调试技巧 xff08 VS2019编译器 xff09 一 什么是调试 xff1f 调试的作用1 1 什么是调试1 2 调试的基本步骤1 3 Debug版本和Release版本的介绍二 Windows环境调试的准备2 1 调试环境的准

随机推荐