Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
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)): |
</ | </ | ||
Если уровень сигнала А стал низким, | Если уровень сигнала А стал низким, | ||
Если ни одно из этих условий не выполнено, | Если ни одно из этих условий не выполнено, | ||
- | < | + | < |
- | | + | |
</ | </ | ||
==== Дополнительное задание ==== | ==== Дополнительное задание ==== |