Advertisement
orborbson

filtr 433 mhz z opisem

Oct 9th, 2024 (edited)
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.81 KB | Source Code | 0 0
  1. import esp32, machine, time, gc
  2.  
  3. # sprawdź czy wartość mieści się w tolerancji procentowej +/-
  4. @micropython.native
  5. def tolerancja(a, b, ile_procent):
  6.     return abs(a - b) < a * (ile_procent / 100)
  7.  
  8. # prosty filtr
  9. @micropython.native
  10. def filtr(pin, max_probek = 5, czas_sygn_min = 2000, czas_sygn_max = 30000, tolerancja_delta = 0.8, tolerancja_czas = 0.8):
  11.     licz = delta_poprz = start_poprz = 0
  12.     stan = pin.value()
  13.     while licz < max_probek:
  14.         czas_start = time.ticks_us()
  15.         while pin.value() == stan:
  16.             pass
  17.         delta_teraz = time.ticks_diff(time.ticks_us(), czas_start)
  18.         stan = pin.value()
  19.         if stan == 1 and czas_sygn_min < delta_teraz < czas_sygn_max: # jeżeli stan == 1, to wcześniej było 0
  20.             licz = (licz + 1) if (tolerancja(delta_poprz, delta_teraz, tolerancja_delta) and tolerancja(czas_start, start_poprz, tolerancja_czas)) else 0
  21.             delta_poprz = delta_teraz
  22.             start_poprz = czas_start
  23.         elif delta_teraz > czas_sygn_max: # wyjscie odbiornika milknie na dłuższą chwilę, sygnał został odebrany
  24.             break
  25.     return licz == max_probek # jeżeli licznik osiągnął max_próbek, wtedy zwracam True, inaczej False
  26.  
  27. # odbiór sygnałów
  28. @micropython.native
  29. def sygnaly(pin, max_buff = 1000, czas_sygn_max = 30000):
  30.     buff = []; czas_delta = 0
  31.     pierwszy_stan = stan = pin.value()
  32.     while czas_delta < czas_sygn_max and max_buff > 0:
  33.         czas_start = time.ticks_us()
  34.         while pin.value() == stan:
  35.             pass
  36.         czas_delta = time.ticks_diff(time.ticks_us(), czas_start)
  37.         stan = pin.value()
  38.         buff.append(czas_delta)
  39.         max_buff -= 1
  40.     return (None if max_buff != 0 else (buff, bool(pierwszy_stan)))
  41.  
  42. def nadajnik(pin, sygnaly, powtorz = 2, spij_ms = 300):
  43.     pin.write_pulses(sygnaly[0] * powtorz, sygnaly[1])
  44.     time.sleep_ms(spij_ms)
  45.  
  46. # funkcja główna - wysyła otrzymany bufor sygnałów
  47. # odbiornik: superheterodyna 433 Mhz: "RX500" i "RXB6 v2.0" (w obu szum na wyjściu)
  48. # nadajnik: SYN115
  49. # anteny: dipol 173 mm
  50. if __name__ == "__main__":
  51.     pin_odbiornik = machine.Pin(27, machine.Pin.IN)
  52.     pin_nadajnik = esp32.RMT(0, pin = machine.Pin(23, machine.Pin.OUT), clock_div = 80, idle_level = False)
  53.    
  54.     print("\n[INFO]: Naciśnij i przytrzymaj przycisk pilota ...", end = "")
  55.     while True:
  56.         gc.collect() # zbieram śmieci
  57.         if filtr(pin_odbiornik):
  58.             ret = sygnaly(pin_odbiornik)
  59.             if ret != None:
  60.                 input("\n[INFO]: Naciśnij przeciwny przycisk na pilocie, następnie ENTER aby wysłać kod ...")
  61.                 nadajnik(pin_nadajnik, ret)
  62.                 print("[INFO]: Kod wysłany.\n\nNaciśnij i przytrzymaj przycisk pilota ...", end = "")
  63.         time.sleep_ms(500) # heterodyno uspokój się
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement