Автор Тема: AA-30 Zero - собираем статистику и рисуем графики  (Прочитано 2563 раз)

0 Користувачів і 2 Гостей дивляться цю тему.

Offline UT3UDX

Эта статья будет полезна в первую очередь тем , кто купил плату Rigexpert AA-30 ZERO и не особо
нашел ей применение,как я  - до последнего времени

Как-то неделю назад я решил поработать на КВ, повесил антенну ,диполь ,
- размотал, поднял, подключил - померял КСВ и как-то загрустил.

КСВ на 7.15 mHz плавал в пределах от 1 до 1.5 в зависмости от погоды и сырости на улице - что за хрень, подумал я?

Сырость. Но надо-бы собрать статистику.

В итоге , я написал небольшой скрипт, состоящий из 4 частей - Python словарь, который содержит в себе параметры
каждого диапазона функция, которая общается с платой, функция генерации картинок, как в Антскоп, и функция ,
которая складывает параметры опроса в базу данных, для дальнейшей обработки. А , еще небольшая функция, которая
вычисляет КСВ исходя из значений сопротивления нагрузки, реактивного и активного сопротивления излучателя.

  


Принцип работы простой, из прибора берем частоту, активное и реактивное сопротивление, вычисляем КСВ и записываем в базу.


сам скрипт

Код: [Select]
#!/usr/bin/env python3
import serial
import math
import matplotlib.pyplot as plt
from datetime import datetime
import sqlite3
import requests

Band = {'160':['fq1900000', 'sw200000', 'frx20', '20'],
        '80': ['fq3750000', 'sw500000', 'frx50', '50'],
        '60': ['fq5331900', 'sw28000', 'frx20', '20'],
        '40': ['fq7150000', 'sw1000000', 'frx30', '30'],
        '30': ['fq10125000', 'sw50000', 'frx10', '10'],
        '20': ['fq14150000', 'sw300000', 'frx30', '30'],
        '17': ['fq18118000', 'sw100000', 'frx10', '10'],
        '15': ['fq21225000', 'sw450000', 'frx45', '45'],
        '12': ['fq24940000', 'sw100000', 'frx10', '10'],
        '10': ['fq28985000', 'sw1970000', 'frx50', '50']
        }

ser = serial.Serial('/dev/ttyUSB3', baudrate=38400, timeout=1)

def swr_calculate(R, X):
    XX = float(X) * float(X)
    Rm = (float(R) - 50) * (float(R) - 50)
    Rp = (float(R) + 50) * (float(R) + 50)
    N = math.sqrt(Rm + XX)
    D = math.sqrt(Rp + XX)
    G = N / D
    vswr = (1 + G) / (1 - G)
    return round(vswr, 2)

freqs = []
vswrs = []
f = open("SWR-and-Frequency-" + str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))+".csv","w+")
def insertVaribleIntoTable(freq,vswr, date):
    try:
        sqliteConnection = sqlite3.connect('aa-30-zero.db')
        cursor = sqliteConnection.cursor()
        sqlite_insert_with_param = """INSERT INTO swr_measurements (freq, vswr, date) VALUES (?, ?, ?);"""
        data_tuple = (freq, vswr, date)
        cursor.execute(sqlite_insert_with_param, data_tuple)
        sqliteConnection.commit()
        cursor.close()
    except sqlite3.Error as error:
        print("Failed to insert Python variable into sqlite table", error)
    finally:
        if sqliteConnection:
            sqliteConnection.close()


def GetSWR(band):
    ser.write(bytes((str(Band[band][0]) + '\r\n'), "ascii"))
    ser.readline()
    ser.write(bytes((str(Band[band][1]) + '\r\n'), "ascii"))
    ser.readline()
    ser.write(bytes((str(Band[band][2]) + '\r\n'), "ascii"))
    ser.readline()
    ser.write(bytes(('\n'), "ascii"))
    for i in range(int(Band[band][3])):
        x = ser.readline().decode('ascii').split(',')
        freq = round(float(x[0]),3)
        print('{freq},{swr}'.format(freq=freq, swr=swr_calculate(x[1], x[2])))
        freqs.append(freq)
        vswrs.append(swr_calculate(x[1], x[2]))
        f.write('{freq},{swr}'.format(freq=freq, swr=swr_calculate(x[1], x[2])) + '\n')
        vswr = swr_calculate(x[1], x[2])
        datetttt= str(datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))
        insertVaribleIntoTable(freq,vswr,datetttt )

''' if you need graphs - uncoment this function call below'''
#   graph(band)

def graph(band):
    dpi = 120
    plt.figure(dpi=dpi, figsize=(1324 / dpi, 600 / dpi))
    plt.plot(freqs, vswrs)
    plt.title(band + "   SWR vs Frequency  " + str(datetime.now().strftime("%Y-%m-%d %H-%M-%S")))
    plt.xlabel("Frequency, MHz")
    plt.ylabel("SWR")
    start_freq = (freqs[0])
    end_freq = (freqs[len(freqs)-1])
    plt.axis([start_freq, end_freq, 1.0, 9.0])
    plt.grid(True)
    plt.savefig("band_" + band + "_" + str(datetime.now().strftime("%Y%m%d-%H%M%S")) + ".png")
    freqs.clear()
    vswrs.clear()

if __name__ == '__main__':
    for key in ['80', '60', '40', '30', '20', '17', '15', '12', '10']:
        GetSWR(key)



создаем базу данных

Код: [Select]
#sqlite3 aa-30-zero.db

создаем таблицу


Код: [Select]
max@max rigexpert (master) $ sqlite3 aa-30-zero.db
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> CREATE TABLE "swr_measurements"  (
   ...>   "freq" VARCHAR(255),
   ...>   "vswr" VARCHAR(255),
   ...>   "date" VARCHAR(255)
   ...> ;
sqlite>

начинаем туда писать, писать, собираем статистику, ждем, и вот мы ее собрали.

посмотрим какой у нас КСВ от 7.1 до 7.25 mHz, отсортируем по полю vswr и выведем 10 результатов

Код: [Select]
max@max rigexpert (master) $ echo "SELECT * FROM "swr_measurements" WHERE freq > '7.1%' and freq < '7.25%' ORDER BY vswr LIMIT 10;" | sqlite33 -table aa-30-zero.db
+-------+------+---------------------+
| freq  | vswr |        date         |
+-------+------+---------------------+
| 7.25  | 1.28 | 2021-06-28-01-26-39 |
| 7.25  | 1.3  | 2021-06-28-01-26-22 |
| 7.25  | 1.3  | 2021-06-28-01-30-04 |
| 7.25  | 1.32 | 2021-06-28-01-22-30 |
| 7.25  | 1.34 | 2021-06-28-01-26-59 |
| 7.25  | 1.34 | 2021-06-28-01-31-53 |
| 7.25  | 1.38 | 2021-06-28-02-14-26 |
| 7.25  | 1.4  | 2021-06-28-01-25-04 |
| 7.25  | 1.4  | 2021-06-28-02-10-03 |
| 7.217 | 1.41 | 2021-06-28-01-26-59 |
+-------+------+---------------------+

Оk, а в целом, самый маленький во всем диапазоне ?

Код: [Select]
max@max rigexpert (master) $ echo "SELECT * FROM "swr_measurements" ORDER BY vswr LIMIT 10;" | sqlite33 -table aa-30-zero.db
+-------+------+---------------------+
| freq  | vswr |        date         |
+-------+------+---------------------+
| 7.4   | 1.09 | 2021-06-28-00-45-14 |
| 7.417 | 1.09 | 2021-06-28-01-26-09 |
| 7.417 | 1.09 | 2021-06-28-01-34-08 |
| 7.417 | 1.09 | 2021-06-28-01-34-37 |
| 7.4   | 1.09 | 2021-06-28-06-00-14 |
| 7.4   | 1.09 | 2021-06-28-07-15-14 |
| 7.4   | 1.09 | 2021-06-28-08-00-14 |
| 7.4   | 1.1  | 2021-06-28-00-29-12 |
| 7.4   | 1.1  | 2021-06-28-00-29-56 |
| 7.4   | 1.1  | 2021-06-28-00-30-25 |
+-------+------+---------------------+

Так, а самый большой?

Код: [Select]
max@max rigexpert (master) $ echo "SELECT * FROM "swr_measurements" ORDER BY vswr DESC LIMIT 10;" | sqlite33 -table aa-30-zero.db
+-------+------+---------------------+
| freq  | vswr |        date         |
+-------+------+---------------------+
| 5.107 | 8.55 | 2021-06-28-16-00-29 |
| 5.107 | 8.51 | 2021-06-28-16-45-08 |
| 5.107 | 8.43 | 2021-06-28-18-15-08 |
| 5.132 | 8.39 | 2021-06-28-16-00-30 |
| 5.107 | 8.38 | 2021-06-28-00-45-08 |
| 5.107 | 8.35 | 2021-06-28-17-00-08 |
| 5.107 | 8.33 | 2021-06-28-00-29-50 |
| 5.107 | 8.33 | 2021-06-28-18-00-08 |
| 5.132 | 8.32 | 2021-06-28-00-45-08 |
| 5.132 | 8.32 | 2021-06-28-18-00-08 |
+-------+------+---------------------+
[/ code]


Ну, как-то так.
Дальше данные уже можно сопоставить с погодой, ну и что-то решать - провести изоляционные работы или просто оставить как есть :)
« Останнє редагування: Червень 30, 2021, 21:49:18 від UT3UDX »
 

Offline UT3UDX

да, кстати, если у кого-то есть опыт сбора данных с aa-230 или любого другого который HID - я с радостью и удовольствием посмотрю ваш код, ибо у меня не получилось ничего написать для связи с этими анализаторами
 

Offline UT5UKA

Привет!

А есть уже статистика за месяц? И в графическом виде - как изменяется КСВ АФУ по дням (часам) ? И для сравнения график погоды, какая зависимость от погодных условий  :smilie:
 

Offline UT3UDX

Привет!
Не, по дням нету, так, чтобы постоянно включать измерения - я не включал, надо же и поработать через антенну