Ребята подскажите новичку

CarMaster72
CarMaster72 аватар
Offline
Зарегистрирован: 22.12.2017

Добрый день всем гуру программирования! Я совсем новичек в Ардуино, и программировании, прошу сильно не пинать, мне для авто нужд необходимо сделать устройство которое управляется одним проводом, например 0 на все время работы устройства, 0 сменился на еденицу и цикл завершился и устройство в режиме ожидания. так вот при наличии 0 на упр пине, необходимо получить с устройства 4 импульса в разной последовательности, и при пропадании 0 на упр пине еще нужно пару импульсов на нескольких выходных пинах из этих четырех. 

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

unsigned long time;

int IMMOpin = 5;       // IMMO пин на выходе 5 включает обход иммо
int KEYpin = 7;        // KEY пин на выходе 6 включает датчик наличия ключа
int switchPin = 13;   // выключатель на порту 13, замыкает на землю
 

 
void setup()
{
  pinMode(IMMOpin, OUTPUT);
  pinMode(KEYpin, OUTPUT);
  pinMode(switchPin, INPUT);
  digitalWrite(switchPin, HIGH);      // включаем подтягивающий резистор
}
 
void loop()
{
  static unsigned long IMMOpin_time = 0;
  static unsigned long KEYpin_time = 0;
  time = millis();
  if (digitalRead(switchPin) == LOW)
  
  { delay(200);                      // время перед задержкой включением IMMOpin
    digitalWrite(IMMOpin, HIGH);      // включаем канал IMMOpin
    IMMOpin_time = time + 500;       // счетчик до момента выкл канала после статуса LOW на 13 пине
  }else
  if( IMMOpin_time && (IMMOpin_time <= time) )  //опрос времени IMMOpin 
  { digitalWrite(IMMOpin, LOW);                 // выключение канала IMMOpin


  
  time = millis();
  if (digitalRead(switchPin) == LOW)
  {
    digitalWrite(KEYpin, HIGH);      // включаем канал IMMOpin
    KEYpin_time = time + 1000;        // счетчик до момента выкл канала после статуса LOW на 13 пине
  }else
  if( KEYpin_time && (KEYpin_time <= time) )
  {digitalWrite(KEYpin, LOW);
  
  }
  }  
}
  
  

 

 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Уберите перезапись time из голого цикла, это должно быть исключительно внутри условия. Условие выглядит

if(millis()-time>=IMMOpin_time){
// ....
  time = millis();
}

 

Nemesis_ISS
Offline
Зарегистрирован: 30.12.2017

Не поможите и мне ?  только-только начал осваивать ,поэтому много непонятного ((

допустим  у нас есть 2 светодиода. как сделать так,чтобы  1 светодиод мигал 2 раза,затем мигал 2 светодиод 3 раза,затем 1 светодиод начинал моргать без перерыва ?

если покажете на простом примере - буду примного Благодарен .

b707
Offline
Зарегистрирован: 26.05.2017

Nemesis_ISS пишет:

Не поможите и мне ?  только-только начал осваивать ,поэтому много непонятного ((

допустим  у нас есть 2 светодиода. как сделать так,чтобы  1 светодиод мигал 2 раза,затем мигал 2 светодиод 3 раза,затем 1 светодиод начинал моргать без перерыва ?

 

в Сетапе 2 раза мигаем первым светиком и три раза - вторым. Потом переходим в ЛУП и мигаем первым. Луп исполняется бесконечно....

Nemesis_ISS
Offline
Зарегистрирован: 30.12.2017

Большое Спасибо !!

Modsley
Offline
Зарегистрирован: 14.01.2018

Приветствую.

Встретил тут в книжке что-то типа такого

Вопрос в чём, в указанной функции же не всегда выполняется return. Оно по идее даже компилиться не должно. Если функция не встретила return, она что возвращает? 

 

boolean debounce (boolean last) {
  boolean current = digitalRead (BUTTON);
  if (last != current) {
    delay (5);
    current = digitalRead (BUTTON);
    return current;
  }
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Компилироваться такое будет, просто будет warning. Насчёт того, что возвращает, когда не втретила return - емнип, будет неопределённое значение.

Modsley
Offline
Зарегистрирован: 14.01.2018
Ну так там дальше 

currentButton = debounce(lastButton); 
if (lastButton == LOW && currentButton == HIGH) 

И всё работает. Если currentButton void, то как оно его сравнивает?

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Modsley пишет:

Ну так там дальше 

currentButton = debounce(lastButton); 
if (lastButton == LOW && currentButton == HIGH) 

И всё работает. Если currentButton void, то как оно его сравнивает?

currentButton не void - а имеет неопределённое значение. И компилятор скастит его к bool, каким будет значение currentButton, если из функции не вернулось значение - зависит от компилятора, но по стандарту - там неопределённое значение.

Смотрите, на абстрактном примере: перед вызовом функции, которая возвращает 1 байт (bool) указатель вершины стека увеличивается на 1 (чтобы после выхода из функции было место, куда записать возвращаемое значение). Байт с каким значением лежал на стеке до инкрементирования указателя - неизвестно, поэтому и говорят про неопределённое значение. В случае с bool любое такое значение можно привести к типу bool, ибо всё, что не 0 - true, остальное - false.