最近在使用无人但是发现上面有一个令人吃惊的现象!!它自带的GPS数据差距也太大了!!才飞10多米的样子就能能显示100多米这差距都差出银河系了。
于是我开始思考如何解决呢,想起以前在太极创客学习ESP8266正好手里有一块esp8266,那么esp8266加BMP280有没有搞头?当然有,而且很大!说干就干。
我在platfromIO上使用esp826612E进行驱动使用首先就是接线
vcc------>>3.3v
GND------>>GND
SCL------->>D1
SDA------->>D2
主要是参照这个引脚,然后就是加代码,加功能。
首先就是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测量气压更加准确。