Merging two separate codes on Teensy 4.1

Hello all, I have a main code with ms5611 on Teensy 4.1. It's controlling a relay with ms5611 and LoRa module. I also created a code for mpu6050 4 axis relay control. I want to add mpu6050 code to the main code but I couldn't add. In this case I want to run these two codes at the same time. Thank you so much.
Main Code:
Code:
#include <Wire.h>
#include <MS5611.h>
#include <SD.h>
#include "LoRa_E32.h"

// Röle pinlerini tanımla
const int rolePin1 = 6;
const int rolePin2 = 7;
const int rolePin3 = 8;
const int rolePin4 = 9;
const int rolePinBaro = 4;

// LED ve Buzzer pinlerini tanımla
const int ledPin = 13;
const int buzzerPin = 10;

// Sensör etkinleştirme pinini tanımla
const int sensorEnablePin = 2;

// MS5611 barometre nesnesi
MS5611 baro;
int32_t pressure;
float altitude;
float initial_altitude = 0;
bool initial_altitude_set = false;

// SD kart için dosya nesnesi
File dataFile;

// Sistemin veri alma sıklığını ayarlamak için interval ayarlanır.
unsigned long previousMillis = 0;
const long interval = 40; // 40ms interval

// Kalman filtresi için değişkenler
float kalmanAltitude = 0;
float kalmanAltitudeP = 1;
const float kalmanR = 0.02;
const float kalmanQ = 0.001;

// LoRa modülü için RX ve TX pinleri
LoRa_E32 e32ttl(&Serial1);

// 1 saniyelik gecikme için zamanlama değişkeni
bool delayStarted = false;
unsigned long delayStartTime = 0;
const unsigned long delayDuration = 1000; // 1 saniye

void setup() {
  Serial.begin(9600);

  Serial.println("MS5611 Sensör Verisi");

  // Röle pinlerini ayarla
  pinMode(rolePin1, OUTPUT);
  pinMode(rolePin2, OUTPUT);
  pinMode(rolePin3, OUTPUT);
  pinMode(rolePin4, OUTPUT);
  pinMode(rolePinBaro, OUTPUT);

  // Röle pinlerini başlangıçta yüksek yap
  digitalWrite(rolePin1, HIGH);
  digitalWrite(rolePin2, HIGH);
  digitalWrite(rolePin3, HIGH);
  digitalWrite(rolePin4, HIGH);
  digitalWrite(rolePinBaro, HIGH);

  // LED ve buzzer pinlerini ayarla
  pinMode(ledPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);

  // LED ve buzzeri başlangıçta ayarla
  digitalWrite(ledPin, HIGH);
  digitalWrite(buzzerPin, LOW);
  delay(1000);
  digitalWrite(ledPin, HIGH);
  digitalWrite(buzzerPin, LOW);

  pinMode(sensorEnablePin, INPUT);

  // MS5611 başlat
  Wire.begin();
  if (baro.begin()) {
    Serial.println("MS5611 başlatıldı.");
  } else {
    Serial.println("MS5611 başlatılamadı!");
  }

  // SD kart başlat
  if (!SD.begin(BUILTIN_SDCARD)) {
    Serial.println("SD kart başlatılamadı!");
    return;
  } else {
    Serial.println("SD kart başlatıldı.");
  }

  // Veri dosyasını aç
  dataFile = SD.open("sensor_data.txt", FILE_WRITE);
  if (!dataFile) {
    Serial.println("Dosya açılamadı!");
  } else {
    Serial.println("Veri kaydı başlatıldı.");
  }

  // LoRa modülünü başlat
  e32ttl.begin();
}

void loop() {
  unsigned long currentMillis = millis();

  // Sensör devre dışıysa röleyi hemen kapat
  if (digitalRead(sensorEnablePin) == LOW) {
    digitalWrite(rolePinBaro, HIGH);  // Röleyi kapat
    Serial.println("Sensörler devre dışı.");
    delayStarted = false; // Gecikmeyi sıfırla
  }

  // Sensör devredeyse
  else {
    // 1 saniyelik gecikmeyi başlat
    if (!delayStarted) {
      digitalWrite(rolePinBaro, LOW);  // Röleyi aç
      delayStartTime = currentMillis;
      delayStarted = true;
      Serial.println("Röle 1 saniyeliğine açıldı.");
    }

    // 1 saniye geçtiyse barometre verilerine göre röleyi kontrol et
    else if (currentMillis - delayStartTime >= delayDuration) {
      if (currentMillis - previousMillis >= interval) {
        previousMillis = currentMillis;

        // Barometre verilerini oku ve yüksekliği hesapla
        pressure = baro.readPressure();
        altitude = (1.0 - pow((float)pressure / 101325, 0.190284)) * 44330.77;
        if (!initial_altitude_set) {
          initial_altitude = altitude;
          initial_altitude_set = true;
        }

        float normalized_altitude = altitude - initial_altitude + 3.7;

        // Kalman filtresi uygulaması
        kalmanAltitudeP += kalmanQ;
        float K = kalmanAltitudeP / (kalmanAltitudeP + kalmanR);
        kalmanAltitude = kalmanAltitude + K * (normalized_altitude - kalmanAltitude);
        kalmanAltitudeP *= (1 - K);

        // Barometre verilerini seri porttan gönder
        Serial.print("Pressure: ");
        Serial.print(pressure);
        Serial.print(" Pa, Altitude (Ham): ");
        Serial.print(normalized_altitude);
        Serial.print(" meters, Altitude (Filtreli): ");
        Serial.print(kalmanAltitude);
        Serial.println(" meters");

        // Verileri SD karta yaz
        if (dataFile) {
          dataFile.print("Pressure: ");
          dataFile.print(pressure);
          dataFile.print(" Pa, Altitude (Ham): ");
          dataFile.print(normalized_altitude);
          dataFile.print(" meters, Altitude (Filtreli): ");
          dataFile.print(kalmanAltitude);
          dataFile.println(" meters");
        }

        dataFile.flush();

        // LoRa modülünden gelen mesajı al ve röleyi kontrol et
        ResponseContainer rc = e32ttl.receiveMessage();
        if (rc.status.code == 1 || rc.status.code == 0) {  // Başarıyla alındıysa
          String receivedMessage = rc.data;  // Gelen mesajı sakla
          Serial.print(receivedMessage);

          if ((kalmanAltitude > 3 && kalmanAltitude <= 6.7) || receivedMessage == "0") {
            digitalWrite(rolePinBaro, LOW);  // Röleyi aç
            Serial.println("Röle Açık");
          } else {
            digitalWrite(rolePinBaro, HIGH);  // Röleyi kapat
            Serial.println("Röle Kapalı");
          }
        }
      }
    }
  }
}

mpu6050 code:
Code:
#include <Wire.h>

// MPU6050 I2C adresi
const int MPU6050_ADDR = 0x68;

// MPU6050 register adresleri
const int ACCEL_XOUT_H = 0x3B;

// Röle pinlerini tanımla
const int rolePin1 = 6;
const int rolePin2 = 7;
const int rolePin3 = 8;
const int rolePin4 = 9;

const int filterLength = 27;  // Kayar ortalama filtresi uzunluğu
int xBuffer[filterLength] = {0};
int yBuffer[filterLength] = {0};
int bufferIndex = 0;

float accelZOffset = 0;
float lastAccelZ = 0;
float velocityZ = 0;
float dt = 0.5;  // Saniye cinsinden interval süresi
unsigned long previousMillis = 0;
const long interval = 40;

unsigned long startMillis;
const long initializationTime = 2000; // 2 saniye

// Düşük geçiş filtresi parametreleri
float alpha = 0.5;  // 0 ile 1 arasında bir değer. Küçükse daha yavaş tepki verir, büyükse daha hızlı.
float filteredAccelZ = 0;
float filteredVelocityZ = 0;

void setup() {
  // Seri port ve I2C başlat
  Serial.begin(115200);  // Daha yüksek baud rate kullanıyoruz
  Wire1.begin();         // Wire1 kullanıyoruz çünkü 16, 17 pinlerine bağlı
  Wire1.setClock(400000);  // I2C hızını 400kHz'e çıkardık (varsayılan 100kHz)

  // Röle pinlerini ayarla
  pinMode(rolePin1, OUTPUT);
  pinMode(rolePin2, OUTPUT);
  pinMode(rolePin3, OUTPUT);
  pinMode(rolePin4, OUTPUT);

  // Röle pinlerini başlangıçta kapalı yap
  digitalWrite(rolePin1, HIGH);
  digitalWrite(rolePin2, HIGH);
  digitalWrite(rolePin3, HIGH);
  digitalWrite(rolePin4, HIGH);

  // MPU6050 başlat
  Wire1.beginTransmission(MPU6050_ADDR);
  Wire1.write(0x6B);  // PWR_MGMT_1 register
  Wire1.write(0);     // 0 ile başlat, uyku modundan çıkar
  Wire1.endTransmission(true);

  // MPU6050 kalibrasyonu
  calibrateMPU6050();

  // Sistem başlangıç zamanını kaydet
  startMillis = millis();
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    int16_t accx, accy, accz;
    float az;

    // MPU6050'dan veri oku
    Wire1.beginTransmission(MPU6050_ADDR);
    Wire1.write(ACCEL_XOUT_H);
    Wire1.endTransmission(false);
    Wire1.requestFrom(MPU6050_ADDR, 6, true);

    accx = Wire1.read() << 8 | Wire1.read();
    accy = Wire1.read() << 8 | Wire1.read();
    accz = Wire1.read() << 8 | Wire1.read();

    // Verileri dereceye çevir
    int degerx = map(accx, -17000, 17000, 0, 180);
    int degery = map(accy, -17000, 17000, 0, 180);

    // Ham X ve Y değerlerini 90'a ölçekleme işlemi
    if (degerx > 130 || degerx < 40) {
      degerx = 90;
    }

    if (degery > 130 || degery < 40) {
      degery = 90;
    }

    // Kayar ortalama filtresini uygula
    xBuffer[bufferIndex] = degerx;
    yBuffer[bufferIndex] = degery;

    int sumX = 0, sumY = 0;
    for (int i = 0; i < filterLength; i++) {
      sumX += xBuffer[i];
      sumY += yBuffer[i];
    }

    int filteredX = sumX / filterLength;
    int filteredY = sumY / filterLength;

    // Sonraki indeks için döngü
    bufferIndex = (bufferIndex + 1) % filterLength;

    // İvme verisini filtrele
    az = accz / 16384.0 - accelZOffset;
    filteredAccelZ = alpha * az + (1 - alpha) * filteredAccelZ;

    // Filtrelenmiş ivme verisini kullanarak hızı hesapla ve hızı da filtrele
    velocityZ += (filteredAccelZ - lastAccelZ) * 9.81 * dt;
    filteredVelocityZ = alpha * velocityZ + (1 - alpha) * filteredVelocityZ;
    lastAccelZ = filteredAccelZ;

    // Stabilizasyon süresi dolana kadar röleleri kontrol etme
    if (currentMillis - startMillis < initializationTime) {
      return;
    }

    // Röleleri kontrol et
    if (filteredX < 82) {
      if (digitalRead(rolePin1) == HIGH) {
        Serial.println("Röle 1 açıldı");
      }
      digitalWrite(rolePin1, LOW);
      
      if (digitalRead(rolePin2) == LOW) {
        Serial.println("Röle 2 kapandı");
      }
      digitalWrite(rolePin2, HIGH); 
    } else if (filteredX > 102) {
      if (digitalRead(rolePin1) == LOW) {
        Serial.println("Röle 1 kapandı");
      }
      digitalWrite(rolePin1, HIGH); 

      if (digitalRead(rolePin2) == HIGH) {
        Serial.println("Röle 2 açıldı");
      }
      digitalWrite(rolePin2, LOW);
    } else {
      if (digitalRead(rolePin1) == LOW) {
        Serial.println("Röle 1 kapandı");
      }
      if (digitalRead(rolePin2) == LOW) {
        Serial.println("Röle 2 kapandı");
      }
      digitalWrite(rolePin1, HIGH); 
      digitalWrite(rolePin2, HIGH);
    }

    if (filteredY < 78) {
      if (digitalRead(rolePin3) == HIGH) {
        Serial.println("Röle 3 açıldı");
      }
      digitalWrite(rolePin3, LOW);
      
      if (digitalRead(rolePin4) == LOW) {
        Serial.println("Röle 4 kapandı");
      }
      digitalWrite(rolePin4, HIGH); 
    } else if (filteredY > 98) {
      if (digitalRead(rolePin3) == LOW) {
        Serial.println("Röle 3 kapandı");
      }
      digitalWrite(rolePin3, HIGH); 
      
      if (digitalRead(rolePin4) == HIGH) {
        Serial.println("Röle 4 açıldı");
      }
      digitalWrite(rolePin4, LOW);
    } else {
      if (digitalRead(rolePin3) == LOW) {
        Serial.println("Röle 3 kapandı");
      }
      if (digitalRead(rolePin4) == LOW) {
        Serial.println("Röle 4 kapandı");
      }
      digitalWrite(rolePin3, HIGH); 
      digitalWrite(rolePin4, HIGH);
    }

    // Filtrelenmiş ve ham veriyi yazdır
    Serial.print("X Axis: ");
    Serial.print(degerx);
    Serial.print(" | X Filtered: ");
    Serial.print(filteredX);
    Serial.print(" | Y Axis: ");
    Serial.print(degery);
    Serial.print(" | Y Filtered: ");
    Serial.print(filteredY);
    Serial.print(" | Acc: ");
    Serial.print(az, 2);
    Serial.print(" g, | Filtered Acc: ");
    Serial.print(filteredAccelZ, 2);
    Serial.print(" g, | Speed: ");
    Serial.print(velocityZ, 2);
    Serial.print(" m/s, | Fitered Speed: ");
    Serial.print(filteredVelocityZ, 2);
    Serial.println(" m/s");
  }
}

void calibrateMPU6050() {
  const int numReadings = 1000;
  long sumAccelZ = 0;

  for (int i = 0; i < numReadings; i++) {
    Wire1.beginTransmission(MPU6050_ADDR);
    Wire1.write(0x3F); // ACCEL_ZOUT_H register
    Wire1.endTransmission(false);
    Wire1.requestFrom(MPU6050_ADDR, 2, true);

    int16_t accelZ = Wire1.read() << 8 | Wire1.read();

    sumAccelZ += accelZ;

    delay(2);  // Bu delay Teensy için minimize edilebilir
  }

  accelZOffset = (sumAccelZ / numReadings) / 16384.0;
}
 
Think I would start with adding the MS5611 sensor to the MPU6050 code as a start to make sure you are reading both sensors first. Then adding in the sending data to lora.

Once you do that post the code and then can address the issues. I do know for a fact that both will work together.
 
Yes, I have worked with both of them before. Then I separated the mp6050 code to develop it and made the necessary updates. The same applies to the ms5611 code. Then I tried to combine it again but I couldn't. I am new to software. I am having a hard time. I tried to combine it with artificial intelligence but I couldn't do it with it either.
 
it is my old code that these two sensors works together. old code:
Code:
#include <Wire.h>
#include <MS5611.h>
#include <SD.h>
#include "LoRa_E32.h"

// Röle pinlerini tanımla
const int rolePin1 = 6;
const int rolePin2 = 7;
const int rolePin3 = 8;
const int rolePin4 = 9;
const int rolePinBaro = 4;

// LED ve Buzzer pinlerini tanımla
const int ledPin = 13;
const int buzzerPin = 10;

// Sensör etkinleştirme pinini tanımla
const int sensorEnablePin = 2;

// MPU6050 I2C adresi
const int MPU6050_ADDR = 0x68;

// MPU6050 register adresleri
const int ACCEL_XOUT_H = 0x3B;
const int ACCEL_ZOUT_H = 0x3F;
const int PWR_MGMT_1 = 0x6B;

// MS5611 barometre nesnesi
MS5611 baro;
int32_t pressure;
float altitude;
float initial_altitude = 0;
bool initial_altitude_set = false;

// SD kart için dosya nesnesi
File dataFile;

// Sistemin veri alma sıklığını ayarlamak için interval ayarlanır.
unsigned long previousMillis = 0;
const long interval = 500;

float lastAccelZ = 0;
float velocityZ = 0;
float dt = interval / 1000.0;

// Kalibrasyon değerleri
float accelZOffset = 0;

// Kalman filtresi için değişkenler
float kalmanAccelZ = 0;
float kalmanAccelP = 1;
float kalmanAltitude = 0;
float kalmanAltitudeP = 1;
const float kalmanR = 0.02;
const float kalmanQ = 0.001;

// LoRa modülü için RX ve TX pinleri
LoRa_E32 e32ttl(&Serial1);

void setup() {
  Serial.begin(9600);
 
  Serial.println("MPU6050 ve MS5611 Sensör Verisi");

  // Röle pinlerini ayarla
  pinMode(rolePin1, OUTPUT);
  pinMode(rolePin2, OUTPUT);
  pinMode(rolePin3, OUTPUT);
  pinMode(rolePin4, OUTPUT);
  pinMode(rolePinBaro, OUTPUT);

  // Röle pinlerini başlangıçta yüksek yap
  digitalWrite(rolePin1, HIGH);
  digitalWrite(rolePin2, HIGH);
  digitalWrite(rolePin3, HIGH);
  digitalWrite(rolePin4, HIGH);
  digitalWrite(rolePinBaro, HIGH);

  // LED ve buzzer pinlerini ayarla
  pinMode(ledPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);

  // LED ve buzzeri başlangıçta ayarla
  digitalWrite(ledPin, HIGH);
  digitalWrite(buzzerPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, HIGH);
  digitalWrite(buzzerPin, LOW);

  pinMode(sensorEnablePin, INPUT);

  // MPU6050 başlat
  Wire1.begin();
  Wire1.beginTransmission(MPU6050_ADDR);
  Wire1.write(PWR_MGMT_1);
  Wire1.write(0);
  Wire1.endTransmission(true);

  // MS5611 başlat
  Wire.begin();
  if (baro.begin()) {
    Serial.println("MS5611 başlatıldı.");
  } else {
    Serial.println("MS5611 başlatılamadı!");
  }

  // SD kart başlat
  if (!SD.begin(BUILTIN_SDCARD)) {
    Serial.println("SD kart başlatılamadı!");
    return;
  } else {
    Serial.println("SD kart başlatıldı.");
  }

  // Veri dosyasını aç
  dataFile = SD.open("sensor_data.txt", FILE_WRITE);
  if (!dataFile) {
    Serial.println("Dosya açılamadı!");
  } else {
    Serial.println("Veri kaydı başlatıldı.");
  }

  // LoRa modülünü başlat
  e32ttl.begin();
 
  // MPU6050 kalibrasyonu
  calibrateMPU6050();
}

void loop() {
  unsigned long currentMillis = millis();

  // Veri okuma zaman aralığı
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    if (digitalRead(sensorEnablePin) == HIGH) {
      int16_t accx, accy, accz;
      float az;

      // MPU6050'dan veri oku
      Wire1.beginTransmission(MPU6050_ADDR);
      Wire1.write(ACCEL_XOUT_H);
      Wire1.endTransmission(false);
      Wire1.requestFrom(MPU6050_ADDR, 6, true);

      accx = Wire1.read() << 8 | Wire1.read();
      accy = Wire1.read() << 8 | Wire1.read();
      accz = Wire1.read() << 8 | Wire1.read();

      // Verileri dereceye çevir
      int degerx = map(accx, -17000, 17000, 0, 180);
      int degery = map(accy, -17000, 17000, 0, 180);

      az = accz / 16384.0 - accelZOffset;

      // Kalman filtresi uygulaması
      kalmanAccelP += kalmanQ;
      float K = kalmanAccelP / (kalmanAccelP + kalmanR);
      kalmanAccelZ = kalmanAccelZ + K * (az - kalmanAccelZ);
      kalmanAccelP *= (1 - K);

      velocityZ += (kalmanAccelZ - lastAccelZ) * 9.81 * dt;
      lastAccelZ = kalmanAccelZ;

      // Veriyi seri porttan gönder
      Serial.print("X: ");
      Serial.print(degerx);
      Serial.print(" Y: ");
      Serial.print(degery);
      Serial.print(" İvme (Ham): ");
      Serial.print(az, 2);
      Serial.print(" g, İvme (Filtreli): ");
      Serial.print(kalmanAccelZ, 2);
      Serial.print(" g, Hız: ");
      Serial.print(velocityZ, 2);
      Serial.println(" m/s");

      // Röleleri kontrol et
      if (degerx < 75) {
        digitalWrite(rolePin1, LOW);
        digitalWrite(rolePin2, HIGH); 
      } else if (degerx > 105) {
        digitalWrite(rolePin1, HIGH); 
        digitalWrite(rolePin2, LOW);
      } else {
        digitalWrite(rolePin1, HIGH); 
        digitalWrite(rolePin2, HIGH);
      }

      if (degery < 75) {
        digitalWrite(rolePin3, LOW);
        digitalWrite(rolePin4, HIGH); 
      } else if (degery > 105) {
        digitalWrite(rolePin3, HIGH); 
        digitalWrite(rolePin4, LOW);
      } else {
        digitalWrite(rolePin3, HIGH); 
        digitalWrite(rolePin4, HIGH);
      }

      // Barometre verilerini oku ve yüksekliği hesapla
      pressure = baro.readPressure();
      altitude = (1.0 - pow((float)pressure / 101325, 0.190284)) * 44330.77;
      if (!initial_altitude_set) {
        initial_altitude = altitude;
        initial_altitude_set = true;
      }

      

      float normalized_altitude = altitude - initial_altitude + 3.7;

      // Kalman filtresi uygulaması
      kalmanAltitudeP += kalmanQ;
      K = kalmanAltitudeP / (kalmanAltitudeP + kalmanR);
      kalmanAltitude = kalmanAltitude + K * (normalized_altitude - kalmanAltitude);
      kalmanAltitudeP *= (1 - K);

      // Barometre verilerini seri porttan gönder
      Serial.print("Pressure: ");
      Serial.print(pressure);
      Serial.print(" Pa, Altitude (Ham): ");
      Serial.print(normalized_altitude);
      Serial.print(" meters, Altitude (Filtreli): ");
      Serial.print(kalmanAltitude);
      Serial.println(" meters");
      
      // Röleyi barometreye göre kontrol et
      

      // Verileri SD karta yaz
      if (dataFile) {
        dataFile.print("X: ");
        dataFile.print(degerx);
        dataFile.print(" Y: ");
        dataFile.print(degery);
        dataFile.print(" İvme (Ham): ");
        dataFile.print(az, 2);
        dataFile.print(" g, İvme (Filtreli): ");
        dataFile.print(kalmanAccelZ, 2);
        dataFile.print(" g, Hız: ");
        dataFile.print(velocityZ, 2);
        dataFile.print(" m/s, Pressure: ");
        dataFile.print(pressure);
        dataFile.print(" Pa, Altitude (Ham): ");
        dataFile.print(normalized_altitude);
        dataFile.print(" meters, Altitude (Filtreli): ");
        dataFile.print(kalmanAltitude);
        dataFile.println(" meters");
      }

      dataFile.flush();
    }
  }

  // LoRa modülünden gelen mesajı al ve röleyi kontrol et
  ResponseContainer rc = e32ttl.receiveMessage();
  if (rc.status.code == 1 || rc.status.code == 0  ) {  // Başarıyla alındıysa
    String receivedMessage = rc.data;  // Gelen mesajı sakla
    Serial.print(receivedMessage);

    if ((kalmanAltitude > 0.5 && kalmanAltitude <= 6.7) || receivedMessage == "0") {

      digitalWrite(rolePinBaro, LOW);  // Röleyi aç
      Serial.println("Röle Kapandı");

    } else {
      digitalWrite(rolePinBaro, HIGH);  // Röleyi kapat
      Serial.println("Röle Açıldı");
      
    }
  }
}

void calibrateMPU6050() {
  const int numReadings = 1000;
  long sumAccelZ = 0;

  for (int i = 0; i < numReadings; i++) {
    Wire1.beginTransmission(MPU6050_ADDR);
    Wire1.write(ACCEL_ZOUT_H);
    Wire1.endTransmission(false);
    Wire1.requestFrom(MPU6050_ADDR, 2, true);

    int16_t accelZ = Wire1.read() << 8 | Wire1.read();

    sumAccelZ += accelZ;

    delay(2);
  }

  accelZOffset = (sumAccelZ / numReadings) / 16384.0;
}
 
Not really sure what you mean by can not combine or what’s not working. Just make sure you aren’t duplicating variables
 
Back
Top