Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| products:laboratory_iot:exp35 [2020/05/22 13:36] – labuser29 | products:laboratory_iot:exp35 [2024/11/16 11:25] (текущий) – [Программный код эксперимента] labuser30 | ||
|---|---|---|---|
| Строка 23: | Строка 23: | ||
| ==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== | ||
| - | <file python Exp35[enable_line_numbers=" | + | <file python Exp35.py[enable_line_numbers=" |
| from time import sleep_ms, ticks_ms | from time import sleep_ms, ticks_ms | ||
| from machine import I2C, Pin | from machine import I2C, Pin | ||
| Строка 29: | Строка 29: | ||
| _init() | _init() | ||
| - | DEFAULT_I2C_ADDR = 0x3F | + | DEFAULT_I2C_ADDR = 0x3F # Или 0x27 в зависимости от модели микросхемы на плате |
| encA = Pin(13, Pin.IN) | encA = Pin(13, Pin.IN) | ||
| Строка 35: | Строка 35: | ||
| states = ( | states = ( | ||
| - | (1,1), | ||
| - | (0,1), | ||
| (0,0), | (0,0), | ||
| - | (1,0) | + | (1,0), |
| + | (1,1), | ||
| + | (0,1) | ||
| ) | ) | ||
| Строка 60: | Строка 60: | ||
| value_b = encB.value() | value_b = encB.value() | ||
| - | | + | |
| | | ||
| - | if (current_state | + | if (state - old_state == 1) or (state == 0 and old_state == 3): |
| count += 1 | count += 1 | ||
| - | | + | print(' |
| - | | + | print_lcd(count) |
| - | print_lcd(int(count/2)) | + | old_state = state |
| - | old_state = current_state | + | elif (state - old_state == -1) or (state == 3 and old_state == 0): |
| - | elif (current_state | + | |
| count -= 1 | count -= 1 | ||
| - | | + | print(' |
| - | | + | print_lcd(count) |
| - | print_lcd(int(count/2)) | + | old_state = state |
| - | old_state = current_state | + | |
| </ | </ | ||
| + | |||
| + | Описываем возможные состояния конечного автомата: | ||
| + | <code python[enable_line_numbers=" | ||
| + | states = ( | ||
| + | (0,0), | ||
| + | (1,0), | ||
| + | (1,1), | ||
| + | (0,1) | ||
| + | ) | ||
| + | </ | ||
| + | Список из 4 элементов. В каждом элементе первая цифра это состояние сигнала A, вторая — сигнала B. | ||
| + | Номер состояния — это индекс элемента списка. Логика переключения состояний автомата простая — состояние может смениться только на соседнее: | ||
| + | |||
| + | В переменной '' | ||
| + | |||
| + | В основном цикле программы мы получаем данные о текущем состоянии линий А и B: | ||
| + | <code python[enable_line_numbers=" | ||
| + | value_a = encA.value() | ||
| + | value_b = encB.value() | ||
| + | </ | ||
| + | |||
| + | И определяем номер состояния конечного автомата, | ||
| + | <code python[enable_line_numbers=" | ||
| + | state = states.index((value_a, | ||
| + | </ | ||
| + | |||
| + | Формируем список с состояниями А и B '' | ||
| + | с помощью оператора '' | ||
| + | |||
| + | Теперь мы знаем индекс только что измеренного состояния линий. А индекс последнего состояния конечного автомата хранится в переменной '' | ||
| + | |||
| + | <code python[enable_line_numbers=" | ||
| + | if (state - old_state == 1) or (state == 0 and old_state == 3): | ||
| + | </ | ||
| + | |||
| + | Если индекс нового состояния на 1 больше старого или, если новое состояние 0, а старое 3, то регистрируем переход в новое состояние. Переводим конечный автомат в новое состояние '' | ||
| + | |||
| + | Аналогично для вращения в обратную сторону. Если индекс состояния уменьшился на один, то производим аналогичные действия. | ||
| + | |||
| + | Когда ты запустишь эту программу в конструкторе, | ||