#include <Wire.h> // бібліотека для роботи з I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
void setup() {
lcd.init();
Serial.begin(9600);
MPUbegin(Serial); // вмикаємо сенкор і кажемо йому розмовляти з серіалом
pinMode(45, OUTPUT);/*зелений*/ pinMode(44, OUTPUT);/*блактитний*/
}
/* супер змінна структура яка зберігає данні з сенсора */ struct MPUData { float ax, ay, az; float gx, gy, gz; float temp; } data;
void loop() {
MPUget(1);
if(abs(data.az) > 1){digitalWrite(45, ! digitalRead(45)); delay(500); }
if(abs(data.ax) > 1){digitalWrite(44, ! digitalRead(44)); delay(500); }
lcd.setCursor(0,0); lcd.print("az "); lcd.print(data.az);
lcd.setCursor(1,0); lcd.print("ax "); lcd.print(data.ax);
}
/////////////////////////////////////////////////////////////////////////////////////////
void MPUbegin(HardwareSerial &s) {
Wire.begin();
Wire.beginTransmission(0x68);
Wire.write(0x6B); // Регістр живлення
Wire.write(0); // Будимо датчик
if (Wire.endTransmission() != 0) {
while (1) {
s.println("MPU6050 not connected!");
delay(1000);
}
}
}
void MPUget(bool printing) {
Wire.beginTransmission(0x68);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(0x68, 14, true);
// Акселерометр
data.ax = (int16_t)(Wire.read() << 8 | Wire.read()) / 16384.0;
data.ay = (int16_t)(Wire.read() << 8 | Wire.read()) / 16384.0;
data.az = (int16_t)(Wire.read() << 8 | Wire.read()) / 16384.0;
// Температура
int16_t rawTemp = Wire.read() << 8 | Wire.read();
data.temp = (rawTemp / 340.0) + 36.53;
// Гіроскоп
data.gx = (int16_t)(Wire.read() << 8 | Wire.read()) / 131.0;
data.gy = (int16_t)(Wire.read() << 8 | Wire.read()) / 131.0;
data.gz = (int16_t)(Wire.read() << 8 | Wire.read()) / 131.0;
if (printing) {
Serial.print(data.ax); Serial.print(",");
Serial.print(data.ay); Serial.print(",");
Serial.println(data.az);
}
}