Блок питания для CarPc

defed
Offline
Зарегистрирован: 27.10.2015

Здравствуйте, помогите пожалуйста.  Имеется ардуино уно китайская, она должна выполнять следующее: Следит через оптопару за напряжением на ACC(пин №2).  

1. Если появилось питание на (пин 2) ,включает светодиод на (пине12) и он продолжает гореть пока сигнал с (пин 2) ACC не пропадет.

2. Если сигнал на (пине 2) ACC пропадает, то засекается пол минуты- 30000мс. и светодиод на пине 12 отключается.

Этот скетч отрабатывает это.

Но немогу понять как добавить дополнительно:

1 нужен  еще один выход на светодиод, (например пин 11), на который при пропадании питания на оптопаре сигнала ACC ,сразу же, (пин 2) вырабатывался одиночный импульс.(для выработки сигнала отключения компьютера.)

2 и в идеале еще одна функция для выработки сигнала Reset  после запуска компьютера , примерно через 3 секунды( информацию о начале запуска можно снимать со светодиода который загорается при запуске компьютера( и так же он должен быть одиночным).

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
int ledPin = 12; // пин со светодиодом
long OnTime = 30000; // время свечения светодиода, мс
int ledState = LOW;
int pinButton = 2; // пин, к которому подключена кнопка
unsigned long previousMillis = 0;
 
void setup()
{
pinMode(ledPin, OUTPUT);
}
 
void loop()
{
unsigned long currentMillis;
 
// если светодиод светится
if (ledState == HIGH)
{
currentMillis = millis();
 
// проверяем сколько прошло времени,
// если больше заданного - выключаем
if (currentMillis-previousMillis >= OnTime)
{
ledState = LOW;
previousMillis = 0;
digitalWrite(ledPin,ledState);
}
}
 
// если кнопка нажата - включаем светодиод
if (digitalRead(pinButton) == HIGH)
{
previousMillis = currentMillis; // запоминаем время
ledState = HIGH;
digitalWrite(ledPin,ledState);
}
}

 

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

Может так, если я правильно понял задачу


int led = 11;
int ledPin = 12; // пин со светодиодом
bool flag1 = 0;
long OnTime = 30000; // время свечения светодиода, мс
int ledState = LOW;
int pinButton = 2; // пин, к которому подключена кнопка
unsigned long previousMillis = 0;

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(pinButton, INPUT);
  digitalWrite(led, LOW); //Или HIGH ,не знаю какой Вам нужен для работы
}

void loop()
{

  if (flag1 == 1 && millis() - previousMillis >= OnTime)
  {
    ledState = LOW;
    digitalWrite(ledPin, ledState);
  }

  if (digitalRead(pinButton) == HIGH)
  {
    flag1 = 0;
    ledState = HIGH;
    digitalWrite(ledPin, ledState);
  }

  if (flag1 == 0 && digitalRead(pinButton) == LOW)
  {
    flag1 = 1;
    previousMillis = millis(); // запоминаем время
    digitalWrite(led, HIGH); //Или LOW ,не знаю какой Вам нужен для перезагрузки или отключения
  }
}

 

defed
Offline
Зарегистрирован: 27.10.2015

  Vosara, Спасибо Огромное за помощь, но работает маленько не так. Доделал. Теперь светодиод(пин11) при пропадании сигнала на (пине 2) включается и гаснет как и было задумано.


int led = 11;
int ledPin = 12; // пин со светодиодом
bool flag1 = 0;
long OnTime = 30000; // время свечения светодиода, мс
int ledState = LOW;
int pinButton = 5; // пин, к которому подключена кнопка
unsigned long previousMillis = 0;

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(pinButton, INPUT);
  digitalWrite(led, LOW); //Или HIGH ,не знаю какой Вам нужен для работы
}

void loop()
{

  if (flag1 == 1 && millis() - previousMillis >= OnTime)
  {
    ledState = LOW;
    digitalWrite(ledPin, ledState);
  }

  if (digitalRead(pinButton) == HIGH)
  {
    flag1 = 0;
    ledState = HIGH;
    digitalWrite(ledPin, ledState);
  }

  if (flag1 == 0 && digitalRead(pinButton) == LOW)
  {
    flag1 = 1;
    previousMillis = millis(); // запоминаем время
    digitalWrite(led, HIGH); //Или LOW ,не знаю какой Вам нужен для перезагрузки или отключения
    delay(70);
    digitalWrite(led, LOW);
    
  }
}