Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
products:laboratory_iot:exp34 [2020/05/21 19:53] – [Эксперимент 34. Подключение энкодера] labuser29 | products:laboratory_iot:exp34 [2024/11/15 20:41] (текущий) – [Программный код эксперимента] labuser30 | ||
---|---|---|---|
Строка 15: | Строка 15: | ||
// | // | ||
- | Соберем эту схему как показано на Рисунке | + | Обрати внимание, |
+ | |||
+ | С дребезгом нужно бороться программным или электрическим способом. В нашей схеме резистор с конденсатором являются фильтром для коротких импульсов, возникающих при дребезге контактов. Благодаря этому фильтру данный эффект можно в значительной мере устранить. | ||
{{ : | {{ : | ||
- | // | + | // |
+ | |||
+ | ==== Программный код эксперимента ==== | ||
+ | |||
+ | <file python Exp34.py[enable_line_numbers=" | ||
+ | from time import sleep_ms, ticks_ms | ||
+ | from machine import I2C, Pin | ||
+ | from esp8266_i2c_lcd import I2cLcd | ||
+ | _init() | ||
+ | |||
+ | DEFAULT_I2C_ADDR = 0x3F # Или 0x27 в зависимости от модели микросхемы на плате | ||
+ | |||
+ | encA = Pin(13, Pin.IN) | ||
+ | encB = Pin(12, Pin.IN) | ||
+ | |||
+ | old_value_a = 1 | ||
+ | |||
+ | count = 0 | ||
+ | |||
+ | |||
+ | def print_lcd(data): | ||
+ | lcd.clear() | ||
+ | lcd.putstr(str(data)) | ||
+ | |||
+ | |||
+ | i2c = I2C(scl=Pin(5), | ||
+ | lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, | ||
+ | lcd.backlight_on() | ||
+ | |||
+ | |||
+ | while True: | ||
+ | value_a = encA.value() | ||
+ | value_b = encB.value() | ||
+ | |||
+ | if value_a != old_value_a: | ||
+ | if (value_a and value_b) or (not value_a and not value_b): | ||
+ | print(' | ||
+ | count += 1 | ||
+ | print_lcd(count) | ||
+ | elif (not value_a and value_b) or (value_a and not value_b): | ||
+ | print(' | ||
+ | count -= 1 | ||
+ | print_lcd(count) | ||
+ | old_value_a = value_a | ||
+ | </ | ||
+ | |||
+ | Настраиваем выводы для работы с энкодером: | ||
+ | <code python[enable_line_numbers=" | ||
+ | encA = Pin(13, Pin.IN) | ||
+ | encB = Pin(12, Pin.IN) | ||
+ | </ | ||
+ | |||
+ | Объявляем переменную '' | ||
+ | |||
+ | Чтобы лучше понять алгоритм работы программы еще раз посмотрим на график сигналов энкодера: | ||
+ | {{ : | ||
+ | |||
+ | В основном цикле программы получаем текущие состояния линий А и B. | ||
+ | Если состояние линии А изменилось, | ||
+ | <code python[enable_line_numbers=" | ||
+ | if (value_a and value_b) or (not value_a and not value_b): | ||
+ | </ | ||
+ | Если уровни сигналов А и B оба стали высокими (состояние 2) или оба стали низкими (состояние 0), то увеличиваем значение '' | ||
+ | |||
+ | Если условие выше не подтвердилось, | ||
+ | <code python[enable_line_numbers=" | ||
+ | elif (not value_a and value_b) or (value_a and not value_b): | ||
+ | </ | ||
+ | Если уровень сигнала А стал низким, | ||
+ | Если ни одно из этих условий не выполнено, | ||
+ | <code python[enable_line_numbers=" | ||
+ | old_value_a = value_a | ||
+ | </ | ||
+ | ==== Дополнительное задание ==== | ||
+ | <WRAP center round tip 60%> | ||
+ | * Попробуй убрать конденсаторы из схемы и покрутить энкодер. Программа будет работать не так, как хотелось бы. Необходимость конденсаторов станет очевидной. | ||
+ | </ |