Startseite bisherige Projekte Tools/Snippets Bücherempfehlungen Publikationen Impressum Datenschutzerklärung

Raspberry Morse-Server

Oktober 2022


Hör mal was da piept.
Nachrichten können über einen einfachen Python-Server im Morse-Code ausgegeben werden. Als Hilfe zum Code-Lernen gibt es ein Display mit Anzeige der Zeichen.



(Widerstände sind 1KΩ, der Transistor ist ein 8050 NPN-Transistor, der Buzzer ist aktiv und der Taster ist ... ein Taster)


Das Python-Programm dazu (benötigt noch ein paar Bibliotheken):

import RPi.GPIO as GPIO # for buzzer
import time
import os
import math

from PCF8574 import PCF8574_GPIO  # for lcd
from Adafruit_LCD1602 import Adafruit_CharLCD # for lcd
from http.server import BaseHTTPRequestHandler, HTTPServer # for webserver
from urllib.parse import urlparse, parse_qs # for webserver

buzzerpin = 11
buttonpin = 33

MORSE_CODE_DICT = { 'A':'.-', 
                    'B':'-...',
                    'C':'-.-.', 
                    'D':'-..', 
                    'E':'.',
                    'F':'..-.', 
                    'G':'--.', 
                    'H':'....',
                    'I':'..', 
                    'J':'.---', 
                    'K':'-.-',
                    'L':'.-..', 
                    'M':'--', 
                    'N':'-.',
                    'O':'---', 
                    'P':'.--.', 
                    'Q':'--.-',
                    'R':'.-.', 
                    'S':'...', 
                    'T':'-',
                    'U':'..-', 
                    'V':'...-', 
                    'W':'.--',
                    'X':'-..-', 
                    'Y':'-.--', 
                    'Z':'--..',
                    '1':'.----', 
                    '2':'..---', 
                    '3':'...--',
                    '4':'....-', 
                    '5':'.....', 
                    '6':'-....',
                    '7':'--...', 
                    '8':'---..', 
                    '9':'----.',
                    '0':'-----', 
                    ', ':'--..--', 
                    '.':'.-.-.-',
                    '?':'..--..', 
                    '/':'-..-.', 
                    '-':'-....-',
                    '(':'-.--.', 
                    ')':'-.--.-'}

def kurz():
    GPIO.output(buzzerpin, GPIO.HIGH)
    time.sleep(0.1)
    GPIO.output(buzzerpin, GPIO.LOW)

def lang():
    GPIO.output(buzzerpin, GPIO.HIGH)
    time.sleep(0.5)
    GPIO.output(buzzerpin, GPIO.LOW)

def warte_kurz():
    time.sleep(0.3)

def warte_lang():
    time.sleep(0.3)

def morse_ausgabe(code):

    for a in code:
        if a == '.':
            kurz()
            warte_kurz()
        elif a == '-':
            lang()
            warte_kurz()
        else:
            warte_lang()

    warte_lang()

def ausgabe(text):
    for letter in text.upper():
        if letter in MORSE_CODE_DICT:
            code = MORSE_CODE_DICT[letter]
            lcd.setCursor(0,0)  # set cursor position
            lcd.clear()
            lcd.message(code + " " + letter)
            morse_ausgabe(code);
    lcd.clear()
    lcd.setCursor(0,0)  # set cursor position
    lcd.message(text)
    
def handle_button(arg):
    print("Button pressed")
    GPIO.cleanup()
    #quit()
    os.system("shutdown now")

# Server helper class
class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        query_components = parse_qs(urlparse(self.path).query)
        if "msg" in query_components:
            msg = query_components["msg"] 
            ausgabe(msg[0])

        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        text = """
        <html>
            <head><title>Nachricht</title></head>
            <body>
                <form action="">
                    <label for="msg">Nachricht:</label><br>
                    <input type="text" id="msg" name="msg"><br>
                    <input type="submit">
                </form>
            </body>
        </html>
        """
        self.wfile.write(bytes(text, "utf-8"))


# Init stuff
# Buzzer
GPIO.setmode(GPIO.BOARD)
GPIO.setup(buzzerpin, GPIO.OUT)

GPIO.setup(buttonpin, GPIO.IN, GPIO.PUD_DOWN)
GPIO.add_event_detect(buttonpin, GPIO.FALLING, callback=handle_button, bouncetime=300)

# 1602 Display
PCF8574_address = 0x27  # I2C address of the PCF8574 chip.
PCF8574A_address = 0x3F  # I2C address of the PCF8574A chip.
# Create PCF8574 GPIO adapter.
try:
    mcp = PCF8574_GPIO(PCF8574_address)
except:
    try:
        mcp = PCF8574_GPIO(PCF8574A_address)
    except:
        print ('I2C Address Error !')
        exit(1)
# Create LCD, passing in MCP GPIO adapter.
lcd = Adafruit_CharLCD(pin_rs=0, pin_e=2, pins_db=[4,5,6,7], GPIO=mcp)

mcp.output(3,1)     # turn on LCD backlight
lcd.begin(16,2)     # set number of LCD lines and columns

# Init server

lcd.clear()
lcd.setCursor(0,0)  # set cursor position
lcd.message("Starting Server")

#hostName = "localhost"
hostName = "0.0.0.0"
serverPort = 8080

if __name__ == "__main__":        
    webServer = HTTPServer((hostName, serverPort), MyServer)
    print("Server started http://%s:%s" % (hostName, serverPort))

    try:
        webServer.serve_forever()
    except KeyboardInterrupt:
        pass

    webServer.server_close()
    print("Server stopped.")

GPIO.cleanup()




Impressum - Datenschutzerklärung