Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -798,123 +798,41 @@ class HydroCalculator:
|
|
| 798 |
|
| 799 |
return ec / 1000 # переводим в mS/cm
|
| 800 |
|
| 801 |
-
|
| 802 |
-
def __init__(self, volume_liters=1.0):
|
| 803 |
-
self.volume = volume_liters
|
| 804 |
-
self.fertilizers = []
|
| 805 |
-
|
| 806 |
-
def add_fertilizer(self, name, grams):
|
| 807 |
-
if name not in fertilizers_db:
|
| 808 |
-
raise ValueError(f"Удобрение '{name}' не найдено в базе!")
|
| 809 |
-
self.fertilizers.append((name, grams))
|
| 810 |
-
|
| 811 |
-
def calculate_ppm(self):
|
| 812 |
-
ppm = {}
|
| 813 |
-
for name, grams in self.fertilizers:
|
| 814 |
-
for element, ratio in fertilizers_db[name].items():
|
| 815 |
-
ppm[element] = ppm.get(element, 0) + (grams * ratio * 1000) / (self.volume * 10)
|
| 816 |
-
return ppm
|
| 817 |
-
|
| 818 |
-
def calculate_ppm_ec(self):
|
| 819 |
-
ppm_ec = {}
|
| 820 |
-
for name, grams in self.fertilizers:
|
| 821 |
-
for element, ratio in fertilizers_db[name].items():
|
| 822 |
-
ppm_ec[element] = ppm_ec.get(element, 0) + (grams * ratio * 1000)
|
| 823 |
-
return ppm
|
| 824 |
-
|
| 825 |
-
def calculate_ec(self):
|
| 826 |
-
ppm_ec = self.calculate_ppm_ec()
|
| 827 |
-
ec = 0.0
|
| 828 |
-
EC_COEFFICIENTS = {
|
| 829 |
-
'N (NO3-)': 0.6,
|
| 830 |
-
'N (NH4+)': 0.4,
|
| 831 |
-
'K': 0.7,
|
| 832 |
-
'Ca': 0.75,
|
| 833 |
-
'Mg': 0.6,
|
| 834 |
-
'S': 0.3,
|
| 835 |
-
'P': 0.1,
|
| 836 |
-
}
|
| 837 |
-
for element, value in ppm.items():
|
| 838 |
-
if element in EC_COEFFICIENTS:
|
| 839 |
-
ec += value * EC_COEFFICIENTS[element]
|
| 840 |
-
return ec / 1000
|
| 841 |
-
|
| 842 |
-
def calculate_ec_exact(self):
|
| 843 |
-
MOLAR_MASSES = {
|
| 844 |
-
'NO3-': 62.0,
|
| 845 |
-
'NH4+': 18.0,
|
| 846 |
-
'K+': 39.1,
|
| 847 |
-
'Ca+2': 40.1,
|
| 848 |
-
'Mg+2': 24.3,
|
| 849 |
-
'SO4-2': 96.1,
|
| 850 |
-
'H2PO4-': 97.0,
|
| 851 |
-
}
|
| 852 |
-
ION_CONDUCTIVITY = {
|
| 853 |
-
'NO3-': 71.4,
|
| 854 |
-
'NH4+': 73.5,
|
| 855 |
-
'K+': 73.5,
|
| 856 |
-
'Ca+2': 119.0,
|
| 857 |
-
'Mg+2': 106.0,
|
| 858 |
-
'SO4-2': 160.0,
|
| 859 |
-
'H2PO4-': 33.0,
|
| 860 |
-
}
|
| 861 |
-
ELEMENT_TO_ION = {
|
| 862 |
-
'N (NO3-)': 'NO3-',
|
| 863 |
-
'N (NH4+)': 'NH4+',
|
| 864 |
-
'K': 'K+',
|
| 865 |
-
'Ca': 'Ca+2',
|
| 866 |
-
'Mg': 'Mg+2',
|
| 867 |
-
'S': 'SO4-2',
|
| 868 |
-
'P': 'H2PO4-',
|
| 869 |
-
}
|
| 870 |
-
|
| 871 |
ppm = self.calculate_ppm()
|
| 872 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 873 |
|
| 874 |
-
|
| 875 |
-
if element in ELEMENT_TO_ION:
|
| 876 |
-
ion = ELEMENT_TO_ION[element]
|
| 877 |
-
molar_mass = MOLAR_MASSES[ion]
|
| 878 |
-
conductivity = ION_CONDUCTIVITY[ion]
|
| 879 |
-
mmol_per_liter = value / molar_mass
|
| 880 |
-
ec += mmol_per_liter * conductivity
|
| 881 |
-
|
| 882 |
-
return ec # ← БЕЗ деления на 1000
|
| 883 |
-
|
| 884 |
-
def print_report(self):
|
| 885 |
-
ppm = self.calculate_ppm()
|
| 886 |
-
ec_simple = self.calculate_ec()
|
| 887 |
-
ec_exact = self.calculate_ec_exact()
|
| 888 |
-
|
| 889 |
-
print("\n" + "="*50)
|
| 890 |
-
print("ТАБЛИЦА КОНЦЕНТРАЦИЙ ЭЛЕМЕНТОВ")
|
| 891 |
-
print("="*50)
|
| 892 |
-
print("{:<15} {:>15} {:>15}".format("Элемент", "Конц. (ppm)", "Конц. (мг/л)"))
|
| 893 |
-
print("-"*50)
|
| 894 |
-
for element, value in sorted(ppm.items()):
|
| 895 |
-
print("{:<15} {:>15.2f} {:>15.2f}".format(element, value, value))
|
| 896 |
-
print("="*50)
|
| 897 |
-
|
| 898 |
-
print("\n" + "="*50)
|
| 899 |
-
print("АНАЛИЗ АЗОТНЫХ СОЕДИНЕНИЙ")
|
| 900 |
-
print("="*50)
|
| 901 |
-
print(f"Общий азот (N): {ppm.get('N (NO3-)', 0) + ppm.get('N (NH4+)', 0):.2f} ppm")
|
| 902 |
-
print(f"Нитратный азот (NO3-): {ppm.get('N (NO3-)', 0):.2f} ppm")
|
| 903 |
-
print(f"Аммонийный азот (NH4+): {ppm.get('N (NH4+)', 0):.2f} ppm")
|
| 904 |
-
print("="*50)
|
| 905 |
-
|
| 906 |
-
print("\n" + "="*50)
|
| 907 |
-
print("ЭЛЕКТРОПРОВОДНОСТЬ РАСТВОРА")
|
| 908 |
-
print("="*50)
|
| 909 |
-
print(f"EC: {ec_simple:.2f} mS/cm")
|
| 910 |
-
print(f"EC (точный): {ec_exact:.2f} mS/cm")
|
| 911 |
-
print("="*50)
|
| 912 |
-
|
| 913 |
-
|
| 914 |
-
|
| 915 |
|
| 916 |
# Пример использования с правильными названиями удобрений
|
| 917 |
-
calc = HydroCalculator(10)
|
| 918 |
|
| 919 |
# Добавляем удобрения с правильными названиями и адекватными количествами
|
| 920 |
calc.add_fertilizer("Кальциевая селитра", 5) # 10 г
|
|
|
|
| 798 |
|
| 799 |
return ec / 1000 # переводим в mS/cm
|
| 800 |
|
| 801 |
+
def print_report(self):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 802 |
ppm = self.calculate_ppm()
|
| 803 |
+
ec_simple = self.calculate_ec()
|
| 804 |
+
ec_exact = self.calculate_ec_exact()
|
| 805 |
+
|
| 806 |
+
# Вывод основной таблицы элементов
|
| 807 |
+
print("\n" + "="*50)
|
| 808 |
+
print("ТАБЛИЦА КОНЦЕНТРАЦИЙ ЭЛЕМЕНТОВ")
|
| 809 |
+
print("="*50)
|
| 810 |
+
print("{:<15} {:>15} {:>15}".format("Элемент", "Конц. (ppm)", "Конц. (мг/л)"))
|
| 811 |
+
print("-"*50)
|
| 812 |
+
for element, value in sorted(ppm.items()):
|
| 813 |
+
print("{:<15} {:>15.2f} {:>15.2f}".format(element, value, value))
|
| 814 |
+
print("="*50)
|
| 815 |
+
|
| 816 |
+
# Вывод данных по азоту
|
| 817 |
+
print("\n" + "="*50)
|
| 818 |
+
print("АНАЛИЗ АЗОТНЫХ СОЕДИНЕНИЙ")
|
| 819 |
+
print("="*50)
|
| 820 |
+
print(f"Общий азот (N): {ppm.get('N (NO3-)', 0) + ppm.get('N (NH4+)', 0):.2f} ppm")
|
| 821 |
+
print(f"Нитратный азот (NO3-): {ppm.get('N (NO3-)', 0):.2f} ppm")
|
| 822 |
+
print(f"Аммонийный азот (NH4+): {ppm.get('N (NH4+)', 0):.2f} ppm")
|
| 823 |
+
print("="*50)
|
| 824 |
+
|
| 825 |
+
# Вывод электропроводности
|
| 826 |
+
print("\n" + "="*50)
|
| 827 |
+
print("ЭЛЕКТРОПРОВОДНОСТЬ РАСТВОРА")
|
| 828 |
+
print("="*50)
|
| 829 |
+
print(f"EC: {ec_simple:.2f} mS/cm")
|
| 830 |
+
print("="*50)
|
| 831 |
|
| 832 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 833 |
|
| 834 |
# Пример использования с правильными названиями удобрений
|
| 835 |
+
calc = HydroCalculator(10)
|
| 836 |
|
| 837 |
# Добавляем удобрения с правильными названиями и адекватными количествами
|
| 838 |
calc.add_fertilizer("Кальциевая селитра", 5) # 10 г
|