Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -798,38 +798,120 @@ class HydroCalculator:
|
|
798 |
|
799 |
return ec / 1000 # переводим в mS/cm
|
800 |
|
801 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
802 |
ppm = self.calculate_ppm()
|
803 |
-
|
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) # 10 литров раствора
|
|
|
798 |
|
799 |
return ec / 1000 # переводим в mS/cm
|
800 |
|
801 |
+
class HydroCalculator:
|
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 |
+
ec = 0.0 # µS/cm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
873 |
|
874 |
+
for element, value in ppm.items():
|
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) # 10 литров раствора
|