Probleme mit Display (+I2C) und Ultraschallsensor

hallo @ all,
ich bin neu hier im forum und wende mich mit einem problem an euch das ich/wir nicht lösen können.

ein kollege und ich haben im rahmen unserer techniker-weiterbildung ein projekt mit dem arduino am laufen.

das ist sozusagen auch der erste kontakt mit dem arduino für uns beide.

nun zum projekt:
das fertige produkt soll sozusagen wie eine einparkhilfe funktionieren.
ein ultraschallsensor ermittelt die entfernung und dementsprechend wird die entfernung an ein led-stripe (rgb) und aktiv buzzer ausgegeben.
led-stripe: von grün nach rot
aktiv buzzer: je näher, desto schneller das warnsignal
soweit so gut, funktioniert alles so wie es soll!
zusätzlich soll aber über ein 16x2 display in verbindung mit einem i2c-modul die entfernung in "cm" angezeigt werden.
anfangs hatten wir probleme mit der anzeige, dies lag aber an der falschen adressierung (per sketch auf funduino, glaube ich, konnten wir die adresse des i2c ermitteln)
nun funktioniert auch das display.

nun zum problem:
wenn das display angeschlossen ist, verändert sich die frequenz der tonausgabe des aktiv buzzers überhaupt nicht - d.h. es wird weder langsamer noch schneller.
entfernen wir das display macht der aktivbuzzer was er soll...

womit kann das zu tun haben? spannungsversorgung?
wir haben den led-stripe über ein seperates netzteil laufen, deshalb kann ich mir das eig nicht vorstellen.
verwendet wird übrigens ein arduino uno.

ich hoffe ihr könnt helfen und schonmal vielen dank!!!

sketch im post von essa93 weiter unten...

Willkommen im Universum der Bastler und Tüftler und Verrückten :smiling_imp:

Mach mal den Code noch in Code-Tags, liest sich besser.

Im Sketch seh ich nix von LCD, daher kein Tipp. Wenn's stand alone funktioniert, also die Verkabelung ok ist UND sich mit der für LED und Buzzer nicht beißt dann steckt der Hund im Sketch. Also bitte zeigen.

Klaus_ww hat es ja schon geschrieben. Den Sketch bitte in Code-Tags stzen.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Und dann solltest du auch den richtigen Sketch posten, damit wir sehen, welche Fehler gemacht wurden.
So können wir nicht helfen.

Und auch schreiben, welches Display du verwendest. Am besten einen Link posten.

erst einmal vielen dank für die antworten.

wie es natürlich so ist sind menie notizen nicht auf dem neuesten stand -.-
wir haben das auf dem laptop vom kollegen gemacht, habe ihn direkt angeschrieben und den link geschickt auch hierzu geschickt...sobald ich den aktuellen sketch habe werde ich das hier natürlich direkt aktualisieren.

zu dem display kann ich keine angaben machen, den haben wir aus china...

ich weiß es ohne sketch kann man das schwer sagen, aber meint ihr jetzt auf den ersten blick das es ein hardware oder ein sketch problem ist?

wie gesagt, sobald ich alles nötige vom kollege habe haue ich den aktuellen sketch raus.

roschi13:
ich weiß es ohne sketch kann man das schwer sagen, aber meint ihr jetzt auf den ersten blick das es ein hardware oder ein sketch problem ist?

Auch das können wir so nicht sagen.
Kann beides sein.

Ich weiß nur, das der US-Sensor zusammen mit einem I2C-Display bei mir funktioniert.

Schönen guten Abend, ich bin der Techniker-Kollege :slight_smile:

wie Roschi schon berichtet hat funktioniert unser Code ohne das LCD und I2C ohne Probleme. Sobald wir den Code von Oben mit dem Hier unten erweitern, spinnt das ganze System, weder der Buzzer noch der LED-Strip funktioniert richtig. Vor allem ist bemerktbar das alles unheimlich langsam wird.

Doch sieht einfach mal selbst. Vielleicht könnt Ihr uns blutige Anfänger gleich aufklären :smiley:

hier der Sketch :smiley:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 LiquidCrystal_I2C lcd(0x3F,16,2);
 
#include <Adafruit_NeoPixel.h>
#define NUM_PIXEL 60                      // definierung der Anzahl der NeoPixels auf dem LED-Strip, 60 Stück auf 1 Meter
#define DATA_PIN 4                        // definierung des DATA_PIN vom LED-Strip auf Anschlussklemme vom Arduino

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXEL, DATA_PIN, NEO_GRB + NEO_KHZ800);       // Zugriff auf Datenbank von Adafruits_NeoPixel spezifiesche Daten von RGB

  #define trigPin 2                          // definierung des trigPin auf Anschlussklemme 2 vom Arduino
  #define echoPin 3                          // definierung des echoPin auf Anschlussklemme 3 vom Arduino
  #define led 4                              // definierung der LED auf Anschlussklemme 13 vom Arduino
  #define buzzer 5                           // definierung des Buzzers auf Anschlussklemme 12 vom Arduino
  
  int messung;
  int ergebnis;
 
  
  void setup() {

      lcd.begin();
      strip.begin();                          // starten der RGB-Strips im Aus-Zustand
      clearStrip();                           // funktion zum Ausschalten aller Angesprochenen RGB's
 
          
      pinMode(trigPin, OUTPUT);               // definierung des trigPin als Ausgangssignal
      pinMode(echoPin, INPUT);                // definierung des echoPin als Eingangssignal
      pinMode(led, OUTPUT);                   // definierung der LED als Ausgangssignal
      pinMode(buzzer,OUTPUT);                 // definierung des Buzzers als Ausgangssignals
  }

  void loop() {
      

      strip.setBrightness(150);               // Einstellung der Pixelhelligkeit, 0 = RGB dunkel / 255 = RGB volle Helligkeit
    
                                             
                                             
                                             //HC-SR4 abfrage
  
      digitalWrite(led, HIGH);
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      messung = pulseIn(echoPin, HIGH);
      ergebnis = (messung/2) / 29.1;
      digitalWrite(led, LOW);
      
      lcd.setCursor(0,0);
      lcd.print("Entfernung: ");
      lcd.setCursor(0,1);
      lcd.print(ergebnis);
      lcd.println(" cm");
      delay(500);
      
      
      

      
  if (ergebnis <= 52)                                 // hier kannst du einen individuellen Wert angeben
  {
  digitalWrite(buzzer, HIGH);
  delay(ergebnis*4);
  digitalWrite(buzzer, LOW);
  delay(ergebnis*4);
  }
  
                                        //Entfernung umlegen auf Strip

                                        
  int d = map(ergebnis - 20, 0, 100, NUM_PIXEL, 0 ); // (min entfernung, max entfernung, min Pixel, max Pixel)
    
    clearStrip();
    if (d >= 1)
    {
        for(uint16_t L = 0; L<d; L++) {
          if (L < 20)
          {
            strip.setPixelColor(L,strip.Color(0, 80, 0));
          }
          else if (L < 40)
          {
            strip.setPixelColor(L,strip.Color(150, 110, 0));
          }
          
          else 
          {
            strip.setPixelColor(L,strip.Color(150, 0, 0));
          }

        }
    }
  strip.show();                                 // Ausgabe auf Strip
  delay(100);
}



                                                    //Strip ablöschen

        void clearStrip(){
          
          for(int i = 0; i < NUM_PIXEL; i++) {
          strip.setPixelColor(i,0);
  

  }

}

Hi,
Du definierst die LED auf PIN 4, schreibst aber im Komentar " // definierung der LED auf Anschlussklemme 13 vom Arduino

Und Du definierst den Buzzer auf PIN 5, schreibst aber im Komentar "// definierung des Buzzers auf Anschlussklemme 12 vom Arduino

Wo sind den die LED und der BUZZER wirklich angeschlossen?

Ist Dein Strip wirklich 1M lang? soviel ich weiss, muss NUM_PIXEL die Anzahl der tatsächlich vorhandenen LED's auf dem Strip enthalten.

LG Stefan

Das Problem ist das delay(500) im LCD-Teil.
Das muss weg. Entweder ihr ersetzt es durch eine Funktion mit millis() oder ihr ruft die Anzeige-Routine nur alle 5 Sek. auf.
Dazu solltet ihr das Beispiel "BlinkWithoutDelay" ansehen.

Deltaflyer:
Hi,
Du definierst die LED auf PIN 4, schreibst aber im Komentar " // definierung der LED auf Anschlussklemme 13 vom Arduino

Und Du definierst den Buzzer auf PIN 5, schreibst aber im Komentar "// definierung des Buzzers auf Anschlussklemme 12 vom Arduino

Wo sind den die LED und der BUZZER wirklich angeschlossen?

Ist Dein Strip wirklich 1M lang? soviel ich weiss, muss NUM_PIXEL die Anzahl der tatsächlich vorhandenen LED's auf dem Strip enthalten.

LG Stefan

bitte die Kommis nicht beachten, diese sind nicht aktualliersiert ... die Pin-belegung entspricht der deklarierung im Sketch

ja der strip ist tätsächlich ein Meter lang und auf diesem Meter befinden sich 60 LED's und diese haben wir auch oben mit 60 deklariert ... Wir haben es ausgemssen und in der Aufbauphase auch kontrolliert in dem wird das Strip bündig zum US-Sensor gelegt haben und danach geschaut haben das es in gleicher entfernung angeht...

HotSystems:
Das Problem ist das delay(500) im LCD-Teil.
Das muss weg. Entweder ihr ersetzt es durch eine Funktion mit millis() oder ihr ruft die Anzeige-Routine nur alle 5 Sek. auf.
Dazu solltet ihr das Beispiel "BlinkWithoutDelay" ansehen.

wenn ich delay weglasse ändert das leider nichts an unserer Situation, ebenfall millis() ändert nix :frowning:

die Anzeigeroutine sollte in Echtzeit erfolgen... in 5 Sekunden kann eine Menge passieren, grad beim einparken

Ok, wenn Echtzeit notwendig ist, muss es bleiben.
Aber warum dann das delay ?

Wie lang ist das Kabel zum Display ?
Sind Pullup-Widerstände am I2C-Bus angeschlossen ?

Die Kabel zum Display sind keine 10 cm später wenn wir alles ordentlich verbauen sind sie maximal 20cm.

nein es sind keine Pullup-Widerstände angeschlossen. Kannst du mir das mit den Pullup-Widerstände erklären und wie ich die anschließen muss?

Je ein Widerstand 4,7 kOhm von Sda und Scl gegen VCC.

schalt mich auch mal wieder ein...
mich würde jetzt interessieren was es mit den widerständen genau auf sich hat.
in keinerlei tutorials bezüglich display mit i2c waren von widerständen die rede, warum brauchen wir jetzt welche in dieser schaltung, würd mich mal interessieren vom verständnis her.

Dann waren das die falschen Tutorials.
Lies hier mal.
I2C
Ob es mit den Pullups hilft, kann ich nicht sagen.
Aber ein Versuch ist es Wert.

Ich werde es heute Nacht gleich mal ausprobieren und morgen früh dann berichten.

Mal eine ganz andere Sache bezüglich Masse... Ich beziehe 9V mit Plus und Minus von meinem Netzteil und versorge damit den Arduino und meine LED's Strip. Meine Hardware bis auf mein Strip wird vom Arduino versorgt, muss ich dennoch eine Brücke zwischen GND vom Arduino und dem Minus vom Netzteil haben obwohl alles die selbe Spannungsversorgung hat?

Das hängt vom Strom ab, der fließt.
Ich würde sicherheitshalber den GND zusätzlich verbinden.

Aber jetzt gleich die Frage: Wird der Led-Stripe mit 5 oder 9 Volt betrieben ?
Wenn 5 Volt, wo kommen die her ?
Wenn Arduino, dann kann das zuviel sein.
Dann kommt noch der Strom des LCD noch dazu, das wird knapp.

Die 9 Volt (1500mA) kommen vom Netzteil. Dies schließe ich am Breadboard an und von dort aus Versorge ich den Arduino und der LED's Strip.

Ich bastel gerade ein Schaltbild ... lade es dann hoch um auch noch ein Optisches Verständnis zu gewährleisten. :slight_smile:

Die Leds mit 9 Volt ?

Ja laut Datenblatt mit 6-12V Versorgungsspannung (Gleichstrom)