Подключение энкодера 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
Подскажите как можно реализовать с помощью энкондера регулировку напряжения и тока,с точьностью до сотых,с выбором разряда при перестройке напряжения или тока
Вот похожий пример реализации
http://rcl-radio.ru/?p=128106
удобно регулировать целые числа,но с десятыми и сотыми уже всю голову сломал)
а если только с помощью только этой библиотеки из примера?
Вам нужно при помощи энкодера менять число состоящее из трех-четырех цифр, я правильно понял?
да упровлять одной переменной float u (например) 0.00 и при нажатии кнопки энкондера прибовлять или убовлять десятые,и так же сотые
тоесть при нажатии кнопки переключялся разряд
Вот переменная (массив) 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
Это так пример.
Далее переменные массива a[i], соберем в одно число
float data = (a[0]*100 + a[1]*10 + a[2])/100;
Спасибо вам большое за быструю помощь!,буду разбиратся.
#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);
не совсем наверное понял,меняется только первая цыфра ,после запятой не меняется
Сделайте пока так
float data = (a[0]*100 + a[1]*10 + a[2])/100;
замените на
float data = (a[0]*100 + a[1]*10 + a[2]);
работает, целые числа до запятой меняются по десяткам сотням и еденицам
float data = float(a[0]*100 + a[1]*10 + a[2])/100.00;
или так
float data = (float)(a[0]*100 + a[1]*10 + a[2])/100.00;
спасибо большое! заработало!) первый вариант