Проблема повторения

Я столкнулся с проблемой повторения программы, что означает, что она выполняется один раз (поскольку датчик переходит в 1, он рассчитывает 5 секунд (датчик все еще в 1) после того, как лампа зажжется). Ардуино всегда считает после перехода датчика в 0 потом в 1 но там лампочка не горит.

Идеи?

static byte capteurPrecedent = LOW;
static unsigned long debutAppui;

void setup(){
  pinMode(4,INPUT);
  pinMode(6,OUTPUT);
}

void loop(){

  byte capteur = digitalRead(4);
  if (capteur != capteurPrecedent)
  {
    if (capteur == HIGH)
    {
      debutAppui = millis();
    }
    else
    {
      debutAppui = 0;
    }
    CapteurPrecedent = capteur;
    delay(20);             
  }
  if (debutAppui != 0 && millis() - debutAppui> = 5000)
  {
    DigitalWrite(6,HIGH);}

  }

Обновление от ОП:

Ничего не изменилось, и я не хочу, чтобы лампа продолжала гореть по прошествии 5 мс, и есть еще одна проблема — если каптер передает 0, лампа все еще горит.

Прошу помощи!

, 👍-1

Обсуждение

Можете ли вы дать мне предложения?, @Mary

Пожалуйста, не редактируйте и радикально не меняйте суть вашего вопроса. Кроме того, в первом слове «void» была заглавная буква, которую я исправил..., @Greenonline

В вашем коде, если вы пишете один раз, что лампа остается высокой, вы ни в коем случае не пишете ее низкой., @Vaibhav

Но как мне это сделать? Я делал много попыток, но безуспешно @vaibhav, @Mary

попробуйте ответ, который я дал. замените ваш **void цикл()** на тот, который я предложил., @Vaibhav

Я попробовал, не помогло @vaibhav, @Mary

заботящаяся программа в верхней части лампы отдыха à 1 для вашего автомобиля на millis()-debutAppui>=5000, @Mary

комментарий je peux la mettre à 0 ? я думаю, что я тестирую Код: [Выбрать] еще {debutAppui=0 ; digitalWrite(6,LOW, @Mary

Ваша программа не компилируется. CapteurPrecedent = capteur; должно быть capteurPrecedent = capteur; (строчная буква "c"), millis() - DebuteAppui> = 5000 должно быть millis() - DeboutAppui >= 5000 (без пробела между '> ' и '='), а DigitalWrite(6,HIGH); должно быть digitalWrite(6,HIGH); (строчная буква "d"). Из уважения к тем, кто пытается вам помочь, вам следует хотя бы _проверить точный код_, который вы публикуете, и убедиться, что его поведение соответствует вашему вопросу., @Edgar Bonet

@ Мэри, пожалуйста, используй английский на этом SE. См. [помощь], @sa_leinad


2 ответа


0

Я только что внес некоторые изменения в ваш код, т.е. добавил низкий уровень к лампе, если capteur передает 0, и несколько скобок, если условие записи лампы высокое.

void loop(){
  byte capteur = digitalRead(4);
  if (capteur != capteurPrecedent)
  {
    if (capteur == HIGH)
    {
      debutAppui = millis();
    }
    else
    {
      debutAppui = 0;
      DigitalWrite(6,LOW);
    }
    CapteurPrecedent = capteur;
    delay(20);             
  }
  if (debutAppui != 0 && ((millis() - debutAppui ) >= 5000))
  {
    DigitalWrite(6,HIGH);
  }
}
,

Даже я прибавляю лампочке мало света, она все равно горит!!!, @Mary


0

Переменные чувствительны к регистру. Ваша проблема в том, что в строке 22 вы ссылаетесь на CapteurPrecedent вместо capteurPrecedent. Ваш код должен выглядеть следующим образом:

byte capteurPrecedent = LOW;  // <---- неправильное использование статики
unsigned long debutAppui;     // <---- неправильное использование статики

void setup(){
  pinMode(4,INPUT);
  pinMode(6,OUTPUT);
}

void loop(){

  byte capteur = digitalRead(4);
  if (capteur != capteurPrecedent)
  {
    if (capteur == HIGH)
    {
      debutAppui = millis();
    }
    else
    {
      debutAppui = 0;
    }

    capteurPrecedent = capteur;  // <---- Основной капитал
    delay(20);             
  }

  if ((debutAppui != 0) && ((millis() - debutAppui) >= 5000))  // <---- исправлено ">="
  {
    digitalWrite(6,HIGH);  // <---- Основной капитал
  }
}

Ваш вопрос не ясен, поэтому, если вы хотите, чтобы датчик был включен/высок в течение 5 секунд, лучше было бы переписать его так:

unsigned long debutAppui;

void setup(){
  pinMode(4,INPUT);
  pinMode(6,OUTPUT);
}

void loop(){

  byte capteur = digitalRead(4);
  if (capteur == HIGH)
  {
    if ((millis() - debutAppui) >= 5000)
    {
      digitalWrite(6,HIGH);
    }
    else
    {
      digitalWrite(6,LOW);
    }
  }
  else  // т.е. capteur == LOW
  {
    debutAppui = millis();
    digitalWrite(6,LOW);             
  }

delay(20);
}
,