Professional Documents
Culture Documents
h>
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <AsyncElegantOTA.h>
#include "DHT.h"
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>
#include "I2Cdev.h"
// #include "MPU6050.h"
#include "MPU6050_6Axis_MotionApps20.h"
//#include "MPU6050.h" // not necessary if using MotionApps include file
#define yaw_ 0
#define pitch_ 1
#define roll_ 2
// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif
bool connect_wifi = 1;
float acc_total_first;
void get_mpu() {
if (mpu.dmpGetCurrentFIFOPacket(fifoBuffer)) {
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
mpu.dmpGetAccel(&aa, fifoBuffer);
mpu.getRotation(&gyro[roll_], &gyro[pitch_], &gyro[yaw_]);
// 131.0
float acc_total_vector = sqrt((aaReal.x * aaReal.x) + (aaReal.y * aaReal.y) +
(aaReal.z * aaReal.z)); //Calculate the total accelerometer vector
if (abs(aaReal.y) < acc_total_vector) {
//Prevent the asin function to produce a NaN
angle_pitch_acc = asin((float)aaReal.y / acc_total_vector);
//Calculate the pitch angle.
}
if (abs(aaReal.x) < acc_total_vector) { //Prevent
the asin function to produce a NaN
angle_roll_acc = asin((float)aaReal.x / acc_total_vector) * -1; //Calculate
the roll angle.
}
ypr[1] = ypr[1] * 0.97 + angle_pitch_acc * 0.03;
ypr[2] = ypr[2] * 0.97 + angle_roll_acc * 0.03;
//Serial.println(ypr[1]);
/*
static unsigned long time_mpu = millis();
unsigned long time_bw = millis() - time_mpu;
time_mpu = millis();
Serial.println("mpu:" + String(time_bw));
*/
Wire.begin();
// initialize device
mpu.initialize();
accelgyro.initialize();
devStatus = mpu.dmpInitialize();
mpu.setXGyroOffset(10);
mpu.setYGyroOffset(-13);
mpu.setZGyroOffset(29);
mpu.setZAccelOffset(1556);
if (devStatus == 0) {
mpu.CalibrateAccel(6);
mpu.CalibrateGyro(6);
//mpu.PrintActiveOffsets();
// turn on the DMP, now that it's ready
Serial.println(F("Enabling DMP..."));
mpu.setDMPEnabled(true);
// enable Arduino interrupt detection
// attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady,
RISING);
mpuIntStatus = mpu.getIntStatus();
// set our DMP Ready flag so the main loop() function knows it's okay to use it
Serial.println(F("DMP ready! Waiting for first interrupt..."));
dmpReady = true;
// get expected DMP packet size for later comparison
packetSize = mpu.dmpGetFIFOPacketSize();
} else {
}
}
void setup(void) {
Serial.begin(9600);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
uint16_t count_delay = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
count_delay++;
if (count_delay >= 30) {
yield();
connect_wifi = 0;
dht.begin();
acc_setup();
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
return;
}
}
Serial.println("");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
void loop(void) {
if (connect_wifi == 1) AsyncElegantOTA.loop();
static uint8_t state = 0;
static unsigned long time_ = millis();
get_mpu();
if (millis() - time_ > 300) {
time_ = millis();