Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import esp32, machine, time, gc
- # sprawdź czy wartość mieści się w tolerancji procentowej +/-
- @micropython.native
- def tolerancja(a, b, ile_procent):
- return abs(a - b) < a * (ile_procent / 100)
- # prosty filtr
- @micropython.native
- def filtr(pin, max_probek = 5, czas_sygn_min = 2000, czas_sygn_max = 30000, tolerancja_delta = 0.8, tolerancja_czas = 0.8):
- licz = delta_poprz = start_poprz = 0
- stan = pin.value()
- while licz < max_probek:
- czas_start = time.ticks_us()
- while pin.value() == stan:
- pass
- delta_teraz = time.ticks_diff(time.ticks_us(), czas_start)
- stan = pin.value()
- if stan == 1 and czas_sygn_min < delta_teraz < czas_sygn_max: # jeżeli stan == 1, to wcześniej było 0
- licz = (licz + 1) if (tolerancja(delta_poprz, delta_teraz, tolerancja_delta) and tolerancja(czas_start, start_poprz, tolerancja_czas)) else 0
- delta_poprz = delta_teraz
- start_poprz = czas_start
- elif delta_teraz > czas_sygn_max: # wyjscie odbiornika milknie na dłuższą chwilę, sygnał został odebrany
- break
- return licz == max_probek # jeżeli licznik osiągnął max_próbek, wtedy zwracam True, inaczej False
- # odbiór sygnałów
- @micropython.native
- def sygnaly(pin, max_buff = 1000, czas_sygn_max = 30000):
- buff = []; czas_delta = 0
- pierwszy_stan = stan = pin.value()
- while czas_delta < czas_sygn_max and max_buff > 0:
- czas_start = time.ticks_us()
- while pin.value() == stan:
- pass
- czas_delta = time.ticks_diff(time.ticks_us(), czas_start)
- stan = pin.value()
- buff.append(czas_delta)
- max_buff -= 1
- return (None if max_buff != 0 else (buff, bool(pierwszy_stan)))
- def nadajnik(pin, sygnaly, powtorz = 2, spij_ms = 300):
- pin.write_pulses(sygnaly[0] * powtorz, sygnaly[1])
- time.sleep_ms(spij_ms)
- # funkcja główna - wysyła otrzymany bufor sygnałów
- # odbiornik: superheterodyna 433 Mhz: "RX500" i "RXB6 v2.0" (w obu szum na wyjściu)
- # nadajnik: SYN115
- # anteny: dipol 173 mm
- if __name__ == "__main__":
- pin_odbiornik = machine.Pin(27, machine.Pin.IN)
- pin_nadajnik = esp32.RMT(0, pin = machine.Pin(23, machine.Pin.OUT), clock_div = 80, idle_level = False)
- print("\n[INFO]: Naciśnij i przytrzymaj przycisk pilota ...", end = "")
- while True:
- gc.collect() # zbieram śmieci
- if filtr(pin_odbiornik):
- ret = sygnaly(pin_odbiornik)
- if ret != None:
- input("\n[INFO]: Naciśnij przeciwny przycisk na pilocie, następnie ENTER aby wysłać kod ...")
- nadajnik(pin_nadajnik, ret)
- print("[INFO]: Kod wysłany.\n\nNaciśnij i przytrzymaj przycisk pilota ...", end = "")
- time.sleep_ms(500) # heterodyno uspokój się
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement