Подключение энкодера
- Войдите на сайт для отправки комментариев
Втр, 24/01/2017 - 11:38
#include <EEPROM.h> int pinAch = 2; //Энкодер вывод А включен на interrupt 0 (D2) int pinBch = 3; // Энкодер вывод Б - D3 int pinled = 5; // Куда включен первый сетодиодик int ledcount = 8; // Сколько светодиодиков int pinButton = A5; // куда включена кнопка "пуск" int pinRelay = A0; // Куда подключено реле int impulsTime = 50; // Время включения реле по умолчанию (50 мс) int relayShift = 2; // Время реакции реле unsigned long bl; // переменная для хранения состояния "мигающего" светодиода unsigned long dr; // переменная для антидребезга энкодера int out=0; // мы бабахнули? void setup() { Serial.begin(9600); pinMode(pinAch, INPUT_PULLUP); pinMode(pinBch, INPUT_PULLUP); pinMode(pinled, OUTPUT); pinMode(pinled+1, OUTPUT); pinMode(pinled+2, OUTPUT); pinMode(pinled+3, OUTPUT); pinMode(pinled+4, OUTPUT); pinMode(pinled+5, OUTPUT); pinMode(pinled+6, OUTPUT); pinMode(pinled+7, OUTPUT); pinMode(13, OUTPUT); // светодиодик, впаянный в ардуинку pinMode(pinButton, INPUT_PULLUP); pinMode(pinRelay, OUTPUT); digitalWrite(pinled, HIGH); // все светодидиоды включить для проверки digitalWrite(pinled+1, HIGH); digitalWrite(pinled+2, HIGH); digitalWrite(pinled+3, HIGH); digitalWrite(pinled+4, HIGH); digitalWrite(pinled+5, HIGH); digitalWrite(pinled+6, HIGH); digitalWrite(pinled+7, HIGH); digitalWrite(pinRelay,LOW); // для безопасности dr=millis(); bl=millis(); if(EEPROM.read(0)==1) { impulsTime=EEPROM.read(1); } attachInterrupt(0, encoderClick, RISING); } void loop() { // Зажигаем светодиодики в зависимости от уровня impulsTime for(int i=pinled;i<(pinled+ledcount);i++) { int s=(i-pinled+1)*10; // время импульса для зажигания светодиода // то есть для 1 светодиода 10, для 2 - 20 и так далее if((impulsTime-s)<0 && (impulsTime-s)>-10) // этот светодиодик промежуточный, поэтому пусть мигает. { if((millis()-bl)<500) { digitalWrite(i,HIGH); } else { digitalWrite(i,LOW); if((millis()-bl)>1000) { bl=millis(); } } } else { if(s<=impulsTime) { digitalWrite(i,HIGH); } else { digitalWrite(i,LOW); } } } if(digitalRead(pinButton)==LOW && out==0) // оппа, кнопку нажали и еще не бабахали { delay(100); // ждем 100мс - вдруг рука дрогнула if(digitalRead(pinButton)==LOW) // точно нажата? { digitalWrite(13,HIGH); digitalWrite(pinRelay,HIGH); out=1; delay(impulsTime+relayShift); digitalWrite(13,LOW); digitalWrite(pinRelay,LOW); out=1; EEPROM.write(0, 1); // ставим флаг EEPROM.write(1, impulsTime); } } if(digitalRead(pinButton)==HIGH && out==1) // Кнопку отпустили после бабханья { delay(100); // ждем 100мс - вдруг рука дрогнула if(digitalRead(pinButton)==HIGH) // до сих пор отпущена? { out=0; // Хорошо, можно еще раз бабахнуть } } // Serial.println(impulsTime); // delay(300); } // обработка энкодера void encoderClick(){ if((millis()-dr)>10) // От предидущего прерывания прошло больше 10мс? если нет, то это дребезг { dr=millis(); int valA = digitalRead(pinAch); int valB = digitalRead(pinBch); if (valA != valB){ impulsTime--; } else{ impulsTime++; } if(impulsTime < 5) { impulsTime=5; } if(impulsTime > 100) { impulsTime=100; } Serial.println(impulsTime); } }
Имеется скетч задающий определенную длинну импульса для точечной сварки. Время импульса отображается в виде шкалы светодиодов и задается энкодером. Заливаю скетч в MINI pro 328P ? компелируется и шьется корректно, но не один из подключенных энкодеров должным оюразом так и не заработал. Подскажите нет ли ошибки в программе?
ни один не работает
не один, а два
*урок рускага языга, белый ниггер.
там больше ошибок...
для энкодера эту библиотеку используй с флагом #define ENCODER_DO_NOT_USE_INTERRUPTS
https://www.pjrc.com/teensy/td_libs_Encoder.html
А в чем ошибка в этом коде? По словам автора он работает.
А в чем ошибка в этом коде? По словам автора он работает.
самая правильная проверка кода - собрать, залить, оценить результат
Собрал, залил, оценил, грешил на энкодер подкинул разные безрезультатно. Энкодер кручу иногда срабатывает но один раз из десяти. Источник: https://blog.kaloshin.ru/2015/01/11/svarochnik/
Разобрался. Все работает. Код рабочий.
самая правильная проверка кода - собрать, залить, оценить результат
Отнюдь.
Такая "проверка" совершенно не гарантирует, что через 5 минут (5 дней) не перестанет работать.