Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import time
- from collections import deque
- from machine import Pin, I2C, ADC, PWM
- from ina226 import INA226
- class Poti:
- def __init__(self, pin):
- self._adc = ADC(Pin(pin))
- self._last = None
- @property
- def value(self):
- current = round(self._adc.read_u16() / 65535 * 100)
- if self._last is not None and self._last != current:
- # print(f"Abschaltung bei {current} mA")
- ...
- self._last = current
- return current
- SDA = Pin(15)
- SCL = Pin(16)
- ON = Pin(3, mode=Pin.IN, pull=Pin.PULL_DOWN)
- MOT = PWM(Pin(5), freq=5000, duty_u16=0)
- bus = I2C(1, sda=SDA, scl=SCL)
- ina = INA226(bus, 0x40)
- poti = Poti(9)
- timeout = None
- window_timeout = None
- window_active = True
- motor_deaktiviert = False
- queue = deque([0]*20, 100)
- while True:
- # hier wird zur Schlange einfach der Status das Eingangs (0 oder 1)
- # angehangen. Wenn die Schlange voll ist, wird das älteste Element verworfen
- queue.append(ON())
- # Eingang abfragen
- # Anstatt den Eingang direkt abzufragen, müssen alle
- # Elemente in der Warteschalnge 1 sein
- if all(queue):
- # Wenn der Timeout gesetzt ist und größer als die aktuelle Zeit (in ms),
- # wird der Motor deaktiviert und zurück zum Kopf der Endlosschleife
- if timeout is not None and time.ticks_ms() > timeout:
- MOT.duty(0)
- if motor_deaktiviert:
- print("Motor ist blockiert, Eingangssignal wird ignoriert und der Motor abgeschaltet")
- motor_deaktiviert = False
- continue
- # Bedingung des Timeouts noch nicht erfüllt
- # dann wird diese Position erreicht
- MOT.duty(512)
- # Fenster-Funktion, um eine vorgegebene Zeit keine
- # Strom-Messungen durchzuführen. Hilft bei Getriebemotoren zur
- # Überwindung der Hemmung.
- # Fenster ist aktiv, aber noch kein Timeout für das
- # Fensrer gesetzt.
- if window_active and window_timeout is None:
- window_timeout = time.ticks_ms() + 5000
- print("Fenster geöffnet")
- continue
- # Fenster ist aktib und der Timeout ist auch gesetzt
- elif window_active and window_timeout:
- if time.ticks_ms() < window_timeout:
- continue
- if window_active:
- print("Fenster geschlossen")
- # window_active wird jetzt zurückgesetzt
- # wenn keine der vorheringen Bedingungen erfüllt ist,
- # wird diese Position erreicht
- # Fenster-Funktion zurücksetzen
- window_active = False
- window_timeout = None
- # Ausgabe des Stroms in mA
- current = round(ina.current * 1000, 0)
- # Wenn der Strom größer ist, als durch das Poti der vorgebene Wert (bis 100mA)
- # wird dieser Zweig ausgeführt
- if current > poti.value:
- # print(f"Motor: {current:.0f} mA")
- # Motor anhalten
- MOT.duty(0)
- # Timeout setzen, damit der Motor nach gegebener Zeit
- # den aktiven Steuerbefehl ignoriert
- if timeout is None:
- timeout = time.ticks_ms() + 2_000
- else:
- # Motor wird nicht angesteuert
- # Motor anhalten
- # timeout zurücksetzen
- # Fenster aktiv schalten und die None window_timeout zuweisen
- MOT.duty(0)
- timeout = None
- window_active = True
- window_timeout = None
- motor_deaktiviert = True
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement