DmitrMakeev commited on
Commit
bc33424
·
verified ·
1 Parent(s): 0c5601c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +112 -30
app.py CHANGED
@@ -798,38 +798,120 @@ class HydroCalculator:
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) # 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 литров раствора