Подключение энкодера
- Войдите на сайт для отправки комментариев
Втр, 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 дней) не перестанет работать.