.. note::

    Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

    **Warum beitreten?**

    - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.
    - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.
    - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.
    - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.
    - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

    👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei!

.. _3.1.10_c:

3.1.10 Morse-Code-Generator
================================

Einführung
-----------------

In diesem Projekt werden wir einen Morse-Code-Generator erstellen. Geben Sie eine Reihe von englischen Buchstaben in den Raspberry Pi ein, um sie als Morsecode darzustellen.

Benötigte Komponenten
------------------------------

Für dieses Projekt benötigen wir die folgenden Komponenten.

.. image:: ../img/3.1.10.png
    :align: center

Es ist definitiv praktisch, ein komplettes Kit zu kaufen. Hier ist der Link:

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - Name	
        - ARTIKEL IN DIESEM KIT
        - LINK
    *   - Raphael Kit
        - 337
        - |link_Raphael_kit|

Sie können sie auch einzeln über die folgenden Links kaufen.

.. list-table::
    :widths: 30 20
    :header-rows: 1

    *   - KOMPONENTENBESCHREIBUNG
        - KAUF-LINK

    *   - :ref:`cpn_gpio_board`
        - |link_gpio_board_buy|
    *   - :ref:`cpn_breadboard`
        - |link_breadboard_buy|
    *   - :ref:`cpn_wires`
        - |link_wires_buy|
    *   - :ref:`cpn_resistor`
        - |link_resistor_buy|
    *   - :ref:`cpn_led`
        - |link_led_buy|
    *   - :ref:`cpn_buzzer`
        - \-
    *   - :ref:`cpn_transistor`
        - |link_transistor_buy|

Schaltplan
-----------------------

============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO17       Pin 11   0        17
GPIO22       Pin 15   3        22
============ ======== ======== ===

.. image:: ../img/Schematic_three_one11.png
   :align: center

Experimentelle Verfahren
----------------------------

**Schritt 1:** Bauen Sie den Schaltkreis auf. (Achten Sie auf die Pole des Buzzers:
Das + Zeichen kennzeichnet den positiven Pol, der andere den negativen.)

.. image:: ../img/image269.png

**Schritt 2**: Öffnen Sie die Code-Datei.

.. raw:: html

   <run></run>

.. code-block:: 

    cd ~/raphael-kit/c/3.1.10/

**Schritt 3**: Kompilieren Sie den Code.

.. raw:: html

   <run></run>

.. code-block:: 

    gcc 3.1.10_MorseCodeGenerator.c -lwiringPi

**Schritt 4**: Führen Sie die oben genannte ausführbare Datei aus.

.. raw:: html

   <run></run>

.. code-block:: 

    sudo ./a.out

Nachdem das Programm ausgeführt wurde, geben Sie eine Reihe von Zeichen ein, und der Buzzer sowie die LED senden die entsprechenden Morsecode-Signale.

.. note::

    Wenn es nach dem Starten nicht funktioniert oder eine Fehlermeldung angezeigt wird: \"wiringPi.h: Datei oder Verzeichnis nicht gefunden\", beziehen Sie sich bitte auf :ref:`install_wiringpi`.

**Code-Erklärung**

.. code-block:: c

    struct MORSE{
        char word;
        unsigned char *code;
    };

    struct MORSE morseDict[]=
    {
        {'A',"01"}, {'B',"1000"}, {'C',"1010"}, {'D',"100"}, {'E',"0"}, 
        {'F',"0010"}, {'G',"110"}, {'H',"0000"}, {'I',"00"}, {'J',"0111"}, 
        {'K',"101"}, {'L',"0100"}, {'M',"11"}, {'N',"10"}, {'O',"111"}, 
        {'P',"0110"}, {'Q',"1101"}, {'R',"010"}, {'S',"000"}, {'T',"1"},
        {'U',"001"}, {'V',"0001"}, {'W',"011"}, {'X',"1001"}, {'Y',"1011"}, 
        {'Z',"1100"},{'1',"01111"}, {'2',"00111"}, {'3',"00011"}, {'4',"00001"}, 
        {'5',"00000"},{'6',"10000"}, {'7',"11000"}, {'8',"11100"}, {'9',"11110"},
        {'0',"11111"},{'?',"001100"}, {'/',"10010"}, {',',"110011"}, {'.',"010101"},
        {';',"101010"},{'!',"101011"}, {'@',"011010"}, {':',"111000"}
    };

Diese Struktur MORSE ist das Wörterbuch des Morse-Codes und enthält
Buchstaben A-Z, Zahlen 0-9 und Zeichen “?” “/” “:” “,” “.” “;” “!” “@”.

.. code-block:: c

    char *lookup(char key,struct MORSE *dict,int length)
    {
        for (int i=0;i<length;i++)
        {
            if(dict[i].word==key){
                return dict[i].code;
            }
        }    
    }

Die Funktion ``lookup()`` funktioniert durch "Nachschlagen im Wörterbuch". Definieren Sie
einen ``key``, suchen Sie nach denselben Wörtern wie ``key`` in der Struktur ``morseDict``
und geben Sie die entsprechende Information - den ``code`` des bestimmten
Worts zurück.

.. code-block:: c

    void on(){
        digitalWrite(ALedPin,HIGH);
        digitalWrite(BeepPin,HIGH);     
    }

Erstellen Sie eine Funktion ``on()``, um den Summer und die LED zu starten.

.. code-block:: c

    void off(){
        digitalWrite(ALedPin,LOW);
        digitalWrite(BeepPin,LOW);
    }

Die Funktion ``off()`` schaltet den Summer und die LED aus.

.. code-block:: c

    void beep(int dt){
        on();
        delay(dt);
        off();
        delay(dt);
    }

Definieren Sie eine Funktion ``beep()``, damit der Summer und die LED in einem bestimmten Intervall von **dt** Töne abgeben
und blinken.

.. code-block:: c

    void morsecode(char *code){
        int pause = 250;
        char *point = NULL;
        int length = sizeof(morseDict)/sizeof(morseDict[0]);
        for (int i=0;i<strlen(code);i++)
        {
            point=lookup(code[i],morseDict,length);
            for (int j=0;j<strlen(point);j++){
                if (point[j]=='0')
                {
                    beep(pause/2);
                }else if(point[j]=='1')
                {
                    beep(pause);
                }
                delay(pause);
            }
        }
    }

Die Funktion ``morsecode()`` wird verwendet, um den Morse-Code der eingegebenen
Zeichen zu verarbeiten, indem das „1“ des Codes ständig Töne oder Licht abgibt
und das „0“ kurz Töne oder Licht aussendet, z.B., Eingabe „SOS“, und es
gibt ein Signal, das drei kurze, drei lange und dann drei kurze Segmente enthält „· · · - - - · · ·”.

.. code-block:: c

    int toupper(int c)
    {
        if ((c >= 'a') && (c <= 'z'))
            return c + ('A' - 'a');
        return c;
    }
    char *strupr(char *str)
    {
        char *orign=str;
        for (; *str!='\0'; str++)
            *str = toupper(*str);
    return orign;
    }

Bevor Sie den Code schreiben, müssen Sie die Buchstaben zu Großbuchstaben vereinheitlichen.

.. code-block:: c

    void main(){
        setup();
        char *code;
        int length=8;
        code = (char*)malloc(sizeof(char)*length);
        while (1){
            printf("Please input the messenger:");
            scanf("%s",code);
            code=strupr(code);
            printf("%s\n",code);
            morsecode(code);
        }
    }

Wenn Sie die entsprechenden Zeichen mit der Tastatur eingeben,
wird ``code=strupr(code)`` die eingegebenen Buchstaben in ihre Großbuchstabenform umwandeln.

``Printf()`` druckt dann den Klartext auf den Computerbildschirm, und die
Funktion ``morsecod()`` lässt den Summer und die LED Morse-Code aussenden.

Beachten Sie, dass die Länge des eingegebenen Zeichens die
**Länge** (kann revidiert werden) nicht überschreiten darf.

Phänomen-Bild
-----------------------

.. image:: ../img/image270.jpeg
   :align: center