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()