Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp34 [2024/11/15 20:39] – создано labuser30products:laboratory_iot_c:exp34 [2024/11/16 11:11] (текущий) – [Программный код эксперимента] labuser30
Строка 25: Строка 25:
  
 <file arduino Exp34.ino[enable_line_numbers="2", start_line_numbers_at="1"]> <file arduino Exp34.ino[enable_line_numbers="2", start_line_numbers_at="1"]>
-from time import sleep_ms, ticks_ms +#include <LCDI2C_Multilingual.h>
-from machine import I2C, Pin +
-from esp8266_i2c_lcd import I2cLcd +
-_init()+
  
-DEFAULT_I2C_ADDR 0x3F Или 0x27 в зависимости от модели микросхемы на плате+#define ENC_A 13 
 +#define ENC_B 12   
 +#define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT
  
-encA = Pin(13Pin.IN) +LCDI2C_Generic lcd(DEFAULT_I2C_ADDR162)
-encB = Pin(12Pin.IN)+
  
-old_value_a 1+bool value_a 0; 
 +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): +  Serial.begin(9600); 
-    lcd.clear() +  lcd.init() 
-    lcd.putstr(str(data)+  lcd.setBacklight(0) 
- +  pinMode(ENC_AINPUT); 
- +  pinMode(ENC_BINPUT); 
-i2c = I2C(scl=Pin(5)sda=Pin(4), freq=400000+  printLcd(count);         
-lcd = I2cLcd(i2cDEFAULT_I2C_ADDR, 2, 16+} 
-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)+      Serial.println("+"); 
-            print('+'+      printLcd(count); 
-            count += 1  +    }  
-            print_lcd(count) +    else if ((not value_a and value_b) or (value_a and not value_b)) { 
-        elif (not value_a and value_b) or (value_a and not value_b)+      count--; 
-            print('-'+      Serial.println("-"); 
-            count -= 1 +      printLcd(count); 
-            print_lcd(count) +    
-    old_value_a = value_a+  } 
 +  value_a_old = value_a
 +}
 </file> </file>
  
 Настраиваем выводы для работы с энкодером: Настраиваем выводы для работы с энкодером:
-<code python[enable_line_numbers="2", start_line_numbers_at="8"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="23"]> 
-encA = Pin(13Pin.IN+  pinMode(ENC_AINPUT); 
-encB = Pin(12Pin.IN)+  pinMode(ENC_BINPUT);
 </code> </code>
  
-Объявляем переменную ''old_value_a'' для хранения предыдущего сосотяния сигнала A и переменную ''count'' в которой подсчитываем количество сигналов от энкодера.+Переменная ''old_value_a'' будет хранить предыдущее состояния сигнала A,  в переменной ''count'' будем считать количество сигналов от энкодера.
  
 Чтобы лучше понять алгоритм работы программы еще раз посмотрим на график сигналов энкодера: Чтобы лучше понять алгоритм работы программы еще раз посмотрим на график сигналов энкодера:
Строка 79: Строка 85:
 В основном цикле программы получаем текущие состояния линий А и B.   В основном цикле программы получаем текущие состояния линий А и B.  
 Если состояние линии А изменилось, то проверяем условие вращения против часовой стрелки: Если состояние линии А изменилось, то проверяем условие вращения против часовой стрелки:
-<code python[enable_line_numbers="2", start_line_numbers_at="31"]> +<code python[enable_line_numbers="2", start_line_numbers_at="33"]> 
-        if (value_a and value_b) or (not value_a and not value_b):+   if ((value_a and value_b) or (not value_a and not value_b)
 </code> </code>
 Если уровни сигналов А и B оба стали высокими (состояние 2) или оба стали низкими (состояние 0), то увеличиваем значение ''count'' на 1, печатаем в терминал символ ''+'' и обновляем информацию на дисплее. Если уровни сигналов А и B оба стали высокими (состояние 2) или оба стали низкими (состояние 0), то увеличиваем значение ''count'' на 1, печатаем в терминал символ ''+'' и обновляем информацию на дисплее.
  
 Если условие выше не подтвердилось, то проверяем второй вариант: вращение по часовой стрелке: Если условие выше не подтвердилось, то проверяем второй вариант: вращение по часовой стрелке:
-<code python[enable_line_numbers="2", start_line_numbers_at="35"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="38"]> 
-        elif (not value_a and value_b) or (value_a and not value_b):+    else if ((not value_a and value_b) or (value_a and not value_b)):
 </code> </code>
 Если уровень сигнала А стал низким, а сигнала B высоким (состояние 3) или уровень сигнала А стал высоким, а B низким (состояние 1), то уменьшаем значение ''count'' на 1, печатаем символ ''-'' в терминал и обновляем информацию на дисплее. Если уровень сигнала А стал низким, а сигнала B высоким (состояние 3) или уровень сигнала А стал высоким, а B низким (состояние 1), то уменьшаем значение ''count'' на 1, печатаем символ ''-'' в терминал и обновляем информацию на дисплее.
  
 Если ни одно из этих условий не выполнено, то игнорируем сигналы. Перед завершением итерации записываем текущее состояние линии А как старое, для использования в следующей итерации. Если ни одно из этих условий не выполнено, то игнорируем сигналы. Перед завершением итерации записываем текущее состояние линии А как старое, для использования в следующей итерации.
-<code python[enable_line_numbers="2", start_line_numbers_at="39"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="44"]> 
-    old_value_a = value_a+  value_a_old = value_a;
 </code> </code>
 ==== Дополнительное задание ==== ==== Дополнительное задание ====