ich möchte euch mein erstes Projekt vorstellen, daß über einen 6 Zeiler hinausgeht. Eine Antenne die über einen Servo von einen Python Progamm per TCP/IP gesteuert wird.
Das Programm zeigt eine Weltkarte (bzw. eine lokale Karte) mit einem zweifarbigen Strich, der die Hauptempfangsrichtung darstellt.
Mit Rechtsklick wählt man den Heimatort und mit Linksklick den Zielort. Sofort dreht der Servo die Antenne in die gewünschte Richtung.
Eine Loop-Antenne ist bidirektional, so das die Antenne nur um 180 Grad gedreht werden muss.
Ich habe lange an dem Projekt geabeitet (fast ein dreiviertel Jahr), und habe dabei vieles über Python und Micropython gelernt. Aber längst nicht alles.
Vieles muss noch geändert werden, ich glaube das Projekt wird niemals fertig. Ideen habe ich noch genug.
Auch an gängige Konventionen habe ich mich noch nicht gehalten. Aber habe hier schon viel darüber gelesen. Verzeihung!
Das komplette Programm liegt als "antenne-esp8266.zip" auf filehorst.de. Bitte die LIESMICH.TXT lesen.
Datei von filehorst.de laden
ich freue mich schon auf eure Kommentare.
Bernd
Code: Alles auswählen
# Importieren u. initialisieren der Pygame-Bibliothek
import pygame
import math
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.178.100', 50011))
pygame.init()
# Ort, Ziel, und Grat lesen aus Datei
datei = open("ort.txt", "r")
x_ort = datei.readline()
y_ort = datei.readline()
v_ort = datei.readline()
w_ort = datei.readline()
g_rad = datei.readline()
quad = datei.readline()
grad = datei.readline()
xpo = datei.readline()
ypo = datei.readline()
x_heimat = int(x_ort.strip())
y_heimat = int(y_ort.strip())
v_ziel = int(v_ort.strip())
w_ziel = int(w_ort.strip())
winkel = float(g_rad.strip())
quadrant = int(quad.strip())
grad = str(grad.strip())
datei.close()
# Variablen/KONSTANTEN setzen
B, H = 1280, 766
LINKE_MAUSTASTE = 1
RECHTE_MAUSTASTE = 3
MITTLERE_MAUSTASTE = 2
FPS = 30
GRAU = (155, 155, 155)
spielaktiv = True
# Definieren und Öffnen eines neuen Fensters
pfeil = pygame.image.load("bilder/pfeil2.png")
strich1 = pygame.image.load("bilder/strich1.png")
strich2 = pygame.image.load("bilder/strich2.png")
hintergrund = pygame.image.load("bilder/welt_gross.png")
fenster = pygame.display.set_mode((B, H))
clock = pygame.time.Clock()
# Funktion zum Grafiken rotieren und zentrieren
def rotieren_zentrieren(x, y, strich, winkel):
# rotieren und in einem neuen "surface" speichern
rotiert = pygame.transform.rotate(strich, winkel * -1)
# Bestimmen der neuen Abmessungen (nach Rotation ändern sich diese!)
groesse = rotiert.get_rect()
# Ausgabe
fenster.blit(rotiert, (x - groesse.center[0], y - groesse.center[1]))
def speichern():
# öffnen der Datei "neu/ort.txt"
# umwandeln der Zahl in ein String, schreiben in die Datei,
# hinzufügen einer neuen Zeile
datei = open("ort.txt", "w")
datei.write(str(x_heimat))
datei.write("\n")
datei.write(str(y_heimat))
datei.write("\n")
datei.write(str(v_ziel))
datei.write("\n")
datei.write(str(w_ziel))
datei.write("\n")
datei.write(str(winkel))
datei.write("\n")
datei.write(str(quadrant))
datei.write("\n")
datei.write(str(grad))
datei.write("\n")
# speichern und schließen
datei.close()
return ()
# Dreieck berechnen und Quadranten rausfinden
def dreieck(x_heimat, y_heimat, v_ziel, w_ziel):
global bereich, hoehe_dreieck
if x_heimat == v_ziel:
v_ziel = v_ziel + 0.001
if y_heimat == w_ziel:
w_ziel = w_ziel + 0.001
if v_ziel > x_heimat and w_ziel < y_heimat:
bereich = 1
strecke_b = v_ziel - x_heimat
hoehe_dreieck = y_heimat - w_ziel
elif v_ziel < x_heimat and w_ziel < y_heimat:
bereich = 2
strecke_b = x_heimat - v_ziel
hoehe_dreieck = y_heimat - w_ziel
elif v_ziel < x_heimat and w_ziel > y_heimat:
bereich = 3
strecke_b = x_heimat - v_ziel
hoehe_dreieck = w_ziel - y_heimat
elif v_ziel > x_heimat and w_ziel > y_heimat:
bereich = 4
strecke_b = v_ziel - x_heimat
hoehe_dreieck = w_ziel - y_heimat
a2 = hoehe_dreieck * hoehe_dreieck
b2 = strecke_b * strecke_b
c2 = (strecke_b * strecke_b) + (hoehe_dreieck * hoehe_dreieck)
hypotenuse = math.sqrt(c2)
a1 = math.asin((b2 + c2 - a2) / (2 * strecke_b * hypotenuse))
b1 = math.asin((a2 + c2 - b2) / (2 * hoehe_dreieck * hypotenuse))
alpha = math.degrees(a1) # Bereich 1 und 3
beta = math.degrees(b1) # Bereich 2 und 4
if v_ziel > x_heimat and w_ziel < y_heimat:
return (alpha, bereich)
elif v_ziel < x_heimat and w_ziel < y_heimat:
return (beta + 270, bereich)
elif v_ziel < x_heimat and w_ziel > y_heimat:
return (alpha + 180, bereich)
elif v_ziel > x_heimat and w_ziel > y_heimat:
return (beta + 90, bereich)
# Schleife Hauptprogramm
while spielaktiv:
# Überprüfen, auf eine Aktion
for event in pygame.event.get():
if event.type == pygame.QUIT:
speichern()
spielaktiv = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_F1:
hintergrund = pygame.image.load("bilder/welt_gross.png")
if event.key == pygame.K_F2:
hintergrund = pygame.image.load("bilder/welt_mittel.png")
if event.key == pygame.K_F3:
hintergrund = pygame.image.load("bilder/welt_klein.png")
# Mausabfrage
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == LINKE_MAUSTASTE:
v_ziel, w_ziel = pygame.mouse.get_pos()
speichern()
winkel, quadrant = dreieck(x_heimat, y_heimat, v_ziel, w_ziel)
grad = round(winkel)
speichern()
servo = grad
print (servo)
if servo > 180 :
servo = servo -180
msg = str(servo)
msg = msg.encode()
s.send (msg)
msg = s.recv(1024)
msg = msg.decode()
print("Serverantwort: " + msg)
if event.button == RECHTE_MAUSTASTE:
x_heimat, y_heimat = pygame.mouse.get_pos()
speichern()
# Programmfenster Füllen
#fenster.fill(GRAU)
# Bilder zeichnen, Überschrift schreiben
fenster.blit(hintergrund, (0, 0))
fenster.blit(pfeil, (v_ziel, w_ziel))
pygame.display.set_caption("Antennen-Richtung: "
+ str(grad) + " Grad ")
# rotieren(x_heimat, y_heimat, strich, winkel)
# und den rot-blauen bzw. blau-roten Strich setzen.
if winkel > 180 and winkel < 360:
strich = strich2
elif winkel < 180 and winkel >= 0:
strich = strich1
rotieren_zentrieren(x_heimat, y_heimat, strich , winkel)
# Fenster aktualisieren
pygame.display.flip()
clock.tick(FPS)
pygame.quit()
s.close()