最近在使用无人但是发现上面有一个令人吃惊的现象!!它自带的GPS数据差距也太大了!!才飞10多米的样子就能能显示100多米这差距都差出银河系了。

于是我开始思考如何解决呢,想起以前在太极创客学习ESP8266正好手里有一块esp8266,那么esp8266加BMP280有没有搞头?当然有,而且很大!说干就干。

我在platfromIO上使用esp826612E进行驱动使用首先就是接线

vcc------>>3.3v
GND------>>GND
SCL------->>D1
SDA------->>D2

esp8266发送GPS数据到APP esp8266 gps模块_esp8266发送GPS数据到APP

主要是参照这个引脚,然后就是加代码,加功能。

首先就是main.h的文件定义你需要的显示数据的变量,然后就是定义功能函数。

#ifndef __MAIN_H__
#define __MAIN_H__
#include<Arduino.h>


#define BMP_SCK  (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS   (10)


float Temperature,Pressuer,Altitude;

String sendHTML();
void handleRoot() ;
void handleNotFound();
void wifi_connection();
void bmp_readData();

#endif // !__MAIN_H__

 接下来就是main.cpp文件

#include"main.h"
#include <ESP8266WiFi.h>        
#include <ESP8266WiFiMulti.h>  
#include <ESP8266WebServer.h>   
#include <Adafruit_BMP280.h>
// #include <Wire.h>
// #include <SPI.h>


ESP8266WiFiMulti wifiMulti;     
Adafruit_BMP280 bmp;
ESP8266WebServer esp8266_server(80);
 

void setup()
{

  Serial.begin(9600);                              
  delay(10);
  wifi_connection();
  Serial.println(F("BMP280 Forced Mode Test."));
  #if 1
    if (!bmp.begin()) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
                      "try a different address!"));
    while (1) delay(10);
  }
 
   bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
    #endif

}
 

void loop()
{

  esp8266_server.handleClient();                        // 处理http服务器访问
  bmp_readData();                                       //循环访问数据


}   

 /******************************************************
 * 
 * 无参数
 * 无返回值
 * 作用是连接成功后请求对于/的访问请求
 * 
******************************************************/

void handleRoot()
 {   
  //处理网站目录“/”的访问请求 
  esp8266_server.send(200, "text/html", sendHTML());  
}

/******************************************************
 * 
 * 无参数
 * 返回值为字符串
 * 作用是作为handleRoot的一个访问请求后的网站显示
 * 
******************************************************/

String sendHTML()
{
  
  String htmlCode = "<!DOCTYPE html> <html>\n";
  htmlCode +="<head><meta http-equiv='refresh' content='5'/>\n";
  htmlCode +="<title>Data_feedback</title>\n";
  htmlCode +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  htmlCode +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
  htmlCode +="</style>\n";
  htmlCode +="</head>\n";
  htmlCode +="<body>\n";
  htmlCode +="<p><h1>Data_feedback</h1>\n";
  htmlCode+="Temperature:\t";
  htmlCode+=((float)Temperature);
  htmlCode+="*C";
  htmlCode+="<br>atmospheric pressure:\t";
  htmlCode+=((float)Pressuer); 
  htmlCode+="pa";
  htmlCode+="<br>Altitude:\t";
  htmlCode+=((float)Altitude);
  htmlCode+="M</p>\n";
  htmlCode +="</body>\n";
  htmlCode +="</html>\n";
  return htmlCode;

}
 
/******************************************************
 * 
 * 无参数
 * 返回值为字符串
 * 作用是访问失败后的返回
 * 
******************************************************/

void handleNotFound()
{
   // 当浏览器请求的网络资源无法在服务器找到时。
  esp8266_server.send(404, "text/plain", "404: Not found");   // NodeMCU将调用此函数。

}

/******************************************************
 * 
 * 无参数
 * 返回值为字符串
 * 作用是对于wifi连接的函数的封装封装了整个wifi连接和访问初始化的过程
 * 
******************************************************/

 void wifi_connection()
 {
    // wifiMulti.addAP("小母牛开飞机", "hltw445.");         // 将需要连接的一系列WiFi ID和密码输入这里
    wifiMulti.addAP("iQOO8", "123456789");              // ESP8266-NodeMCU在启动后会扫描当前网络
    wifiMulti.addAP("vivo S7t", "123456788");           // 环境查找是否有这里列出的WiFi ID。如果有
    Serial.println("Connecting ...");     
    Serial.println("");
    
    int i = 0;                                 
  while (wifiMulti.run() != WL_CONNECTED) 
  {
                                                        // 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前
    delay(1000);                                        // 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU
    Serial.print(i++); Serial.print(' ');               // 将会连接信号最强的那一个WiFi信号。

  }                                                     // 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是
  Serial.println('\n');             
  Serial.println("*****************************");      // WiFi连接成功后将通过串口监视器输出连接成功信息 
  Serial.print("Connected to ");                        // NodeMCU将通过串口监视器输出。
  Serial.println(WiFi.SSID());                          // 连接的WiFI名称
  Serial.print("IP address:\t");                        // 以及
  Serial.println(WiFi.localIP());                       // NodeMCU的IP地址
  Serial.println("*****************************");
  Serial.println("\n");
  esp8266_server.begin();                  
  esp8266_server.on("/", handleRoot);
  esp8266_server.onNotFound(handleNotFound);        
  Serial.println("HTTP esp8266_server started");        //  告知用户ESP8266网络服务功能已经启动

 }

/******************************************************
 * 
 * 无参数
 * 返回值为字符串
 * 作用是作为在bmp函数在loop循环中的循环读取参数使用
 * 
******************************************************/

 void bmp_readData()
 {
  
   
    Serial.print(F("Temperature = "));
    Temperature=bmp.readTemperature();
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");
    
    Serial.print(F("Pressure = "));
    Pressuer=bmp.readPressure();
    Serial.print(bmp.readPressure());
    Serial.println(" Pa");

    Serial.print(F("Approx altitude = "));
    Altitude=bmp.readAltitude(1013.25);
    Serial.print(bmp.readAltitude(1013.25));
    Serial.println(" m");

    Serial.println();
    delay(2000);

   
 }

然后接下来就是最终的演示效果了。


给小飞机利用esp8266写一个数据返回


据理论估计可达有效范围应该在30~50米之间。而且测试之后显然较原飞机的GPS测量气压更加准确。