Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| products:laboratory_iot_c:exp34 [2024/11/15 20:39] – создано labuser30 | products:laboratory_iot_c:exp34 [2024/11/16 11:11] (текущий) – [Программный код эксперимента] labuser30 | ||
|---|---|---|---|
| Строка 25: | Строка 25: | ||
| <file arduino Exp34.ino[enable_line_numbers=" | <file arduino Exp34.ino[enable_line_numbers=" | ||
| - | from time import sleep_ms, ticks_ms | + | #include < |
| - | from machine import I2C, Pin | + | |
| - | from esp8266_i2c_lcd import I2cLcd | + | |
| - | _init() | + | |
| - | DEFAULT_I2C_ADDR | + | #define ENC_A 13 |
| + | #define ENC_B 12 | ||
| + | # | ||
| - | encA = Pin(13, Pin.IN) | + | LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 16, 2); |
| - | encB = Pin(12, Pin.IN) | + | |
| - | old_value_a | + | bool value_a |
| + | bool value_a_old = 0; | ||
| + | bool value_b = 0; | ||
| + | int count = 0; | ||
| - | count = 0 | + | void printLcd(int number) { |
| + | lcd.clear(); | ||
| + | lcd.print(number); | ||
| + | } | ||
| - | + | void setup() { | |
| - | def print_lcd(data): | + | |
| - | lcd.clear() | + | lcd.init(); |
| - | lcd.putstr(str(data)) | + | lcd.setBacklight(0); |
| - | + | | |
| - | + | | |
| - | i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000) | + | |
| - | lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, | + | } |
| - | lcd.backlight_on() | + | |
| - | + | void loop() { | |
| - | + | value_a = digitalRead(ENC_A); | |
| - | while True: | + | value_b = digitalRead(ENC_B); |
| - | value_a = encA.value() | + | |
| - | value_b = encB.value() | + | if (value_a != value_a_old) { |
| - | + | if ((value_a and value_b) or (not value_a and not value_b)) | |
| - | if value_a != old_value_a: | + | count++; |
| - | if (value_a and value_b) or (not value_a and not value_b): | + | |
| - | print(' | + | printLcd(count); |
| - | count += 1 | + | } |
| - | | + | else if ((not value_a and value_b) or (value_a and not value_b)) |
| - | | + | count--; |
| - | print(' | + | |
| - | count -= 1 | + | printLcd(count); |
| - | | + | |
| - | | + | } |
| + | value_a_old | ||
| + | } | ||
| </ | </ | ||
| Настраиваем выводы для работы с энкодером: | Настраиваем выводы для работы с энкодером: | ||
| - | < | + | < |
| - | encA = Pin(13, Pin.IN) | + | |
| - | encB = Pin(12, Pin.IN) | + | |
| </ | </ | ||
| - | Объявляем переменную '' | + | Переменная '' |
| Чтобы лучше понять алгоритм работы программы еще раз посмотрим на график сигналов энкодера: | Чтобы лучше понять алгоритм работы программы еще раз посмотрим на график сигналов энкодера: | ||
| Строка 79: | Строка 85: | ||
| В основном цикле программы получаем текущие состояния линий А и B. | В основном цикле программы получаем текущие состояния линий А и B. | ||
| Если состояние линии А изменилось, | Если состояние линии А изменилось, | ||
| - | <code python[enable_line_numbers=" | + | <code python[enable_line_numbers=" |
| - | if (value_a and value_b) or (not value_a and not value_b): | + | |
| </ | </ | ||
| Если уровни сигналов А и B оба стали высокими (состояние 2) или оба стали низкими (состояние 0), то увеличиваем значение '' | Если уровни сигналов А и B оба стали высокими (состояние 2) или оба стали низкими (состояние 0), то увеличиваем значение '' | ||
| Если условие выше не подтвердилось, | Если условие выше не подтвердилось, | ||
| - | < | + | < |
| - | | + | else if ((not value_a and value_b) or (value_a and not value_b)): |
| </ | </ | ||
| Если уровень сигнала А стал низким, | Если уровень сигнала А стал низким, | ||
| Если ни одно из этих условий не выполнено, | Если ни одно из этих условий не выполнено, | ||
| - | < | + | < |
| - | | + | |
| </ | </ | ||
| ==== Дополнительное задание ==== | ==== Дополнительное задание ==== | ||