Hi everybody! I'm trying to make a vertical landing rocket but I'm having a problem. I have an ms5611 code designed from Arduino. I open the impulse valve with ms5611 data, but since I made the project in Teensy, the Arduino code does not work. The relay does not turn on with the teensy code with the ms5611 sensor. I have a code where the relay stays on all the time. How to fix this error? here is my teensy code and ı will add arduino code:
arduıno code:
#include <Wire.h>
#include <MS5611.h>
// MS5611 barometre nesnesi
MS5611 baro;
int32_t basinc;
float yukseklik;
// Rölenin bağlı olduğu pin numarasını belirtin
int relayPin = 8; // Örneğin, röleyi dijital pin 8'e bağladığınızı varsayalım
void setup() {
Serial.begin(9600);
while (!Serial); // Seri bağlantının başlamasını bekle
Serial.println("MS5611 Sensör Verisi");
// I2C bus'ı başlat
Wire.begin();
// MS5611 barometreyi başlat
baro = MS5611();
if (baro.begin()) {
Serial.println("MS5611 başlatıldı.");
} else {
Serial.println("MS5611 başlatılamadı!");
}
// Röle pinini çıkış olarak ayarlayın
pinMode(relayPin, OUTPUT);
}
void loop() {
// MS5611 barometreden basınç ve yükseklik verilerini al
basinc = baro.readPressure(); // Basıncı oku
yukseklik = (1.0 - pow((float)basinc / 101325.0, 0.190284)) * 44330.77; // Yüksekliği hesapla
// Seri monitöre basınç ve yükseklik verilerini yazdır
Serial.print("Pressure: ");
Serial.print(basinc);
Serial.print(" Pa, Yükseklik: ");
Serial.print(yukseklik);
Serial.println(" metre");
// Yükseklik 290 ile 295 metre arasında ise röleyi aç (LOW), değilse kapat (HIGH)
if (yukseklik >= 290 && yukseklik <= 295) {
digitalWrite(relayPin, LOW); // Röleyi aç
} else {
digitalWrite(relayPin, HIGH); // Röleyi kapat
}
delay(750); // Bir sonraki okuma öncesi 750 milisaniye bekle
}
TEENSY 4.1 CODE:
#include <Wire.h>
#include <MS5611.h>
#include <SD.h>
// Röle pinlerini tanımla
int rolePin1 = 6; // X ekseni için röle 1
int rolePin2 = 7; // X ekseni için röle 2
int rolePin3 = 8; // Y ekseni için röle 3
int rolePin4 = 9; // Y ekseni için röle 4
int rolePinBaro = 11; // Barometre için röle (11 numaralı pin kullanılıyor)
// LED ve Buzzer pinlerini tanımla
int ledPin = 13; // LED için pin
int buzzerPin = 10; // Buzzer için pin
// MPU6050 I2C adresi
const int MPU6050_ADDR = 0x68;
// MPU6050 register adresleri
const int ACCEL_XOUT_H = 0x3B;
const int PWR_MGMT_1 = 0x6B;
// MS5611 barometre nesnesi
MS5611 baro;
int32_t basinc;
float yukseklik;
// SD kart için dosya nesnesi
File dataFile;
void setup() {
// Seri iletişimi başlat
Serial.begin(9600);
while (!Serial); // Seri bağlantının başlamasını bekle
Serial.println("MPU6050 ve MS5611 Sensör Verisi");
// Röle pinlerini çıkış olarak ayarla ve başlangıçta açık duruma getir
pinMode(rolePin1, OUTPUT);
digitalWrite(rolePin1, HIGH); // Röle 1 açık
pinMode(rolePin2, OUTPUT);
digitalWrite(rolePin2, HIGH); // Röle 2 açık
pinMode(rolePin3, OUTPUT);
digitalWrite(rolePin3, HIGH); // Röle 3 açık
pinMode(rolePin4, OUTPUT);
digitalWrite(rolePin4, HIGH); // Röle 4 açık
pinMode(rolePinBaro, OUTPUT);
digitalWrite(rolePinBaro, HIGH); // Barometre rölesi açık
// LED ve Buzzer pinlerini çıkış olarak ayarla
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
// LED'i aç ve buzzer'ı 1 saniye çalıştır
digitalWrite(ledPin, HIGH); // LED'i yak
digitalWrite(buzzerPin, HIGH); // Buzzer'ı çalıştır
delay(1000); // 1 saniye bekle
digitalWrite(buzzerPin, LOW); // Buzzer'ı kapat
// I2C bus'ı başlat (Wire1, Pin 16 ve Pin 17)
Wire1.begin();
// MPU6050'yi uyandır (PWR_MGMT_1 register'ını sıfırla)
Wire1.beginTransmission(MPU6050_ADDR);
Wire1.write(PWR_MGMT_1);
Wire1.write(0); // 0 yazmak, uyku modundan çıkarır
Wire1.endTransmission(true);
// MS5611 barometreyi başlat
Wire.begin();
baro = MS5611();
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ı.");
}
// Verileri kaydetmek için dosyayı aç
dataFile = SD.open("sensor_data.txt", FILE_WRITE);
if (!dataFile) {
Serial.println("Dosya açılamadı!");
} else {
Serial.println("Veri kaydı başlatıldı.");
}
}
void loop() {
int16_t accx, accy, accz;
// MPU6050'den ivme verilerini al
Wire1.beginTransmission(MPU6050_ADDR);
Wire1.write(ACCEL_XOUT_H); // İlk veri register'ını belirt
Wire1.endTransmission(false);
Wire1.requestFrom(MPU6050_ADDR, 6, true); // 6 byte veri iste
// Verileri oku
accx = Wire1.read() << 8 | Wire1.read();
accy = Wire1.read() << 8 | Wire1.read();
accz = Wire1.read() << 8 | Wire1.read();
// X ekseni verilerini eşle
int degerx = map(accx, -17000, 17000, 0, 180);
// Y ekseni verilerini eşle
int degery = map(accy, -17000, 17000, 0, 180);
// Seri monitöre ivme verilerini yazdır
Serial.print("X: ");
Serial.print(degerx);
Serial.print(" Y: ");
Serial.println(degery);
// X ekseni için röle kontrolü
if (degerx < 75) {
digitalWrite(rolePin1, LOW); // X ekseni 75'ten küçükse röle 1 kapalı
digitalWrite(rolePin2, HIGH); // Röle 2 açık
} else if (degerx > 105) {
digitalWrite(rolePin1, HIGH); // Röle 1 açık
digitalWrite(rolePin2, LOW); // X ekseni 105'ten büyükse röle 2 kapalı
} else {
digitalWrite(rolePin1, HIGH); // Diğer durumlarda röle 1 açık
digitalWrite(rolePin2, HIGH); // Diğer durumlarda röle 2 açık
}
// Y ekseni için röle kontrolü
if (degery < 70) {
digitalWrite(rolePin3, LOW); // Y ekseni 70'ten küçükse röle 3 kapalı
digitalWrite(rolePin4, HIGH); // Röle 4 açık
} else if (degery > 96) {
digitalWrite(rolePin3, HIGH); // Röle 3 açık
digitalWrite(rolePin4, LOW); // Y ekseni 96'dan büyükse röle 4 kapalı
} else {
digitalWrite(rolePin3, HIGH); // Diğer durumlarda röle 3 açık
digitalWrite(rolePin4, HIGH); // Diğer durumlarda röle 4 açık
}
// MS5611 barometreden basınç ve yükseklik verilerini al
baro.read(); // Sensörden veri al
basinc = baro.getPressure(); // Basıncı oku
yukseklik = (1.0 - pow((float)basinc / 101325, 0.190284)) * 44330.77; // Yüksekliği hesapla
// Seri monitöre basınç ve yükseklik verilerini yazdır
Serial.print("Pressure: ");
Serial.print(basinc);
Serial.print(" Pa, Yükseklik: ");
Serial.print(yukseklik);
Serial.println(" metre");
// Barometre için röle kontrolü
if (yukseklik >= 290.0 && yukseklik <= 295.0) {
digitalWrite(rolePinBaro, LOW); // Röleyi aç
Serial.println("Röle Açıldı (290 - 295 m)");
} else {
digitalWrite(rolePinBaro, HIGH); // Röleyi kapat
Serial.println("Röle Kapalı (Dışında)");
}
// SD karta verileri yaz
if (dataFile) {
dataFile.print("X: ");
dataFile.print(degerx);
dataFile.print(" Y: ");
dataFile.print(degery);
dataFile.print(" Pressure: ");
dataFile.print(basinc);
dataFile.print(" Pa, Yükseklik: ");
dataFile.print(yukseklik);
dataFile.println(" metre");
dataFile.flush(); // Veriyi hemen SD karta yaz
} else {
Serial.println("Dosya yazılamadı!");
}
delay(1000); // Bir sonraki okuma öncesi bir saniye bekle
}
arduıno code:
#include <Wire.h>
#include <MS5611.h>
// MS5611 barometre nesnesi
MS5611 baro;
int32_t basinc;
float yukseklik;
// Rölenin bağlı olduğu pin numarasını belirtin
int relayPin = 8; // Örneğin, röleyi dijital pin 8'e bağladığınızı varsayalım
void setup() {
Serial.begin(9600);
while (!Serial); // Seri bağlantının başlamasını bekle
Serial.println("MS5611 Sensör Verisi");
// I2C bus'ı başlat
Wire.begin();
// MS5611 barometreyi başlat
baro = MS5611();
if (baro.begin()) {
Serial.println("MS5611 başlatıldı.");
} else {
Serial.println("MS5611 başlatılamadı!");
}
// Röle pinini çıkış olarak ayarlayın
pinMode(relayPin, OUTPUT);
}
void loop() {
// MS5611 barometreden basınç ve yükseklik verilerini al
basinc = baro.readPressure(); // Basıncı oku
yukseklik = (1.0 - pow((float)basinc / 101325.0, 0.190284)) * 44330.77; // Yüksekliği hesapla
// Seri monitöre basınç ve yükseklik verilerini yazdır
Serial.print("Pressure: ");
Serial.print(basinc);
Serial.print(" Pa, Yükseklik: ");
Serial.print(yukseklik);
Serial.println(" metre");
// Yükseklik 290 ile 295 metre arasında ise röleyi aç (LOW), değilse kapat (HIGH)
if (yukseklik >= 290 && yukseklik <= 295) {
digitalWrite(relayPin, LOW); // Röleyi aç
} else {
digitalWrite(relayPin, HIGH); // Röleyi kapat
}
delay(750); // Bir sonraki okuma öncesi 750 milisaniye bekle
}
TEENSY 4.1 CODE:
#include <Wire.h>
#include <MS5611.h>
#include <SD.h>
// Röle pinlerini tanımla
int rolePin1 = 6; // X ekseni için röle 1
int rolePin2 = 7; // X ekseni için röle 2
int rolePin3 = 8; // Y ekseni için röle 3
int rolePin4 = 9; // Y ekseni için röle 4
int rolePinBaro = 11; // Barometre için röle (11 numaralı pin kullanılıyor)
// LED ve Buzzer pinlerini tanımla
int ledPin = 13; // LED için pin
int buzzerPin = 10; // Buzzer için pin
// MPU6050 I2C adresi
const int MPU6050_ADDR = 0x68;
// MPU6050 register adresleri
const int ACCEL_XOUT_H = 0x3B;
const int PWR_MGMT_1 = 0x6B;
// MS5611 barometre nesnesi
MS5611 baro;
int32_t basinc;
float yukseklik;
// SD kart için dosya nesnesi
File dataFile;
void setup() {
// Seri iletişimi başlat
Serial.begin(9600);
while (!Serial); // Seri bağlantının başlamasını bekle
Serial.println("MPU6050 ve MS5611 Sensör Verisi");
// Röle pinlerini çıkış olarak ayarla ve başlangıçta açık duruma getir
pinMode(rolePin1, OUTPUT);
digitalWrite(rolePin1, HIGH); // Röle 1 açık
pinMode(rolePin2, OUTPUT);
digitalWrite(rolePin2, HIGH); // Röle 2 açık
pinMode(rolePin3, OUTPUT);
digitalWrite(rolePin3, HIGH); // Röle 3 açık
pinMode(rolePin4, OUTPUT);
digitalWrite(rolePin4, HIGH); // Röle 4 açık
pinMode(rolePinBaro, OUTPUT);
digitalWrite(rolePinBaro, HIGH); // Barometre rölesi açık
// LED ve Buzzer pinlerini çıkış olarak ayarla
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
// LED'i aç ve buzzer'ı 1 saniye çalıştır
digitalWrite(ledPin, HIGH); // LED'i yak
digitalWrite(buzzerPin, HIGH); // Buzzer'ı çalıştır
delay(1000); // 1 saniye bekle
digitalWrite(buzzerPin, LOW); // Buzzer'ı kapat
// I2C bus'ı başlat (Wire1, Pin 16 ve Pin 17)
Wire1.begin();
// MPU6050'yi uyandır (PWR_MGMT_1 register'ını sıfırla)
Wire1.beginTransmission(MPU6050_ADDR);
Wire1.write(PWR_MGMT_1);
Wire1.write(0); // 0 yazmak, uyku modundan çıkarır
Wire1.endTransmission(true);
// MS5611 barometreyi başlat
Wire.begin();
baro = MS5611();
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ı.");
}
// Verileri kaydetmek için dosyayı aç
dataFile = SD.open("sensor_data.txt", FILE_WRITE);
if (!dataFile) {
Serial.println("Dosya açılamadı!");
} else {
Serial.println("Veri kaydı başlatıldı.");
}
}
void loop() {
int16_t accx, accy, accz;
// MPU6050'den ivme verilerini al
Wire1.beginTransmission(MPU6050_ADDR);
Wire1.write(ACCEL_XOUT_H); // İlk veri register'ını belirt
Wire1.endTransmission(false);
Wire1.requestFrom(MPU6050_ADDR, 6, true); // 6 byte veri iste
// Verileri oku
accx = Wire1.read() << 8 | Wire1.read();
accy = Wire1.read() << 8 | Wire1.read();
accz = Wire1.read() << 8 | Wire1.read();
// X ekseni verilerini eşle
int degerx = map(accx, -17000, 17000, 0, 180);
// Y ekseni verilerini eşle
int degery = map(accy, -17000, 17000, 0, 180);
// Seri monitöre ivme verilerini yazdır
Serial.print("X: ");
Serial.print(degerx);
Serial.print(" Y: ");
Serial.println(degery);
// X ekseni için röle kontrolü
if (degerx < 75) {
digitalWrite(rolePin1, LOW); // X ekseni 75'ten küçükse röle 1 kapalı
digitalWrite(rolePin2, HIGH); // Röle 2 açık
} else if (degerx > 105) {
digitalWrite(rolePin1, HIGH); // Röle 1 açık
digitalWrite(rolePin2, LOW); // X ekseni 105'ten büyükse röle 2 kapalı
} else {
digitalWrite(rolePin1, HIGH); // Diğer durumlarda röle 1 açık
digitalWrite(rolePin2, HIGH); // Diğer durumlarda röle 2 açık
}
// Y ekseni için röle kontrolü
if (degery < 70) {
digitalWrite(rolePin3, LOW); // Y ekseni 70'ten küçükse röle 3 kapalı
digitalWrite(rolePin4, HIGH); // Röle 4 açık
} else if (degery > 96) {
digitalWrite(rolePin3, HIGH); // Röle 3 açık
digitalWrite(rolePin4, LOW); // Y ekseni 96'dan büyükse röle 4 kapalı
} else {
digitalWrite(rolePin3, HIGH); // Diğer durumlarda röle 3 açık
digitalWrite(rolePin4, HIGH); // Diğer durumlarda röle 4 açık
}
// MS5611 barometreden basınç ve yükseklik verilerini al
baro.read(); // Sensörden veri al
basinc = baro.getPressure(); // Basıncı oku
yukseklik = (1.0 - pow((float)basinc / 101325, 0.190284)) * 44330.77; // Yüksekliği hesapla
// Seri monitöre basınç ve yükseklik verilerini yazdır
Serial.print("Pressure: ");
Serial.print(basinc);
Serial.print(" Pa, Yükseklik: ");
Serial.print(yukseklik);
Serial.println(" metre");
// Barometre için röle kontrolü
if (yukseklik >= 290.0 && yukseklik <= 295.0) {
digitalWrite(rolePinBaro, LOW); // Röleyi aç
Serial.println("Röle Açıldı (290 - 295 m)");
} else {
digitalWrite(rolePinBaro, HIGH); // Röleyi kapat
Serial.println("Röle Kapalı (Dışında)");
}
// SD karta verileri yaz
if (dataFile) {
dataFile.print("X: ");
dataFile.print(degerx);
dataFile.print(" Y: ");
dataFile.print(degery);
dataFile.print(" Pressure: ");
dataFile.print(basinc);
dataFile.print(" Pa, Yükseklik: ");
dataFile.print(yukseklik);
dataFile.println(" metre");
dataFile.flush(); // Veriyi hemen SD karta yaz
} else {
Serial.println("Dosya yazılamadı!");
}
delay(1000); // Bir sonraki okuma öncesi bir saniye bekle
}