kazmyldrm10
Member
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:
mpu6050 code:
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;
}