Датчик Холла и светодиод
- Войдите на сайт для отправки комментариев
Втр, 29/11/2016 - 11:02
Добрый день!
Нужна Ваша помощь, необходимо чтобы программа по включению тумблера и при условии что сработал датчик Холла циклически производила обратный отсчет с 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); } } } }
а что делать если программа еще до 0 не досчитала, а магнит убрали? тоже досчитать до нуля или прекратить считать?
BUTTON_PIN я так подозреваю это вход тумблера? Тогда почему он OUTPUT?
pinMode(BUTTON_PIN, OUTPUT);
Строки 23-37 противоречат заданию. В них мы зажигаем светодиод при срабатывании датчика холла без проверки тумблера и без обратного отсчета.
Нарисуйте для себя логическую схему на бумаге, что в какой последовательности должно случиться, прежде чем загорится светодиод.
Да, если начался отсчет то все равно досчитать до нуля и ждать пока снова не включат тумблер.
Да, с OUTPUT ошибься.
На бумаге понятно, а как запрограммировать- не очень.
Определяем состоянии датчика Холла (по умолчанию
int
SensorVal1=LOW
), если сигнал есть то выводим в серийный порт YES иначе NO.Включили тумблер( как я понимаю нужно переключить логическое состояние
BUTT_REV=true или
или написать&&!BUTT_PIN
или я ошибаюсь, поправьте пожалуйста), проверили датчик холла, если все в порядке начинаем цмклически отсчитывать от 9 до 0for
(clicks; clicks>=0; clicks--)
.При достижении нуля загорается светодиод
digitalWrite(led,HIGH);
и горит покаwhile
(SensorVal1==HIGH)
не убрали магнит от датчика Холла.Потом снова поднесли, сработал датчик и начился обратный отсчет.
Как надо исправить чтобы светодиод загорался именно после окончания отсчета? Я пока не соображу как это правильно записать...
Ввести условие if clicks=0
while (SensorVal1==High)
{
digitalWrite (led, HIGH)
}
Так можно?
"На бумаге понятно, а как запрограммировать- не очень."
А что делать если снова поднесли, а счет еще не окончен? Рисуйте полный алгоритм, а потом просто переводите его в команды.
Т.к. на бумаге явно не понятно. Да и while здесь не очень нужен, вы ведь loop никуда не убрали.
Итак самое главное это то, что без тумблера вообще ничего не должно работать. Значит сразу после loop() нужно сделать один большой if на тумблер
Посмотрите такое решение - может подойдет