Помощь в коде. (Датчик холла)

voviklost
Offline
Зарегистрирован: 11.01.2016

Добрый день, хочу сделать блокировку реверса двигателя, чтобы небыло лишних токов при его реверсирование, Решил применить датчик холла и магнит. Даже нашел подходящий скетч, только вот проблемма в том, что не могу дописать пару строчек, чтобы реле блокировало переключатель, пока двигатель вращаеться. 
Логика следующая, если на датчик холла поступает сигнал привышающий к примеру 10 об/мин. реле размыкает свои контакты и блокирует кнопку, как обороты упали ниже 10 об/мин, контакты замыкаются и реверс разрешен.
Как говориться помогите кто чем может) Что-то всю голову сломал)))

За основу брал этот код, он рабочий в монитор выводит показания.

unsigned long lastflash;
int RPM;

void setup() {
	Serial.begin(9600);  //открыть порт
	attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
	pinMode(3, OUTPUT);   //3 пин как выход
	digitalWrite(3, HIGH);  //подать 5 вольт на 3 пин
}
void sens() {
	RPM=60/((float)(micros()-lastflash)/1000000);  //расчет
	lastflash=micros();  //запомнить время последнего оборота
}

void loop() {
	if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
		RPM=0;  //считаем что RPM 0
	}
	Serial.println(RPM);   //вывод в порт
	delay(50);  //задержка для стабильности
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

voviklost пишет:

Как говориться помогите кто чем может) Что-то всю голову сломал)))

voviklost, Вы лучше почините голову и напишите эту несчастную строчку сами. Задача для пятикласника на уроке информатики. Даже неудобно как-то. Или Вы и есть пятикласник? 

voviklost
Offline
Зарегистрирован: 11.01.2016

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

Вот код который я написал:
 

unsigned long lastflash;
int RPM;

void setup() {
	Serial.begin(9600);  //открыть порт
	attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
	pinMode(3, OUTPUT);   //3 пин как выход
  	pinMode(5, OUTPUT);   //5 пин как выход
	digitalWrite(3, HIGH);  //подать 5 вольт на 3 пин
}
void sens() {
	RPM=1/((float)(micros()-lastflash)/1000000);  //расчет
	lastflash=micros();  //запомнить время последнего оборота
}

void loop() {
	if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
		RPM=0;  //считаем что RPM 0
	}
  
  if ((RPM) > 5){  //если обороты больше 5 об/сек
    digitalWrite(5, HIGH);  // включаем выход 5
  }
  
  else{  // в противном случае
    digitalWrite(5, LOW);  // выключаем выход 5
  }
    
	Serial.println(RPM);   //вывод в порт
	delay(50);  //задержка для стабильности
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, молодец! И зачем было вопросы задавать, если сами умеете?

voviklost
Offline
Зарегистрирован: 11.01.2016

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

voviklost
Offline
Зарегистрирован: 11.01.2016

Уважаемые знатоки, на данный момент код превратился вот в это:
 

unsigned long lastflash;
int RPM;
int button1 = 5;     // номер входа, подключенный к кнопке
int button2 = 8;     // номер входа, подключенный к кнопке


void setup() {
  Serial.begin(9600);  //открыть порт
  attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
  pinMode(12, OUTPUT);   //12 пин как выход
  pinMode(10, OUTPUT);   //10 пин как выход
  pinMode(9, OUTPUT);   //9 пин как выход
  pinMode(4, OUTPUT);   //4 пин как выход
  pinMode(11, OUTPUT);   //11 пин как выход
  digitalWrite(12, HIGH);  //подать 5 вольт на 3 пин
  pinMode(5, INPUT);   //5 пин как вход
  pinMode(8, INPUT);   //8 пин как вход

 
}
void sens() {
  RPM=1/((float)(micros()-lastflash)/1000000);  //расчет
  lastflash=micros();  //запомнить время последнего оборота
}

void loop() {
  if ((micros()-lastflash)>2000000){ //если сигнала нет больше 2х секунд
    RPM=0;  //считаем что RPM 0
  }
  
  if ((RPM) >= 1 && (RPM) <= 100){  //если обороты больше 0
  digitalWrite(9, HIGH);  // включаем выход 9
  }
  

  else {  // в противном случае
  digitalWrite(9, LOW);  // выключаем выход 9
  }

if (((RPM) > -1 && (RPM) < 1) && (digitalRead(button1) == HIGH) && (digitalRead(button2) == LOW)) {   //Если обороты меньше или равны 0, если нажата первая кнопка и не нажата кнопка 2
digitalWrite(10, LOW);   //Включаем реле

 }

else if (digitalRead(button1) == LOW) {   //если кнопка 1 выключена
digitalWrite(10, HIGH);   //выключаем реле

}

if (((RPM) > -1 && (RPM) < 1) && (digitalRead(button2) == HIGH) && (digitalRead(button1) == LOW)) {   //Если обороты меньше или равны 0, если нажата вторая кнопка и не нажата кнопка 1
 digitalWrite(11, LOW);   //включаем реле

 }

else if (digitalRead(button2) == LOW) {   //если кнопка 2 выключена
digitalWrite(11, HIGH);   //выключаем реле

}

if (digitalRead(button1) == HIGH) {   //Если включена первая кнопка
 digitalWrite(4, LOW);   //Включаем блокировку

 }

else if (digitalRead(button2) == HIGH) {   //Если включена вторая кнопка
digitalWrite(4, LOW);   //включаем блокировку

 }

else {   //если кнопка 1 выключена
digitalWrite(4, HIGH);   //выключаем блокировку


}
    
  Serial.println(RPM);   //вывод в порт
  delay(50);  //задержка для стабильности
}

Вместо кнопки используется джойтик с фиксацией, возникла проблемма следующего характера, при резком переключение джойтика возникают помехи которые я так и не смог убрать в железе, и блокировка не работает. Есть идея добавить в строчку: 

if (((RPM) > -1 && (RPM) < 1) && (digitalRead(button1) == HIGH) && (digitalRead(button2) == LOW)) {   //Если обороты меньше или равны 0, если нажата первая кнопка и не нажата кнопка 2
digitalWrite(10, LOW);   //Включаем реле

Зедержку, чтобы при отключение кнопки помехи проходили сами собой. Пробывал delay, но он останавливает скетч и происходит бред. Прошу помоши более грамотных форумчан.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

voviklost пишет:

возникают помехи которые я так и не смог убрать в железе, 

Есть 100500 способов убрать дребезг аппаратно и ещё 100500 - программно.

Вот хорошая статья о том как это делается и аппаратно, и программно.