diff --git a/make_chart_from_csv.py b/make_chart_from_csv.py
new file mode 100644
index 0000000000000000000000000000000000000000..a9b03957bb2402596256afe7941f0e9cfe439125
--- /dev/null
+++ b/make_chart_from_csv.py
@@ -0,0 +1,243 @@
+#!/bin/python3
+
+
+## Lizenz GPLv3
+## 2021, eschreiter
+
+## Program to read from csv files and show/create 2D and/or 3D charts and views from the data
+# [ ] use parameters to choose csv file
+# [v] use date/time from csv-file to create filenames for charts
+# [v] heatmap output
+
+
+#import visa
+from time import sleep
+import logging
+import numpy as np  # python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose
+import matplotlib.pyplot as plt  # python -mpip install -U matplotlib
+from mpl_toolkits.axes_grid1 import host_subplot
+import os
+import datetime
+import csv
+
+now = str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
+
+path = './'  # Pfad zum Speicherort
+subdir = now  # Unterordner pro Messung?, leer wenn nicht benötigt
+
+logging.basicConfig(format='%(asctime)s %(message)s')
+logging.basicConfig(filename='log.txt', level=logging.DEBUG)
+logging.info("START")
+
+
+csv_Dateiname = get_youngest_file_in_folder()
+print("Dteiname: ", csv_Dateiname)
+
+
+
+def Filter_liste(liste, suchtext):
+    # Sucht in einer Liste nach Dateien mit der Endung 'suchtext'
+    # z.B. Filter_liste(['datei.jpg','datei.txt'],'txt')
+    import os
+    neue_liste = list()
+    for eintrag in liste:
+        # Eintrag als Dateiname interpretieren, Endung ist Ende nach letzten Punkt
+        filename, file_extension = os.path.splitext(eintrag)
+        if suchtext in file_extension:
+            neue_liste.append(eintrag)
+    return neue_liste
+
+
+def get_youngest_file_in_folder():
+    ## Dateiname festlegen und öffnen
+    # jüngste brd Datei im aktuellen Verzeichnis wählen#
+    import os
+    verzeichnis = os.getcwd()
+    Inhalt_Pfad = os.listdir(verzeichnis)
+    Dateien_csv = Filter_liste(Inhalt_Pfad, "csv")
+    time = 0
+    file = ""
+
+    for Eintrag in Dateien_csv:
+        time_Eintrag = os.stat(Eintrag).st_mtime
+        if time == 0:
+            time = os.stat(Eintrag).st_mtime
+            file = Eintrag
+        if time_Eintrag > time:
+            time = time_Eintrag
+            file = Eintrag
+        # print(os.stat(Eintrag).st_mtime)
+    return file
+
+
+
+def schreibe_Messwerte_in_Datei(Dateiname, Messwerte, Liste_Winkel):
+    with open(Dateiname, 'w', newline='') as csvfile:
+        Messwerte_writer = csv.writer(csvfile, delimiter=';',
+                                      quotechar='\"', quoting=csv.QUOTE_MINIMAL)
+
+        # Messwerte_writer = csv.writer(csvfile, dialect='excel')
+        # Messwerte_writer.writerows(['Spam'] * 5 + ['Baked Beans'])
+        # Messwerte_writer.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
+        Spaltennamen = ""
+
+        Messwerte_writer.writerow(["Messung vom ", now])
+        Messwerte_writer.writerow("")
+        Messwerte_writer.writerow(["Gemessene Winkel in Grad"])
+        Messwerte_writer.writerow(Liste_Winkel)
+        Messwerte_writer.writerow("")
+        Messwerte_writer.writerow(["Hz", "s21", "rad", "s21", "rad", "..."])
+        Messwerte_writer.writerow(
+            ["Frequenz", "Betrag_Winkel1", "Phase_Winkel1", "Betrag_Winkel2", "Phase_Winkel2", "..."])
+        Messwerte_writer.writerows(Messwerte)
+
+def lies_Messwerte_aus_Datei(Dateiname):
+    global now
+    timestamp = now
+    with open(Dateiname, 'r', newline='') as csvfile:
+        Messwerte_reader = csv.reader(csvfile, delimiter=';',
+                                      quotechar='\"', quoting=csv.QUOTE_MINIMAL)
+
+        # Messwerte_writer = csv.writer(csvfile, dialect='excel')
+        # Messwerte_writer.writerows(['Spam'] * 5 + ['Baked Beans'])
+        # Messwerte_writer.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
+        Spaltennamen = ""
+        Zeile =  Messwerte_reader.__next__()
+        timestamp = str(Zeile[1])
+        print("Datum der eingelesenen Messung: ", timestamp) #MessungMesswerte_writer.writerow(["Messung vom ", now])
+        Messwerte_reader.__next__() # Messwerte_writer.writerow("")
+        Messwerte_reader.__next__() # Messwerte_writer.writerow(["Gemessene Winkel in Grad"])
+        Liste_Winkel = np.array(Messwerte_reader.__next__()).astype(np.float32) #Messwerte_writer.writerow(Liste_Winkel)
+        Messwerte_reader.__next__() #Messwerte_writer.writerow("")
+        Messwerte_reader.__next__() #Messwerte_writer.writerow(["Hz", "s21", "rad", "s21", "rad", "..."])
+        Messwerte_reader.__next__() #Messwerte_writer.writerow(
+            #["Frequenz", "Betrag_Winkel1", "Phase_Winkel1", "Betrag_Winkel2", "Phase_Winkel2", "..."])
+        Messwerte = np.array(Messwerte_reader.__next__()).astype(np.float32)
+        print("Messwerte: ", Messwerte[0:10])
+        Anzahl_in_Zeile = len(Messwerte)
+        print(Anzahl_in_Zeile)
+        for row in Messwerte_reader:
+            Messwerte = np.row_stack((Messwerte, np.array(row).astype(np.float32)))
+            #Messwerte.append(row) #Messwerte_writer.writerows(Messwerte)
+    print("Shape Messwerte: ", Messwerte.shape)
+    print("Shape Liste_Winkel: ", Liste_Winkel.shape)
+    return Messwerte, Liste_Winkel, timestamp
+
+
+
+def finde_index_fuer_Frequenz(Ziel_Frequenzen_MHz, Messwerte):
+    Frequenzen = Messwerte[:, 0]
+    indizes = list()
+    for Ziel_Frequenz in Ziel_Frequenzen_MHz:
+        indizes.append(np.argmin(abs(Frequenzen - (1000000 * Ziel_Frequenz))))
+        # print(indizes)
+        logging.info("Index für Frequenz %s Hz ist %s" % (Ziel_Frequenz, indizes[-1]))
+    return indizes
+
+
+def erstelle_Diagramm(Zeile, Liste_Winkel):
+    global timestamp
+    Daempfung = Zeile[1::2]  # jedes 2. Element ab dem zweiten
+    Frequenz = Zeile[0]
+    Frequenz_MHz = Frequenz / 1000000.0
+    Liste_Winkel_rad = Liste_Winkel / 180.0 * np.pi
+    plt.figure(figsize=(10, 10), dpi=100)
+    Bildname = os.path.join(path, timestamp + "_" + str(Frequenz) + '.png')
+    plt.polar(Liste_Winkel_rad, Daempfung, label="Pattern", color='blue')
+    plt.title('Frequenz %s MHz' % str(Frequenz_MHz))
+    plt.savefig(Bildname)
+    logging.info("Bild für %s MHz gespeichert." % str(int(Frequenz_MHz)))
+    # plt.show()
+    plt.close()
+
+
+def erstelle_Diagramm_dB(Zeile, Liste_Winkel):
+    global  timestamp
+    Daempfung = Zeile[1::2]  # jedes 2. Element ab dem zweiten
+    Daempfung = 10 * np.log10(Daempfung)
+    Frequenz = Zeile[0]
+    Frequenz_MHz = Frequenz / 1000000.0
+    Liste_Winkel_rad = Liste_Winkel / 180.0 * np.pi
+    plt.figure(figsize=(10, 10), dpi=100)
+    Bildname = os.path.join(path, timestamp + "_" + str(Frequenz) + '_dB.png')
+    plt.polar(Liste_Winkel_rad, Daempfung, label="Pattern", color='blue')
+    plt.title('Frequenz %s MHz' % str(Frequenz_MHz))
+    plt.savefig(Bildname)
+    logging.info("Bild für %s MHz gespeichert." % str(int(Frequenz_MHz)))
+    # plt.show()
+    plt.close()
+
+def heatmap(Messwert):
+
+    import seaborn as sns #pip install seaborn
+    global Liste_Winkel, timestamp
+    plt.figure(figsize=(10, 10), dpi=100)
+    Bildname = os.path.join(path, timestamp + '_Heatmap.png')
+    ax = sns.heatmap(Messwert)#, linewidth=0.5)
+    plt.title("Dämpfung über Frequenz und Winkel")
+    plt.xlabel("Winkel in Grad")
+    plt.ylabel("Frequenz in MHz")
+    ax.set_xticklabels(Liste_Winkel[0::2])
+    ax.set_yticklabels(Messwerte[0::8,0]/1000000)
+    plt.savefig(Bildname)
+    #logging.info("Bild für %s MHz gespeichert." % str(int(Frequenz_MHz)))
+    #plt.show()
+    plt.close()
+
+
+def heatmap_dB(Messwert):
+
+    import seaborn as sns #pip install seaborn
+    global Liste_Winkel, timestamp
+    plt.figure(figsize=(10, 10), dpi=100)
+    Bildname = os.path.join(path, timestamp + '_Heatmap_dB.png')
+    ax = sns.heatmap(10 * np.log10(Messwert))#, linewidth=0.5)
+    plt.title("Dämpfung in dB über Frequenz und Winkel")
+    plt.xlabel("Winkel in Grad")
+    plt.ylabel("Frequenz in MHz")
+    ax.set_xticklabels(Liste_Winkel[0::2])
+    ax.set_yticklabels(Messwerte[0::8,0]/1000000)
+    plt.savefig(Bildname)
+    #logging.info("Bild für %s MHz gespeichert." % str(int(Frequenz_MHz)))
+    #plt.show()
+    plt.close()
+
+
+# Messung machen
+#
+#
+#
+# # Datei speichern
+# Dateiname = os.path.join(path, now +  '.csv')
+#
+# schreibe_Messwerte_in_Datei(Dateiname, Messwerte, Liste_Winkel)
+
+###############
+# Hier müsste es möglich sein alle Daten zu verwerfen, Messwerte.csv neu zu laden
+# und die Darstellungen zu erzeugen!?
+###############
+
+Messwerte, Liste_Winkel, timestamp = lies_Messwerte_aus_Datei(csv_Dateiname)
+
+print(Messwerte[0][0])
+print(type(Messwerte[0][0]))
+
+# Diagramme erstellen und speichern
+# 800 MHz, ...
+
+# Ziel_Frequenzen_MHz = [860, 915, 2*860, 2*915, 2400, 2450, 2500]
+# Ziel_Frequenzen_MHz = [145, 435, 500, 868, 916]
+
+Ziel_Frequenzen_MHz = [2400, 2440, 2480]
+indizes = finde_index_fuer_Frequenz(Ziel_Frequenzen_MHz, Messwerte)
+
+heatmap(Messwerte[:,1::2])
+heatmap_dB(Messwerte[:,1::2])
+
+for Zeile_gesucht in indizes:
+    # Zeile_gesucht = 14
+    Zeile = Messwerte[Zeile_gesucht]
+    erstelle_Diagramm(Zeile, Liste_Winkel)
+    erstelle_Diagramm_dB(Zeile, Liste_Winkel)
+
+logging.info("ENDE")