Antriebs-Zahnriemenraeder


Google-Suche auf MEINE-SCHALTUNG.de :





Online Rechner

Chronik

Dauerkalender


Dimmer mit Ultraschall

(Serielle Kommunikation mit ESP32)

In dem folgenden Versuch wird eine Leuchtdiode, die an den Mikrocontroller ESP32 angeschlossen wird, mithilfe eines Ultraschallsensors gedimmt. Bei dem Ultraschall handelt es sich um einen Sensor, dessen Auswertungselektronik die Messdaten über serielle Schnittstelle senden kann. Der Mikrocontroller muss die ankommenden Daten auslesen und entsprechend auswerten. Die Helligkeit der Leuchtdiode wird von der Entfernung eines Gegenstandes von dem Sensor abhängen. Das Dimmen wird mit einem PWM-Signal realisiert. Anstatt einer Leuchtdiode könnte man auf diese Weise z.B. eine Wasserpumpe ansteuern und mit dem Ultraschallsensor das Wasserniveau in einem Behälter regeln.

ESP32

Mikrocontroller ESP32

Mikrocontroller ESP32.
Der Mikrocontroller ESP32 stellt drei seriellen Schnittstellen zur Verfügung. In dem Versuch kommt die Schnittstelle U2 zum Einsatz. Die zuständigen Anschlüsse sind die GPIO16 und GPIO17.

ESP32

Ultraschall mit SR04M-2

Ultraschall-Sensor

Ultraschall-Sensor

Den Sensor zusammen mit dem zugehörigen Elektronikmodul SR04M-2 konnte man bei zahlreichen Internet-Shops für ca. 10 Euro erwerben. Der Ultraschallsensor ist wasserdicht, funktioniert jedoch unter Wasser nicht. Die Angaben über messbare Entfernung weichen voneinander ab. Der minimale Abstand beträgt ca. 20-25 cm. Die maximale Entfernung pendelt zwischen 2 m und 4,5 m. Das Verbindungskabel hat eine Länge von 2,5 m.

SR04M-2 Frontansicht

SR04M-2 Frontansicht (Pfeil: Jumper Stelle zur Einstellung der Betriebsmodi)

SR04M-2 Rückseite

SR04M-2 (Rückseite)

Das Modul SR04M-2 sieht ähnlich aus wie JSN-SR04T -2 oder AJ-SR04M. Die Versorgungsspannung beträgt 5VDC, der Stromverbrauch liegt bei 5 mA bis 30 mA. Erfassungsbereich des Abtastsensors beträgt weniger als 50°. Arbeitstemperatur liegt im Bereich -10 °C bis 70°C. Kommunikation erfolgt über die Methode Trigger/Echo oder seriell mit RX/TX. Die Baudrate beträgt 9600,n,8,1.
Das Modul stellt drei Betriebsmodi zur Verfügung. Sie können mit dem Jumper, der sich neben den Pins befindet, eingestellt werden. Auf anderen Modulen findet man neben dem Jumper die Bezeichnung R19 oder R27.
Im Auslieferungszustand ist der Jumper offen. Damit ist der erste Modus (Trigger / Echo) aktiv. Den zweiten Modus erreicht man, indem man an der Stelle einen 47 kOhm Widerstand anlötet. In dem Modus sendet das Modul alle 100 ms die Messdaten. Die Daten werden seriell übermittelt. Die Distanz (16 Bit) wird in Millimeter angegeben.
Das Daten-Paket besteht aus vier Bytes:
1. Startbyte: 0xFF (255)
2. Distanz H-Byte
3. Distanz L_Byte
4. Quersumme (L-Byte)
In dem dritten Modus empfängt man die Daten genauso wie im zweiten Modus. Sie werden allerdings erst auf Nachfrage gesendet. Eine Messung wird durch Senden einer 0x55 gestartet. Der dritte Modus wird durch Anlöten eines 120 kOhm Widerstandes aktiviert.

Levelkonverter

Levelkonverter

Levelkonverter.
Mit dem Levelkonverter werden die 5V-Signale des Ultraschallmoduls an die 3,3V Signale des ESP32 angepasst.

Der Schaltplan

Schaltplan

Schaltplan

Die Testschaltung

Testschaltung

Testschaltung

Das Programm (ESP32)

// ***********************************************************************************************
// Dimmer mit Ultraschall
// Serielle Kommunikation mit ESP32
// ESP32 Sketch
// Arduino IDE 1.8.19
// **********************************************************************************************

#define RX2_Pin 16                                         // Serielle Schnittstelle 2 RX: GPIO 16
#define TX2_Pin 17                                         // Serielle Schnittstelle 2 TX: GPIO 17
#define LED_Pin 23                                         // GPIO 23 für Leuchtdiode
#define PWM_Kanal 0                                        // PWM Parameter
#define Frequenz 5000
#define Aufloesung 8
int Messwert_Tabelle [10];

void setup() {

    Serial.begin(9600);                                                 // Serial initialisieren
    Serial2.begin(9600, SERIAL_8N1, RX2_Pin, TX2_Pin);                  // Serial 2 initialisieren
    ledcSetup (PWM_Kanal, Frequenz, Aufloesung);                        // Kanal Parameter
    ledcAttachPin (23, PWM_Kanal);                                      // LED an GPIO 23
}
// ***********************************************************************************************

void loop() {                                                           // Hauptprogramm
  
    if (Serial2.available()){                                           // Daten vorhanden
        int Entfernung;                                                 // Entfernung in mm
        byte Puffer [3];                                                // Puffer-Variable
        byte Start_Byte = (byte)Serial2.read();                         // Startwert
        if (Start_Byte == 255){                                        
            Serial2.readBytes(Puffer, 3);                               // Puffer laden
            Entfernung = (Puffer [0]<<8) + Puffer [1];                  // Berechnung der Distanz
            byte QS = ((Start_Byte + Puffer [0] + Puffer [1])&0xFF);    // Quersumme
            if (QS == Puffer [2]) {                                     // Quersumme OK?
                Serial.print("Entfernung = ");                          // Serieller Monitor
                Serial.print(Entfernung);                               // -"-
                int PWM_Wert = (1.27 * Entfernung) - 266;               // LED Helligkeit
                if (PWM_Wert > 255) { PWM_Wert = 255; }                 // PWM Max
                if (PWM_Wert < 0) { PWM_Wert = 0; }                     // PWM min

                int Messwert_Gesamt = 0;                                // Mittelwert (Bei Bedarf)
                for (int i=9; i>0; i--) {
                  Messwert_Tabelle [i] = Messwert_Tabelle [i-1];
                  Messwert_Gesamt = Messwert_Gesamt + Messwert_Tabelle [i];
                }
                Messwert_Tabelle [0] = PWM_Wert;
                Messwert_Gesamt = (Messwert_Gesamt + PWM_Wert) / 10;
                              
                Serial.print("  LED Helligkeit = ");                    // Serieller Monitor
                Serial.println(Messwert_Gesamt);                        // -"-
                ledcWrite(PWM_Kanal, Messwert_Gesamt);                  // Leuchtdiode dimmen
            }
        } 
    }
} 
// ***********************************************************************************************     
  

Bei der Skalierung der Werte kann die Formel auf folgender Seite behilflich sein:

E-Rechner: Werte Skalierung


Kurzvideo

Kurzvideo


Weitere Themen:



Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz