Датчик Холла и светодиод

dbv1991
Offline
Зарегистрирован: 07.11.2016

Добрый день!

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

Обработчик нажатия кнопки как нужно правильно записать: использовать ли логическую переменную или просто цикл while пока включен тумблер?

Подскажите, пожалуйста!

Спасибо!

 

#define led 7  //светодиод
#define BUTTON_PIN  10  //кнопка запуска обратного отсчкта
#define SensorPin1 A0   //датчик холла

int SensorVal1=LOW;

int clicks=9; 

boolean BUTT_PIN=false;

 void setup()   
 { 
      Serial.begin(9600);
       pinMode (SensorPin1, INPUT);
        pinMode(BUTTON_PIN, OUTPUT);
      pinMode(led, OUTPUT);  
 } 

 void loop() 

 { 
       
   SensorVal1 = digitalRead(SensorPin1);

    //
    if(SensorVal1 == HIGH)
      {
        // Сообщение
       Serial.println("YES");
         digitalWrite(7, HIGH);
      }
    else  
      {
        // Сообщение
       Serial.println("NO");
         digitalWrite(7, LOW);
      }

while (digitalRead(BUTTON_PIN)&&!BUTT_PIN&&SensorVal1==HIGH)
{
  for(clicks; clicks>=0; clicks--)
 {
  while(SensorVal1==HIGH)
  {
    digitalWrite(led,HIGH);
  }
 }
}

}
 
 

 

kasper007
Offline
Зарегистрирован: 23.05.2016

а что делать если программа еще до 0 не досчитала, а магнит убрали? тоже досчитать до нуля или прекратить считать?

BUTTON_PIN я так подозреваю это вход тумблера? Тогда почему он OUTPUT?

pinMode(BUTTON_PIN, OUTPUT);

Строки 23-37 противоречат заданию. В них мы зажигаем светодиод при срабатывании датчика холла без проверки тумблера и без обратного отсчета.

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

 

 

dbv1991
Offline
Зарегистрирован: 07.11.2016

Да, если начался отсчет то все равно досчитать до нуля и ждать пока снова не включат тумблер.

Да, с OUTPUT ошибься.

На бумаге понятно, а как запрограммировать- не очень.

Определяем состоянии датчика Холла (по умолчанию int SensorVal1=LOW), если сигнал есть то выводим в серийный порт YES иначе NO.

Включили тумблер( как я понимаю нужно переключить логическое состояние BUTT_REV=true или или написать &&!BUTT_PIN или я ошибаюсь, поправьте пожалуйста), проверили датчик холла, если все в порядке начинаем цмклически отсчитывать от 9 до 0 for(clicks; clicks>=0; clicks--).

При достижении нуля загорается светодиод digitalWrite(led,HIGH); и горит пока while(SensorVal1==HIGH) не убрали магнит от датчика Холла.

Потом снова поднесли, сработал датчик и начился обратный отсчет.

Как надо исправить чтобы светодиод загорался именно после окончания отсчета? Я пока не соображу как это правильно записать...

dbv1991
Offline
Зарегистрирован: 07.11.2016

Ввести условие if clicks=0

while (SensorVal1==High)

{

digitalWrite (led, HIGH)

}

Так можно?

bwn
Offline
Зарегистрирован: 25.08.2014

"На бумаге понятно, а как запрограммировать- не очень."

А что делать если снова поднесли, а счет еще не окончен? Рисуйте полный алгоритм, а потом просто переводите его в команды.
Т.к. на бумаге явно не понятно. Да и while здесь не очень нужен, вы ведь loop никуда не убрали.

kasper007
Offline
Зарегистрирован: 23.05.2016

Итак самое главное это то, что без тумблера вообще ничего не должно работать. Значит сразу после loop() нужно сделать один большой if на тумблер
 

loop()

{

if (digitalRead(BUTTON_PIN)) {

тут все остальные проверки, отсчеты, включения, в общем все дела, пока тумблер включен

} else {

тумблер выключен - жизни нет, на всякий случай выключаем светодиод:

digitalWrite(led,LOW);

}

}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Посмотрите такое решение - может подойдет

#define led 7  //светодиод
#define BUTTON_PIN  10  //кнопка запуска обратного отсчкта
#define SensorPin1 A0   //датчик холла
unsigned long time;
bool f_time;

void setup()
{
	Serial.begin(9600);
	pinMode (SensorPin1, INPUT);
	pinMode(BUTTON_PIN, INPUT);
	pinMode(led, OUTPUT);
}

void loop()
{
	if (digitalRead(SensorPin1)){
		if (BUTTON_PIN){
			if (!f_time){
				time = millis();
				f_time = 1;
			}
			if (millis()- time >= 9000){//Пауза 9 сек
				digitalWrite(led, HIGH);
				Serial.println("YES");
			}
			
		}
		else {
			digitalWrite(led, LOW);
			f_time = 0;
			Serial.println("NO");
		}
	}
	else {
		digitalWrite(led, LOW);
		f_time = 0;
		Serial.println("NO");
	}
}