Teensy 4.1 is a huge problem!

bang

Member
Hello guys,
I have been working a project about rocketry system. I need help for the teensy code section.
I WRITE THE CODE AND IT WORKS WHEN THE USB IS CONNECTED. BUT WHEN THE USB IS DISCONNECTED THE CODE IS RESET AND IT DOES NOT WORK.
 
Check to see if your code includes something like this
Code:
while (!Serial);
Comment it out and try again.

Otherwise, check to make sure your power supply (+5V) is adequate. If the teensy is resetting without the USB connected then it might be power related,
 
hello here is the 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 pressure;
float altitude;

// 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
pinMode(rolePin1, OUTPUT);
pinMode(rolePin2, OUTPUT);
pinMode(rolePin3, OUTPUT);
pinMode(rolePin4, OUTPUT);
pinMode(rolePinBaro, OUTPUT); // Barometre rölesi için çıkış olarak ayarla

// 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
pressure = baro.readPressure(); // Basıncı oku
altitude = (1.0 - pow((float)pressure / 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(pressure);
Serial.print(" Pa, Altitude: ");
Serial.print(altitude);
Serial.println(" meters");

// Barometre için röle kontrolü
if (altitude >= 256.30) {
digitalWrite(rolePinBaro, LOW); // Yükseklik 256.30 metre veya daha büyükse röleyi kapat
} else if (altitude <= 255.88) {
digitalWrite(rolePinBaro, HIGH); // Yükseklik 255.88 metre veya daha düşükse röleyi aç
}

// SD karta verileri yaz
if (dataFile) {
dataFile.print("X: ");
dataFile.print(degerx);
dataFile.print(" Y: ");
dataFile.print(degery);
dataFile.print(" Pressure: ");
dataFile.print(pressure);
dataFile.print(" Pa, Altitude: ");
dataFile.print(altitude);
dataFile.println(" meters");
dataFile.flush(); // Veriyi hemen SD karta yaz
} else {
Serial.println("Dosya yazılamadı!");
}

delay(1000); // Bir sonraki okuma öncesi bir saniye bekle
}
ATTENTION:There is a problem when you feed the circuit from the battery, otherwise it works.
 
Like the previous comment said, you have while (!Serial); in your code (which even has a comment after it saying it will wait for the serial connection). It will wait forever at that line if there is no USB connection.
 
It would be better to replace:
Code:
while (!Serial); // Seri bağlantının başlamasını bekle
with
Code:
while (!Serial && millis() < 3000);
That way the Teensy will wait for up to 3 seconds for the Serial Port to become available and then give up looking and continue with the program if it is not.
 
Looks like Serial.begin() waits 2 seconds after called, when no Host connect? And is not required as Serial will come online as connect allows.
Teensy doesn't enter setup() until 300 ms
Returns from Serial.begin( at 2301 ms
Manually enabled USB Serial here at 4791 ms

OUTPUT :: aa1 Pre@ 300 aa2 SBwait@ 2301 aa3 SerOn@ 4791

Code:
void setup() {
  uint32_t aa1 = millis();
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.begin(14);
  uint32_t aa2 = millis();
  digitalWrite(LED_BUILTIN, LOW);
  while (!Serial)
    ;
  uint32_t aa3 = millis();
  Serial.printf("aa1 Pre@ %lu  aa2 SBwait@ %lu   aa3 SerOn@ %lu", aa1, aa2, aa3);
}
void loop() {
  // put your main code here, to run repeatedly:
}
 
Back
Top