#include <Wire.h>
#include <Adafruit_AHTX0.h>
#include <Adafruit_BMP280.h>
#include <MPU6050.h>    // تأكد من استخدام مكتبة Jeff Rowberg
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

// تعريف الحساسات
Adafruit_AHTX0 aht;
Adafruit_BMP280 bmp;
MPU6050 mpu;

// تهيئة الـ NRF24L01
RF24 radio(9, 10);
const byte address[6] = "00001";

// هيكل البيانات
struct SensorData {
  float temperature;
  float humidity;
  float pressure;
  float accelX, accelY, accelZ;
  float gyroX, gyroY, gyroZ;
};

SensorData data;

void setup() {
  Serial.begin(9600);
  
  // تهيئة الحساسات
  if (!aht.begin()) Serial.println("AHT20 فشل!");
  if (!bmp.begin(0x76)) Serial.println("BMP280 فشل!");
  
  // تهيئة MPU6050 (التعديل الأساسي هنا)
  mpu.initialize();
  if (!mpu.testConnection()) {
    Serial.println("MPU6050 فشل!");
    while (1);
  }
  
  // تهيئة الراديو
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  // قراءة AHT20
  sensors_event_t humidity, temp;
  aht.getEvent(&humidity, &temp);
  data.temperature = temp.temperature;
  data.humidity = humidity.relative_humidity;

  // قراءة BMP280
  data.pressure = bmp.readPressure() / 100.0F;

  // قراءة MPU6050 (التعديل الرئيسي هنا)
  int16_t ax, ay, az;
  int16_t gx, gy, gz;
  mpu.getAcceleration(&ax, &ay, &az);
  mpu.getRotation(&gx, &gy, &gz);
  
  // تحويل القيم إلى وحدات فعلية
  data.accelX = ax / 16384.0;  // 2g range: 16384 LSB/g
  data.accelY = ay / 16384.0;
  data.accelZ = az / 16384.0;
  
  data.gyroX = gx / 131.0;     // 250°/s range: 131 LSB/(°/s)
  data.gyroY = gy / 131.0;
  data.gyroZ = gz / 131.0;

  // طباعة البيانات
  Serial.println("====== البيانات المرسلة =======");
  Serial.print("درجة الحرارة: "); Serial.print(data.temperature, 2); Serial.println(" °C");
  Serial.print("الرطوبة: "); Serial.print(data.humidity, 2); Serial.println(" %");
  Serial.print("الضغط: "); Serial.print(data.pressure, 2); Serial.println(" hPa");
  
  Serial.println("-- التسارع (g) --");
  Serial.print("X: "); Serial.print(data.accelX, 2);
  Serial.print(" | Y: "); Serial.print(data.accelY, 2);
  Serial.print(" | Z: "); Serial.println(data.accelZ, 2);
  
  Serial.println("-- الجيروسكوب (°/ث) --");
  Serial.print("X: "); Serial.print(data.gyroX, 2);
  Serial.print(" | Y: "); Serial.print(data.gyroY, 2);
  Serial.print(" | Z: "); Serial.println(data.gyroZ, 2);
  Serial.println("=============================");
  
  // إرسال البيانات
  radio.write(&data, sizeof(data));
  delay(2000);
}