Помогите в написании простейшей программы, я запутался!

FabiousBIT
FabiousBIT аватар
Offline
Зарегистрирован: 11.03.2015

Здравствуйте,  дорогие эксперты всея форума, купил ардуино 7 дней назад, активно учусь, пытаюсь творить,но увы все встречаются с проблемами...  Так вот, первый мой проэкт который я пытаюсь вывести на белый свет - доводчик для двери. Зачем, я рассказывать не буду, но для этого есть очень весомые причины. Расскажу о простейшем механизме, на двери есть контакт, который замыкается когда дверь закрывается, и двигатель, который медленно (специально) подтягивает дверь к закрытию...

Я пишу программу, и никак не могу сделать то что мне надо, попробую объяснить:

Если контакт разошёлся(тобишь LOW) 

Подождать 15 секунд.

После уже ПОДАВАТЬ HIGH НА ДВИГАТЕЛЬ ПОКА, КОНТАКТЫ НЕ СОЙДУТСЯ (ТОБИШЬ HIGH).

Я понимаю, просто, но одно условие есть, после того как дверь замкнёт контакт двигатель СРАЗУ должен прекратить работу, а у меня получается так, что программа ждет 15сек включает двигатель и опять 15сек ждёт (дверь то уже давно закрылась) двигатель продолжает работу, начинает грется и т.д. потом после задержки он проверяет условие и выключает уже...

Я перепробовал все функции))) Как-то даже приплетал for(;;;) и т.д. Я сейчас пишу с планшета, ибо невтерпёж, прейду на комп кому ндо будет пришлю макет программу...

AlexeyPG
Offline
Зарегистрирован: 15.02.2015

исходничек свой покажите

FabiousBIT
FabiousBIT аватар
Offline
Зарегистрирован: 11.03.2015

Секунду, я живу в ХРЕНЗНАЕТГДЕНСКЕ поэтому интернет тут 32кб\сек...

FabiousBIT
FabiousBIT аватар
Offline
Зарегистрирован: 11.03.2015

void setup()
{
  pinMode( 3 , OUTPUT); //пьеза 
  pinMode( 2 , INPUT); //датчик
  pinMode( 4 , OUTPUT); // доводчик
}

void loop()
{

   digitalRead(2);
  if (digitalRead(2) == HIGH)
  {
    digitalWrite( 4 , LOW );
    
  }
  else
  {
  delay(15000);
  do{digitalWrite(4,HIGH);}
  while(digitalRead(2) == HIGH);
   
    
  }
}

 

FabiousBIT
FabiousBIT аватар
Offline
Зарегистрирован: 11.03.2015

Я слишком неопытный наверн)))

FabiousBIT
FabiousBIT аватар
Offline
Зарегистрирован: 11.03.2015

Ладно, раз никто не отвечает, я уйду, ответите - мне придёт оповещение и я вернусь...

AlexeyPG
Offline
Зарегистрирован: 15.02.2015

Лучше было сделать проверку по низкому уровню на входе и, как вывод, осуществление действий (задержка 15 сек и работа движка до полного закрывания). Если на датчике HIGH, то ничего делаться не будет.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

 

Во-первых,вход с неопределённым значением (датчик в Вашем случае) лучше подтянуть к земле резистором на 10кОм - иначе,при возикновении наводок на входе у вас получится случайное срабатывание.Далее, у вас ошибочка в коде) Надо так:

while(digitalRead(2) == 0) {
//что-то делаем
}
0 потому,что пока дверь двигается,на датчика ноль;потом датчик установит вход в 1,условие не будет выполняться.

 

FabiousBIT
FabiousBIT аватар
Offline
Зарегистрирован: 11.03.2015

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

FabiousBIT
FabiousBIT аватар
Offline
Зарегистрирован: 11.03.2015

Yarik.Yar пишет:

 

Во-первых,вход с неопределённым значением (датчик в Вашем случае) лучше подтянуть к земле резистором на 10кОм - иначе,при возикновении наводок на входе у вас получится случайное срабатывание.Далее, у вас ошибочка в коде) Надо так:

while(digitalRead(2) == 0) {
//что-то делаем
}
0 потому,что пока дверь двигается,на датчика ноль;потом датчик установит вход в 1,условие не будет выполняться.

 

Сейчас я попробую... В моем случае задержка перед началом закрывания двери обязательна... секунду...

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

 

Функция do...while сначала делает,потом проверяет условие,то есть хотя бы один раз она что-то сделает.А функция из моего поста сначала проверяет,потом делает.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

 

Для задержки пихните внутрь while delay() или через millis считайте....

FabiousBIT
FabiousBIT аватар
Offline
Зарегистрирован: 11.03.2015

Спасибо, ребят, то что надо! обожаю вас! Оказывается я не правильно  писал условие команды while я писал вместо 0 и 1 HIGH и LOW, кстати почему мой вариант неверный?

FabiousBIT
FabiousBIT аватар
Offline
Зарегистрирован: 11.03.2015

void setup()
{
  Serial.begin(9600);
  pinMode( 3 , OUTPUT); //пьеза 
  pinMode( 2 , INPUT); //датчик
  pinMode( 4 , OUTPUT); // доводчик
}

void loop()
{

   digitalRead(2);
  if (digitalRead(2) == HIGH)
  {
    digitalWrite( 4 , LOW );
    
  }
  else
  {
  
    delay(5000);
    
   while(digitalRead(2) == 0)
  {
    digitalWrite(4,HIGH);
  }
}
}

вот это работает как помаслу теперь!!!!!!

осталось примочек добавить, ну там чтобы пьеза издавала звук и тд... но это совсем уже другая история! СПА-СИ-БО!!

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

 

1 = HIGH,0 = LOW