示例#1
0
        /// <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);
        }