STM32 + энкодер ky-040 (Arduino IDE)

Подключение энкодера ky-040 к отладочной плате STM32 базе микроконтроллера STM32F103C8T6 аналогично подключению к плате Arduino Nano (Uno), можно выбрать три свободные цифровых входа и использовать их для подключения энкодера.

Энкодер ky-040 имеет пять контактов (энкодер > STM32):

  • GND > G
  • +  > 3.3
  • CLK > любой цифровой вход
  • DT > любой цифровой вход
  • SW > любой цифровой вход (Кнопка энкодера)
#define pinA PB11
#define pinB PB10
#define SW   PB1
 
#include <STM32_Encoder.h> // http://rcl-radio.ru/wp-content/uploads/2020/01/STM32_Encoder.zip
  STM32_Encoder encoder(pinA, pinB);
  int position = 0;
 
void Read(){encoder.readAB();}
 
void setup(){
  encoder.begin();                                                         
  attachInterrupt(digitalPinToInterrupt(pinA),Read,CHANGE);  
  attachInterrupt(digitalPinToInterrupt(pinB),Read,CHANGE); 
  Serial.begin(115200);
  // encoder.setPosition(0);// начальная позиция
  pinMode(SW,INPUT); // SW 
}
 
void loop(){
 
  if(position != encoder.getPosition()){
    position = encoder.getPosition();
    Serial.println(position);}
 
  if(digitalRead(SW)==LOW){Serial.println("button");delay(300);}
}

Перед заливкой скетча в STM32 Вам необходимо ознакомиться со следующей статьей — STM32 Arduino IDE

Comments

  1. Подскажите как можно реализовать с помощью энкондера регулировку напряжения и тока,с точьностью до сотых,с выбором разряда при перестройке напряжения или тока

    1. Вот переменная (массив) int a[3] и int i которая будет номером разряда числа (см. в примере)

      Она содержит 3 цифры, это и есть Ваше число, пока оно int а не float

      int a[3],i;

      Кнопкой энкодера меняет разряд числа который надо поменять (кнопка подключена к пину 2)

      if(digitalRead(2)==LOW){i++;if(i>2){i=0;};delay(300);}

      Сам энкодер

      if(newPosition != oldPosition){
      a[i] = a[i]+newPosition;myEnc.write(0);newPosition=0;
      if(a[i]<0){a[i]=0;}if(a[i]>9){a[i]=9;}
      }

      Крутим энкодер = меняем значение разряда числа a[i]

      а эта строка if(a[i]<0){a[i]=0;}if(a[i]>9){a[i]=9;}

      просто ограничение числа в пределах от 0 до 9

      Это так пример.

  2. #define pinA PB11
    #define pinB PB10
    #define SW PB1
    #include
    #include
    #include

    STM32_Encoder encoder(pinA, pinB);
    int position = 0;
    void Read(){encoder.readAB();}

    int a[3];
    int i;

    LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display

    void setup()
    {

    encoder.begin();
    attachInterrupt(digitalPinToInterrupt(pinA),Read,CHANGE);
    attachInterrupt(digitalPinToInterrupt(pinB),Read,CHANGE);
    pinMode(SW,INPUT); // SW
    //lcd.init(); // initialize the lcd
    lcd.init();
    lcd.backlight();

    }

    void loop()
    {
    if(digitalRead(SW)==LOW){i++;if(i>2){i=0;};delay(300);}

    if(position != encoder.getPosition()){a[i] = a[i]+encoder.getPosition(); encoder.setPosition(0); if(a[i]9){a[i]=9;}}
    float data = (a[0]*100 + a[1]*10 + a[2])/100;

    lcd.setCursor(8,0);
    lcd.print (data);

Добавить комментарий

Войти с помощью: