Давайте рассмотрим алгоритм работы нашей программы!

  1. Подсчёт импульсов:
  2. Переменная pulse_count используется для хранения количества сработок.
  3. Каждый раз, когда происходит срабатывание, эта переменная увеличивается на 1.
  4. Антидребезг:
  5. Введена переменная interrupt_time, которая хранит время последнего срабатывания.
  6. При каждом срабатывании проверяется, прошло ли достаточно времени с последнего срабатывания (drebezg_time).
  7. Если прошло, увеличиваем счётчик импульсов и включаем светодиод.
  8. Мигание светодиода без задержек:
  9. Вместо time.sleep для выключения светодиода используется таймер (Timer), который позволяет избежать блокировки основного потока выполнения.
  10. Основной цикл печатает количество импульсов каждую секунду, что позволяет наблюдать за изменениями в реальном времени.

Перейдем к написанию программы и рисованию электрической схемы!

И так схема у нас есть, на ней обозначены микроконтроллер,ножки gnd и питания 3,3В, к порту D4 подключена кнопка КН1, вернемся к программе.

Практически к каждому материалу есть видеоролик на  YouTube  и  RUTUBE каналах, теорию можно прочитать в статье, а как работает устройство в железе, посмотреть в видеоролике!

Датчик функционирует следующим образом: сигнал от фотодетектора поступает на один из входов LM393, а на другой вход подается опорное напряжение. Если сигнал от фотодетектора становится выше опорного напряжения, компаратор переключается, генерируя выходной импульс.

Области применения:

- Автомобили: измерение скорости вращения колес.  
- Машиностроение: мониторинг вращения валов и других движущихся деталей.  
- Робототехника: отслеживание скорости и направления движения.

  • Датчик имеет ширину паза 5 мм.
  • Выходной ток сигнала DO превышает 15 мА.
  • Работает при напряжении 3,3–5 В.
  • Выход представлен логическими значениями 0 и 1.
  • Размеры: 40 мм х 26 мм х 32 мм

   

Датчик подключен к порту D5 и питанию. Сначала импортируем нужные классы для работы с таймером и портами: from machine import Pin, Timer.

Затем подключим функции для задержек: import time.

Настроим D5 на вход encoder_pin = Pin(5, Pin.IN) и D2 на выход led = Pin(2, Pin.OUT), к которому подключен светодиод на плате. Создадим три переменные: pulse_count = 0 для счетчика импульсов, interrupt_time = 0 для времени последнего прерывания и drebezg_time = 50 для подавления дребезга в миллисекундах.

Создадим функцию `def encoder_back(pin)`. Объявим переменные глобальными, чтобы они были доступны внутри функции: `global pulse_count, interrupt_time`. Получим текущее время: `current_time = time.ticks_ms()`. Проверим, прошло ли достаточно времени, чтобы избежать дребезга: `if current_time - interrupt_time > drebezg_time:`. Увеличим счётчик импульсов на единицу: `pulse_count += 1`. Включим светодиод: `led.on()`. Используем таймер для выключения светодиода: `Timer(0).init(period=100, mode=Timer.ONE_SHOT, callback=lambda t: led.off())`. Вместо `time.sleep` для выключения светодиода применяется таймер (`Timer`), который не блокирует основной поток выполнения. Обновим время последнего прерывания: `interrupt_time = current_time`. Настроим прерывания по фронту сигнала: `encoder_pin.irq(trigger=Pin.IRQ_RISING, handler=encoder_back)`.

Начинаем основной цикл программы: `while True:`. Каждую секунду выводим в терминал количество импульсов: `print("Number of pulses:", pulse_count)`. Задержка вывода — одна секунда: `time.sleep(1)`.

Работать с оптическим датчиком несложно. В этом примере мы разобрали базовый метод считывания импульсов с него.

Исходный код программы Скачать архив

Понравился проект? Не забудь поделиться им с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube и RUTUBE !

  • СПАСИБО ЗА ПРОСМОТР.
  • С уважением.
  • Электроника и Робототехника!