HC05 2. Abstandssensor

Ich habe ein Programm geschrieben für zwei Abstandssensoren.
Es wird aber immer nur der Erste ausgelesen.
Die Abstandssensoren sind in Ordnung, weil ich sie schon ausgetauscht habe.
Warum wird der Erste erkannt und der Zweite nicht?
Im Anhang habe ich das Programm beigefügt.
Hardware:
Arduino-Mega mit TFT Display und zwei LCD Anzeigen.
Das funktioniert auch bis auf den zweiten Abstandssensor.
Ist da noch ein Bug im Programm?

// IMPORTANT: ELEGOO_TFTLCD LIBRARY MUST BE SPECIFICALLY
// CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD.
// SEE RELEVANT COMMENTS IN Elegoo_TFTLCD.h FOR SETUP.
//Technical support:goodtft@163.com
#include <LiquidCrystal_I2C.h>
#include <Elegoo_GFX.h> // Core graphics library
#include <Elegoo_TFTLCD.h> // Hardware-specific library
#include <TouchScreen.h>
#define USE_Elegoo_SHIELD_PINOUT
#define MINPRESSURE 200
#define MAXPRESSURE 1000
#define PBOn 31
#define TCAADDR 0x70

void TCA9548A(uint8_t bus){
Wire.beginTransmission(0x70); // TCA9548A address is 0x70
Wire.write(1 << bus); // send byte to select bus
Wire.endTransmission();
Serial.print(bus);
}

const int XP=8,XM=A0,YP=A1,YM=9; //240x320 ID=0x9341
const int TS_LEFT=137,TS_RT=894,TS_TOP=93,TS_BOT=893;

void tcaselect(uint8_t i) {
if (i > 7) return;

Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission();
}
LiquidCrystal_I2C lcd(0x3f, 40, 4); // bei 40x4
LiquidCrystal_I2C lcd1(0x27, 40, 4); // bei 40x4

TouchScreen ts = TouchScreen(XP, YP, XM,YM, 300);
Elegoo_GFX_Button on_btn, off_btn, stop_btn;

define SENDEN_vor 22

define ECHO_vor 23

define SENDEN_rueck 24

define ECHO_rueck 25

define LED_Rot_vor 26

define LED_Gelb_vor 28

define LED_Gruen_vor 30

define LED_Rot_rueck 27

define LED_Gelb_rueck 29

define LED_Gruen_rueck 31

define Stop_vor 32

define Stop_rueck 34

define LED_vor 33

define LED_rueck 35

// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

// When using the BREAKOUT BOARD only, use these 8 data lines to the LCD:
// For the Arduino Uno, Duemilanove, Diecimila, etc.:
// D0 connects to digital pin 8 (Notice these are
// D1 connects to digital pin 9 NOT in order!)
// D2 connects to digital pin 2
// D3 connects to digital pin 3
// D4 connects to digital pin 4
// D5 connects to digital pin 5
// D6 connects to digital pin 6
// D7 connects to digital pin 7
// For the Arduino Mega, use digital pins 22 through 29
// (on the 2-row header at the end of the board).

// Assign human-readable names to some common 16-bit color values:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF

Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// If using the shield, all control and data lines are fixed, and
// a simpler declaration can optionally be used:
// Elegoo_TFTLCD tft;

int pixel_x, pixel_y; //Touch_getXY() updates global vars
/*
//bool Touch_getXY(void)
{
TSPoint p = ts.getPoint();
pinMode(YP, OUTPUT); //restore shared pins
pinMode(XM, OUTPUT);
digitalWrite(YP, HIGH); //because TFT control pins
digitalWrite(XM, HIGH);
/* bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);
if (pressed) {
pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me
pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());
}
return pressed;
}
*/
// Motor
int GSM1 = 36;
int MVor = 38;
int MRueck = 40;

// interne Variable
int buttonState1 = 0;
int buttonState2 = 0;
bool ButtonStatevor = 0;
bool ButtonStaterueck = 1;
String Direction;
long dauer=0;
long Zeit_vor;
long Zeit_rueck;
long Entfernung_vor=0;
long Entfernung_rueck=0;
int Geschwindigkeit_vor;
int Geschwindigkeit_rueck;

void setup(void)
{
Serial.begin(9600);
Serial.println(F("TFT LCD test"));
uint16_t ID = tft.readID();

#ifdef USE_Elegoo_SHIELD_PINOUT
Serial.println(F("Using Elegoo 2.4" TFT Arduino Shield Pinout"));
#else
Serial.println(F("Using Elegoo 2.4" TFT Breakout Board Pinout"));
#endif

Serial.print("TFT size is "); Serial.print(tft.width()); Serial.print("x"); Serial.println(tft.height());

tft.reset();

uint16_t identifier = tft.readID();
if(identifier == 0x9325) {
Serial.println(F("Found ILI9325 LCD driver"));
} else if(identifier == 0x9328) {
Serial.println(F("Found ILI9328 LCD driver"));
} else if(identifier == 0x4535) {
Serial.println(F("Found LGDP4535 LCD driver"));
}else if(identifier == 0x7575) {
Serial.println(F("Found HX8347G LCD driver"));
} else if(identifier == 0x9341) {
Serial.println(F("Found ILI9341 LCD driver"));
} else if(identifier == 0x8357) {
Serial.println(F("Found HX8357D LCD driver"));
} else if(identifier==0x0101)
{
identifier=0x9341;
Serial.println(F("Found 0x9341 LCD driver"));
}
else if(identifier==0x1111)
{
identifier=0x9341;
Serial.println(F("Found 0x9341 LCD driver"));
}
else {
Serial.print(F("Unknown LCD driver chip: "));
Serial.println(identifier, HEX);
Serial.println(F("If using the Elegoo 2.8" TFT Arduino shield, the line:"));
Serial.println(F(" #define USE_Elegoo_SHIELD_PINOUT"));
Serial.println(F("should appear in the library header (Elegoo_TFT.h)."));
Serial.println(F("If using the breakout board, it should NOT be #defined!"));
Serial.println(F("Also if using the breakout, double-check that all wiring"));
Serial.println(F("matches the tutorial."));
identifier=0x9341;

}
tft.begin(identifier);
tft.fillScreen(GREEN);
// tft.setRotation(3);

on_btn.initButton(&tft,  40, 290, 60, 30, WHITE, CYAN, GREEN, "Vor", 2);
stop_btn.initButton(&tft, 120, 290, 60, 30, WHITE, CYAN, GREEN, "Stop", 2);
off_btn.initButton(&tft, 200, 290, 60, 30, WHITE, CYAN, GREEN, "Ruck", 2);
on_btn.drawButton(false);
stop_btn.drawButton(false);
off_btn.drawButton(false);

pinMode (GSM1, OUTPUT);
pinMode (MVor, OUTPUT);
pinMode(MRueck, OUTPUT);

pinMode(SENDEN_vor, OUTPUT);
pinMode(SENDEN_rueck, OUTPUT);
pinMode(ECHO_vor, INPUT);
pinMode(ECHO_rueck, INPUT);
pinMode(LED_Rot_vor, OUTPUT);
pinMode(LED_Gelb_vor, OUTPUT);
pinMode(LED_Gruen_vor, OUTPUT);
pinMode(LED_Rot_rueck, OUTPUT);
pinMode(LED_Gelb_rueck, OUTPUT);
pinMode(LED_Gruen_rueck, OUTPUT);

pinMode(Stop_vor, INPUT);
pinMode(Stop_rueck, INPUT);
pinMode(LED_vor, OUTPUT);
pinMode(LED_rueck, OUTPUT);

// LCD starten
lcd.init();
lcd.backlight();

lcd1.init();
lcd1.backlight();

digitalWrite(LED_vor, LOW);
digitalWrite(LED_rueck, LOW);

//tcaselect(1);

}

void loop(void)
{

//unsigned long start = micros();

/*
{
bool down = Touch_getXY();
// on_btn.press
(
down && on_btn.contains(pixel_x, pixel_y)
);
off_btn.press
(
down && off_btn.contains(pixel_x, pixel_y)
);
if (
on_btn.justReleased()
)
on_btn.drawButton();
if (
off_btn.justReleased()
)
off_btn.drawButton();
if (
on_btn.justPressed()
)
{
on_btn.drawButton(true);

   digitalWrite(PBOn, HIGH);
} 
if (
  off_btn.justPressed()
  ) 
{
    off_btn.drawButton(true);
    digitalWrite(PBOn, LOW);
}

}

*/

buttonState1 =digitalRead(Stop_vor);
buttonState2 =digitalRead(Stop_rueck);

if (buttonState1 == HIGH)
{
ButtonStatevor = HIGH;
ButtonStaterueck = LOW;
}

if (buttonState2 == HIGH)
{
ButtonStatevor = LOW;
ButtonStaterueck = HIGH;
}

if (ButtonStatevor == HIGH)
{
(Direction = "rueck");
delay(100);
digitalWrite(LED_rueck, HIGH);
digitalWrite(LED_vor, LOW);
digitalWrite(MRueck, HIGH); // Motor beginnt zurück
digitalWrite(MVor, LOW); // Motor vor stopp
analogWrite(GSM1, Geschwindigkeit_rueck); // Motor soll mit der Geschwindigkeit "200" (max. 255) rotieren
}

if (ButtonStaterueck == HIGH)
{
(Direction = "vor");
digitalWrite(LED_vor, HIGH);
digitalWrite(LED_rueck, LOW);
analogWrite(GSM1, Geschwindigkeit_vor); // Motor soll mit der Geschwindigkeit "200" (max. 255) rotieren
}

// Signal für 5 Mikrosekunden low Vorwärts

digitalWrite(SENDEN_vor, LOW);
delayMicroseconds(5);

// Sender ausschalten
digitalWrite(SENDEN_vor, HIGH);
delay(10);
digitalWrite(SENDEN_vor, LOW);

// pulseIn → Zeit messen, bis das Signal zurückkommt
Zeit_vor = pulseIn(ECHO_vor, HIGH);
if (Entfernung_vor >= 500 || Entfernung_vor <= 0) //Wenn die gemessene Entfernung über 500cm oder unter 0cm liegt,…
{
Serial.println("Kein Messwert");
}
/*
Entfernung in cm berechnen
Zeit/2 → nur eine Strecke soll berechnet werden
Umrechnung in cm
*/
Entfernung_vor = (Zeit_vor / 2) * 0.03432;
Serial.println("Dist-V:");
Serial.println(Entfernung_vor);
// 400 cm ist die maximal messbare Entfernung
// if (Entfernung_vor < 400)
// delay(100);

// Entfernung_rueck = (Zeit / 2) * 0.03432;

// 400 cm ist die maximal messbare Entfernung
// if (Entfernung_rueck < 400)
// delay(100);

// Berechnung der Geschwindigkeit in Abhängigkeit von Entfernung
if (Entfernung_vor < 20)
Geschwindigkeit_vor = 70;
if (Entfernung_vor > 20)
Geschwindigkeit_vor = 150;
if (Entfernung_vor > 60)
Geschwindigkeit_vor=200;
if (Entfernung_vor > 100)
Geschwindigkeit_vor=255;

 // Signal für 5 Millisekunden ausschalten

digitalWrite(SENDEN_rueck, LOW);
delay(5);

// Sender einschalten
digitalWrite(SENDEN_rueck, HIGH);
delay(10);
digitalWrite(SENDEN_rueck, LOW);
// pulseIn → Zeit messen, bis das Signal zurückkommt
Zeit_rueck = pulseIn(ECHO_rueck, HIGH);
if (Entfernung_rueck >= 500 || Entfernung_rueck <= 0) //Wenn die gemessene Entfernung über 500cm oder unter 0cm liegt,…
{
Serial.println("Kein Messwert");
}
/*
Entfernung in cm berechnen
Zeit/2 → nur eine Strecke soll berechnet werden
Umrechnung in cm
*/
Entfernung_rueck = (Zeit_rueck / 2) * 0.03432;

Serial.println("Dist-R:");
Serial.println(Entfernung_rueck);

// 400 cm ist die maximal messbare Entfernung
if (Entfernung_rueck < 400)
delay(100);

// Berechnung der Geschwindigkeit in Abhängigkeit von Entfernung
if (Entfernung_rueck < 20)
Geschwindigkeit_rueck = 70;
if (Entfernung_rueck > 20)
Geschwindigkeit_rueck = 150;
if (Entfernung_rueck > 60)
Geschwindigkeit_rueck=200;
if (Entfernung_rueck > 100)
Geschwindigkeit_rueck=255;

// Motor starten

if (ButtonStatevor == HIGH)
{
(Direction = "rueck");
delay(2000);
digitalWrite(LED_rueck, HIGH);
digitalWrite(LED_vor, LOW);
digitalWrite(MRueck, HIGH); // Motor beginnt zurück
digitalWrite(MVor, LOW); // Motor vor stopp
analogWrite(GSM1, Geschwindigkeit_rueck); // Motor zurueck mit Vorgabe rotieren
}

if (ButtonStaterueck == HIGH)
{
(Direction = "vor");
digitalWrite(LED_vor, HIGH);
digitalWrite(LED_rueck, LOW);
digitalWrite(MRueck, LOW); // Motor zurueck stopp
digitalWrite(MVor, HIGH); // Motor vor start
analogWrite(GSM1, Geschwindigkeit_vor); // Motor soll mit Vorgabe rotieren

}

// tft.fillScreen(GREEN);

// Ausgabe auf TFT
tft.fillScreen(GREEN);
int X1 = 10; // Distanz X
int Y1 = 10; // Distanz Y
int X2 = 200; //
int Y2 = 30;
int X3 = 200;
int Y3 = 50;
tft.setTextColor(RED);
tft.setTextSize(2);

tft.setCursor(X1,Y1);
tft.println("Distanz vor: "); // 1. Variable
tft.setCursor(170,Y1);
tft.print(Entfernung_vor);

tft.setCursor(X1,Y2);
tft.println("Richtung:"); // 2. Variable
tft.setCursor(170,Y2);
tft.print(Direction);

tft.setCursor(Y1, 50);
tft.println("Speed-vor:"); // 3. Variable
tft.setCursor(170,Y3);
tft.print(Geschwindigkeit_vor);

tft.setCursor(X1,70);
tft.println("Distanz rueck: "); // 1. Variable
tft.setCursor(170,70);
tft.print(Entfernung_rueck);

tft.setCursor(X1,90);
tft.println("Richtung:"); // 2. Variable
tft.setCursor(170,90);
tft.print(Direction);

tft.setCursor(X1, 110);
tft.println("Speed-zurueck:"); // 3. Variable
tft.setCursor(170,110);
tft.print(Geschwindigkeit_rueck);

// Ausgabe auf dem LCD 1
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dist-V:");
lcd.print(Entfernung_vor);
lcd.print(" Dir:");
lcd.print(Direction);
lcd.setCursor(0, 1);
lcd.print("Speed-V:");
lcd.print(Geschwindigkeit_vor);
lcd.setCursor(0, 2);
lcd.print("Dist-R:");
lcd.print(Entfernung_rueck);
lcd.print(" Dir:");
lcd.print(Direction);
lcd.setCursor(0, 3);
lcd.print("Speed-R:");
lcd.print(Geschwindigkeit_rueck);

// Ausgabe auf dem LCD 2
lcd1.clear();
lcd1.setCursor(0, 0);
lcd1.print("Dist-R:");
lcd1.print(Entfernung_rueck);
lcd1.print(" Dir:");
lcd1.print(Direction);
lcd1.setCursor(0, 1);
lcd1.print("Speed-R:");
lcd1.print(Geschwindigkeit_rueck);
lcd1.setCursor(0, 2);
lcd1.print("Dist-R:");
lcd1.print(Entfernung_rueck);
lcd1.print("Dir:"),
lcd1.print(Direction);
lcd1.setCursor(0, 3);
lcd1.print("Speed-R:");
lcd1.print(Geschwindigkeit_rueck);

Serial.println ("Ausgabe auf PC:");

Serial.println ("Zeit Vor:");

Serial.println(Zeit_vor);

Serial.println("Dist-V:");

Serial.println(Entfernung_vor);

Serial.println(" Dir:");

Serial.println(Direction);

// Serial.setCursor(0, 1);
Serial.println("Speed-V:");

Serial.println(Geschwindigkeit_vor);

//Serial.setCursor(0, 2);

Serial.println("Zeit rueck:");

Serial.println(Zeit_rueck);

Serial.println("Dist-R:");

Serial.println(Entfernung_rueck);

Serial.println(" Dir:");

Serial.println(Direction);

// Serial.setCursor(0, 3);
Serial.println("Speed-R:");

Serial.println(Geschwindigkeit_rueck);

// Ausgabe auf Monitor

Serial.println ("Speed-vor:=");
Serial.println (Geschwindigkeit_vor);
Serial.println ("Dir:");
Serial.println (Direction);
Serial.println ("Distanz-Vor:");
Serial.println (Entfernung_vor);
Serial.println ("Distanz-Rueck:");
Serial.println (Entfernung_rueck);
Serial.println ("Speed-rueck:=");
Serial.println (Geschwindigkeit_rueck);
Serial.println (MVor);
Serial.println (MRueck);

if (Stop_vor==HIGH)
{ Serial.println ( "Stop Vor ausgeloest");
}
if (Stop_rueck==HIGH)
{Serial.println ( "Stop Zurueck ausgeloest");
}

if (Stop_vor==LOW)
{ Serial.println ( "Stop Vor nicht ausgeloest");
}
if (Stop_rueck==LOW)
{Serial.println ( "Stop Zurueck nicht ausgeloest");
}
Serial.println (buttonState1);
Serial.println (buttonState2);

delay(100);

   switch (Entfernung_vor)
{
  case 31 ... 3000:
    digitalWrite(LED_Gruen_vor, HIGH);
    digitalWrite(LED_Rot_vor, LOW);
    digitalWrite(LED_Gelb_vor, LOW);
    delay(100);
    break;

  case 9 ... 30:
    digitalWrite(LED_Gelb_vor, HIGH);
    digitalWrite(LED_Gruen_vor, LOW);
    digitalWrite(LED_Rot_vor, LOW);
    delay(100);
    break;

 case 0 ... 8:
    digitalWrite(LED_Rot_vor, HIGH);
    digitalWrite(LED_Gelb_vor, LOW);
    digitalWrite(LED_Gruen_vor, LOW);
    delay(100);
    break;

switch (Entfernung_rueck)
{
case 31 ... 3000:
digitalWrite(LED_Gruen_rueck, HIGH);
digitalWrite(LED_Rot_rueck, LOW);
digitalWrite(LED_Gelb_rueck, LOW);
delay(100);
break;

  case 9 ... 30:
    digitalWrite(LED_Gelb_rueck, HIGH);
    digitalWrite(LED_Gruen_rueck, LOW);
    digitalWrite(LED_Rot_rueck, LOW);
    delay(100);
    break;

 case 0 ... 8:
    digitalWrite(LED_Rot_rueck, HIGH);
    digitalWrite(LED_Gelb_rueck, LOW);
    digitalWrite(LED_Gruen_rueck, LOW);
    delay(100);
    break;
} 

}

}

Sorry, aber den Sketch kann man kaum lesen.
Setze den bitte in Code-Tags.
Wie das funktioniert, kannst du hier nachlesen. Dann kann man den evtl. besser lesen.
Und mach das bitte in deinem obigen Post, das geht auch noch nachträglich.

Der MEGA hat zwar mehr RAM als ein UNO aber dennoch würd ich RAM sparen zb mithilfe des F() Makros in jedem print text.

Also zB statt
Serial.println ( "Stop Zurueck nicht ausgeloest");
dann
Serial.println(F ( "Stop Zurueck nicht ausgeloest"));

Dann: Zeilen ab 346 bis 364; Komentare sind entfernt.

digitalWrite(SENDEN_rueck, LOW);
delay(5);
digitalWrite(SENDEN_rueck, HIGH);
delay(10);
digitalWrite(SENDEN_rueck, LOW);
Zeit_rueck = pulseIn(ECHO_rueck, HIGH);
if (Entfernung_rueck >= 500 || Entfernung_rueck <= 0) 
{
Serial.println("Kein Messwert");
}
Entfernung_rueck = (Zeit_rueck / 2) * 0.03432;

Der Wert "Entfernung_rueck" wird erst nach dem if berechnet und ist somit im if noch mit dem vorherigen Meßwert besetzt.
Gleiches gilt für "Entfernung_vor"

String Direction;

Brauchst Du nicht. Einfach eine bool-Variable nehmen und dann

if (direction) tft.print(F("vor")); else tft.print(F("zurück"));

Auch das spart Speicher.

if (Entfernung_rueck < 20)
Geschwindigkeit_rueck = 70;
if (Entfernung_rueck > 20)
Geschwindigkeit_rueck = 150;

Was passiert wenn == 20?

// 400 cm ist die maximal messbare Entfernung
if (Entfernung_rueck < 400)
delay(100);

Wenn der Meßwert entgegen dem Komentar größer als 400 ist, dann keine Pause?

if (Entfernung_rueck >= 500 || Entfernung_rueck <= 0) //Wenn die gemessene Entfernung über 500cm oder unter 0cm liegt,…
{
Serial.println("Kein Messwert");
}

Einen Text ausgeben ist keine Fehlerbehandlung. Was passiert wenn der Meßwert größer als 500cm ist? Ist das egal? Darf dennoch die Geschwindigkeit hoch gewählt werden?

Das sind einige schnell gefundenen Komischheiten in Deinem Sketch. Wahrscheinlich lauern da noch mehr davon.

Grüße Uwe

Hallo,
das ändert aber nichts an der Tatsache, dass der zweite Sensor nicht bearbeitet wird.
Ich habe schon den UNO gewechselt aber das gleiche Problem.
Morgen bekomme ich einen Oszi, dann kann ich ja mal sehen, ob die Signale richtig kommen.

Dann mach doch mal, worum ich dich in Post #2 gebeten habe.
Dann sehen sich auch andere evtl. gern den Bandwurmsketch an.

Sorry mir ist das zu anstrengend, dass da oben zu lesen, daher nur eine Vermutung. Sind deine Abstandsensoren über i2c angebunden? Wenn ja haste jedem auch eine eigene Adresse zugewiesen?

1 Like

Hallo,
jetzt mach doch erst mal einen kleinen Sketch der Dein eigentliches Problem zeigt und lass den ganzen Rest erst mal weg. Also die beiden Sensoren einlesen und die Messwerte auf dem Monitor anzeigen.

Ich hab da ehrlich gesagt keine Lust mich durch den Bandwurm zu arbeiten. Eventuell schaust Du dir auch mal an wie man eine Funktion baut, damit der Sketche etwas Struktur bekommt und Du , und wir auch, Ihn besser lesen können. Dazu überlegt man sich erst mal ganz grob die Teilaufgaben und die löst man dann einzeln.

mal ganz grob als Vorschlag
messen
auswerten
motoren
led_anzeigen
display_anzeigen

1 Like

Was ist eigentlich der Unteschied zwischen einem Bandwurmsketch und einem Spaghettisketch?
Sind das nur regionale Eigenheiten der gleiche Programmiereigenheiten?

Grüße Uwe

1 Like

Einen Unterschied kenne ich nicht.
Aber offensichtlich versteht der TO beides nicht, sonst hätte er das schon längst bearbeitet.

nein, wie du aus meinem Programm ersehen kannst, werden nur I/Os verwendet.
Ausser bei den Anzeigen; die werden mit I2C gesteuert. Das funktioniert aber.
Wie ich schon schrieb, bekomme ich morgen einen Oszi.

Ich bin dipl.Ing Elektrotechnik und habe überwiegend mit Step7 und TIA progammiert.
Ich habe früher auch in C++ programmiert, aber das ist lange her.
Auch darin habe ich mich eingearfbeitet, bin aber noch kein Profi.
Seit letztem Jahr habe ich mich mit dem Raspi ( Python ) und Unos (C-) beschäftigt und bin auch noch kein Profi.
Also habt auch da Verständnis.
Im Übrigen bin ich 76 Jahre und immer noch aktiv.

Und ich merke auch, du bist sehr konsequent.
Zumindest damit, dich den Bitten anderer User zu verweigern.
Sorry, aber so wird das nix.

Nein.

Ein Bandwurm-Code ist ein Code ohne/wenige Schleifen/ Sub-Routinen der einfach von Anfang bis Ende abgearbeitet wird.

Ein Spaghetti-Code ist ein Code der mit jede Menge Unterroutinen arbeitet und von diesen von Höpchen nach Töpfchen springt. Dabei kommt es häufig zu Rekursiven Aufrufen. Wurde in den Anfangszeiten des Coden oft gemacht als es noch GOTO gab.

Bei Excel tritt das heutzutage noch manchmal auf wenn der Inhalt einer Zelle sich selbst aufruft.

@TO

Sind die Sensoren direkt an das Board angeschlossen ? Oder an den TCA9548A . ?

Welche sind das überhaupt. ??

Meiner Meinung nach braucht man das TCA9548A nur, wenn man die I2C-Adresse am Objekt (hier dein Sensor) nicht verstehen kann und mehr als 1 braucht.

Und so nebenbei. Entferne mal alles aus den Code was du nicht angeschlossen hast.

Das

Gruß

Pucki

Habe das Programm bereinigt, aber das Problem bleibt.
Wenn ich die Adressen ändere, es wird immer nur der erste ausgelesen.
Warum?
Wie meint ihr das mit dem Codetags?
`

define senden1 24

define echo1 25

define senden2 22

define echo2 23

long Zeit1;
long Entfernung1=0;
long Zeit2;
long Entfernung2=0;

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

pinMode(senden1, OUTPUT);
pinMode(echo1, INPUT);

pinMode(senden2, OUTPUT);
pinMode(echo2, INPUT);

}
void loop()
{
// Sender kurz ausschalten um Störungen des Signals zu vermeiden
digitalWrite(senden1, LOW);
delayMicroseconds(5);
digitalWrite(senden1, HIGH);
delayMicroseconds(10);
digitalWrite(senden1, LOW);
Zeit1 = pulseIn(echo1, HIGH);

digitalWrite(senden2, LOW);
delayMicroseconds(5);
digitalWrite(senden2, HIGH);
delayMicroseconds(10);
digitalWrite(senden2, LOW);
Zeit2 = pulseIn(echo2, HIGH);
/*
Entfernung in cm berechnen
Zeit/2 → nur eine Strecke soll berechnet werden
Umrechnung in cm
*/
Entfernung1 = (Zeit1 / 2) * 0.03432;
Entfernung2 = (Zeit2 / 2) * 0.03432;
// 400 cm ist die maximal messbare Entfernung
if (Entfernung1 < 400)
{
// Ausgabe auf dem PC

  Serial.println("Entfernung1 messen");
  Serial.println("Entfernung1: ");
  Serial.println(Entfernung1);
  Serial.println(" cm    ");
  

  delay(1000);

}
if (Entfernung2 < 400)
{
// Ausgabe auf dem PC

  Serial.println("Entfernung2 messen");
  Serial.println("Entfernung2: ");
  Serial.println(Entfernung2);
  Serial.println(" cm    ");
  

  delay(1000);

}
}

Du klickst auf CODE in Eingabe-/Editor- Fenster BEVOR du den Code einfügst und dann nochmal danach.

Und lies mal meine Bitte.

Gruß

Pucki

Warum liest du nicht alles, was wir dir schreiben ?
Die Erklärung zu den Code-Tags steht schon in Post#2.

Vielleicht weis er nicht das Farbige Dinger im Text ein Link sind. Und das das Forum (im Gegensatz zu vielen anderen) kein Farbigen Text erlaubt.

Gruß

Pucki

Ich habe alles unnötige entfernt und nur noch die beiden Abstandssensoren drin.

Und ich weiß immer noch nicht welche. Oder habe wieder was übersehen. ??

Nur zu Info.
Der HC-05 ist laut dieser Seite ein BT-Modul KEIN Abstandssensor.

Ein Abstandssensor ist z.b. dieser hier.

Das Problem ist, das gibt es auch mit Ultraschall.

ERGO, wenn du kein Link von den Teil was du hast, postest bringt das ALLES nix.

Gruß

Pucki

@bernhardjunk

Hatte ich schon geschrieben, nicht gelesen ?