Библиотека энкодера Encod_er.h
- Войдите на сайт для отправки комментариев
Чт, 08/06/2017 - 15:41
Здравствуйте, при написании скетча столкнулся с проблеммой, не могу понять как вставить условие, точнее какой оператор применить. В 19 и 29 строках вместо вопросов? Этот скетч и библа взяты отсюда: http://mypractic.ru/urok-55-rabota-s-inkrementalnym-enkoderom-v-arduino-biblioteka-encod_er-h.html#comment-5255
#include <TimerOne.h>
#include <Encod_er.h>
Encod_er encoder( 11, 12, 4);
void setup() {
Serial.begin(9600); // инициализируем порт, скорость 9600
Timer1.initialize(250); // инициализация таймера 1, период 250 мкс
Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний
}
void loop() {
if(encoder.timeRight != 0) {
Serial.print("R=");
Serial.print(encoder.timeRight);
Serial.print(" Pos=");
if(encoder.read() >= 4095){
??? = 4095;
}
Serial.println(encoder.read()); // вывод текущего положения
encoder.timeRight= 0;
}
if(encoder.timeLeft != 0) {
Serial.print("L=");
Serial.print(encoder.timeLeft);
Serial.print(" Pos=");
if(encoder.read() <= 0){
??? = 0;
}
Serial.println(encoder.read()); // вывод текущего положения
encoder.timeLeft= 0;
}
}
// обработчик прерывания 250 мкс
void timerInterrupt() {
encoder.scanState();
}
Т.е. Вы скачали скетч и ... вставили туда точки ... ? Зачем? Что Вы ообще делаете и что должен делать этот скетч?
Нет конечно.. Я испульзую этот скетч в своем проекте. Изначально 18-20 и 28-30 строк там нет . Мне нужно сделать ограничение что бы крутя энкодер я не опускался ниже нуля и не поднимался выше 4095. В тексте статьи написано
"long position – текущее положение энкодера. Может быть прочитано или записано.
long read() – метод чтения положения энкодера. Возвращает переменную position."
Но я не пойму какой синтаксис оператора position. При эксперементировании я добавил в свой проект вот такие строки
int en = encoder.read()*5; if(en <= 0){ en = 0; long position = 0; } else if(en >= 4095){ en = 4095; long position = 819; }Вообщем то получилось, но не совсем так как хотелось, действительно ограничивается 0 - 4095, но запоминается количество щелчков сверх лимита и приходится вертеть энкодер в обратную сторону столько раз сколько раз прокрутил лишка. Ранее я пользовался другой библой для энкодера, но сейчас приходится этой так как она нормально без проблемм заработала с другими устройствами у меня на I2C. Если необходимо я могу выложить и весь проек, он небольшой.
#include <TimerOne.h> #include <Encod_er.h> #include <Wire.h> #include <Adafruit_ADS1015.h> #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_TFTLCD.h> // Hardware-specific library #include <Adafruit_MCP4725.h> Adafruit_MCP4725 dac; Adafruit_ADS1115 ads(0x48); //Здесь указываем адрес устройства float Voltage1 = 0.0; float Voltage2 = 0.0; float Voltage3 = 0.0; float Voltage4 = 0.0; #define LCD_CS A3 // Chip Select goes to Analog 3 #define LCD_CD A2 // Command/Data goes to Analog 2 #define LCD_WR A1 // LCD Write goes to Analog 1 #define LCD_RD A0 // LCD Read goes to Analog 0 #define LCD_RESET A7 // Can alternately just connect to Arduino's reset pin Encod_er encoder( 11, 12, 4); // Assign human-readable names to some common 16-bit color values: #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define WWWW 0x0004 #define NAVY 0x000F #define REDD 0xFF00 Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); //const int KEY = 12; void setup(void) { Serial.begin(9600); // инициализируем порт, скорость 9600 Timer1.initialize(250); // инициализация таймера 1, период 250 мкс Timer1.attachInterrupt(timerInterrupt, 250); // задаем обработчик прерываний dac.begin(0x62); tft.begin(0x9341); tft.reset(); tft.cp437(true); tft.setRotation(1); tft.fillScreen(WWWW); // tft.setCursor(100, 0); tft.setTextColor(WHITE); tft.setTextSize(2); // tft.println(utf8rus("Температура")); tft.setCursor(100, 0); tft.println(utf8rus("Напряжение")); tft.setTextColor(REDD); tft.setCursor(0, 40); tft.println(utf8rus("Вход1 ")); tft.setCursor(0, 60); tft.println(utf8rus("Вход2 ")); tft.setCursor(0, 80); tft.setTextColor(RED); tft.println(utf8rus("Вход3 ")); tft.setCursor(0, 100); tft.println(utf8rus("Вход4 ")); tft.setCursor(100, 140); tft.println(utf8rus("Энкодер")); ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default) // ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV // ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV // ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV // ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV // ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV ads.begin(); } void loop(void) { int16_t adc0, adc1, adc2, adc3; uint32_t counter_1; if (encoder.timeRight != 0) { Serial.print("R="); Serial.print(encoder.timeRight); Serial.print(" Pos="); Serial.println(encoder.read()); // вывод текущего положения encoder.timeRight = 0; } if (encoder.timeLeft != 0) { Serial.print("L="); Serial.print(encoder.timeLeft); Serial.print(" Pos="); Serial.println(encoder.read()); // вывод текущего положения encoder.timeLeft = 0; } int en = encoder.read()*5; if(en <= 0){ en = 0; long position = 0; } else if(en >= 4095){ en = 4095; long position = 819; } adc0 = ads.readADC_SingleEnded(0) + 24; Voltage1 = (adc0 * 0.1875) / 1000; adc1 = ads.readADC_SingleEnded(1) + 24; Voltage2 = (adc1 * 0.1875) / 1000; adc2 = ads.readADC_SingleEnded(2); Voltage3 = (adc2 * 0.1875) / 1000; adc3 = ads.readADC_SingleEnded(3); Voltage4 = (adc3 * 0.1875) / 1000; //counter_1 = adc1 / 8; dac.setVoltage(en, false); tft.setTextColor(YELLOW, WWWW); tft.setCursor(70, 40); tft.print(adc0); tft.print(" "); tft.setCursor(170, 40); tft.print(Voltage1, 3); tft.print(" "); tft.setCursor(70, 60); tft.print(adc1); tft.print(" "); tft.setCursor(170, 60); tft.print(Voltage2, 3); tft.print(" "); tft.setCursor(70, 80); tft.print(adc2); tft.print(" "); tft.setCursor(170, 80); tft.print(Voltage3, 3); tft.print(" "); tft.setCursor(70, 100); tft.print(adc3); tft.print(" "); tft.setCursor(170, 100); tft.print(Voltage4, 3); tft.print(" "); tft.setCursor(150, 160); tft.print(encoder.read()); tft.println(" "); // delay(1000); } /* Recode russian fonts from UTF-8 to Windows-1251 */ String utf8rus(String source) { int i, k; String target; unsigned char n; char m[2] = { '0', '\0' }; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x30; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB8; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x70; break; } } } m[0] = n; target = target + String(m); } return target; } // обработчик прерывания 250 мкс void timerInterrupt() { encoder.scanState(); }Arduino nano +TFT+ ADC +DAC+Encoder. Энкодер задатчик для ЦАП.
Что Вы делаете в строках 110 и 114?
Думаю, там надо писать
encoder.position = ....
...
encoder.position = ....
Пробовал, "Nano_TFT_Encoder:110: error: expected initializer before '.' token
Не понял, как Вы написали? Можно текст программы.
Не понял, как Вы написали? ..
Спасибо, првильно выраженное недоумение.. это и есть ответ. :-)
int en = encoder.read()*5; if(en <= 0){ en = 0; encoder.position = 0; } else if(en >= 4095){ en = 4095; encoder.position = 819;Так правильно работает.
long encoder.position = 819; Так не правильно.
Странный Вы человек. Я же Вам писал в посте №3 безо всякого long. Зачем Вы его добавили? :)
Конец рабочего дня, пустой желудок.. , да еще долбанный ПЛК "Овен" глюканул остановил котельную..
Понятно, ну удачи Вам! Проблема кочилась? Всё нормально?
Уважаемый друг. Не могли бы вы поделиться со мной библиотекой encod_er.h . Мозг сломал. Не могу понять куда она делась. И найти нигде не могу..