/// <summary> /// When the motor state is different than spinning clockwise then it first stops motor and then starts in clockwise /// direction. /// </summary> public void StartClockWise() { if (motorState != MotorState.SpinningClockWise) { Stop(); gpioController.SetPin(pinMapping[MotorPinNames.Input1].PinNumber, PinValue.High); gpioController.SetPin(pinMapping[MotorPinNames.Input2].PinNumber, PinValue.Low); gpioController.SetPin(pinMapping[MotorPinNames.Pwm].PinNumber, PinValue.High); // gpioController.SetPin(pinMapping[MotorPinNames.StandBy].PinNumber, PinValue.High); logger.LogInformation($"Starting motor in clockwise direction on {DateTime.Now.ToString("hh:mm:ss.fff")}."); } }
public async Task <double> MeasureDistance(CancellationToken ct) { var echoDuration = new Stopwatch(); var waitingForEcho = new Stopwatch(); // trigger gpio.SetPin(pinMapping[DistanceSensorPinNames.Trigger].PinNumber, PinValue.High); await Task.Delay(TimeSpan.FromTicks(100), ct); gpio.SetPin(pinMapping[DistanceSensorPinNames.Trigger].PinNumber, PinValue.Low); // Wait for High state on echo pin waitingForEcho.Reset(); waitingForEcho.Start(); while (gpio.ReadPin(pinMapping[DistanceSensorPinNames.Echo].PinNumber) == PinValue.Low && waitingForEcho.Elapsed.TotalMilliseconds <= 100) { } waitingForEcho.Stop(); logger.LogDebug($"Waiting for High value on Echo pin: {waitingForEcho.Elapsed.Milliseconds}"); // Measure duration of high state on echo pin echoDuration.Reset(); echoDuration.Start(); while (gpio.ReadPin(pinMapping[DistanceSensorPinNames.Echo].PinNumber) == PinValue.High) { } echoDuration.Stop(); var duration = echoDuration.Elapsed.Ticks / 10; logger.LogDebug($"High value duration: {duration} microseconds"); var distance = (duration * 34) / 1000 / 2; logger.LogDebug($"Measured distance: {distance}"); await MeasurementsChannel.Writer.WriteAsync(distance > 200? 200 : distance, ct); return(distance > 200 ? 200 : distance); }