#1 2018-01-02 21:03:06

skryga
Учасник
Зареєстрований: 2018-01-02
Повідомлень: 4

неправильно работает скетч...

Привет, пишу тут маленькую програмку для arduino digispark. Суть такая: при подаче на PB0 постоянного напряжения 5В (5В подаеться через контакты реле), на выходе PB1 должен появиться импульс 5В длительностю 1,5 сек (через транзисторный ключ и реле управляю актуатором от центрального замка - замок должен закрытьса ); при переключении PB0 на низкий уровень (размыкании реле и подтяжка к земле через 10к) на на выходе PB2 должен появиться импульс 5В длительностю 1,5 сек. (через транзисторный ключ и реле - замок должен открытьса).
Схемка в Proteus и код в архиве...
sketch_blink.rar

const int relayPin = 1;
const int onPin = 2;
const int offPin = 3;
int relayState = 0;

void setup() {
  // put your setup code here, to run once:
pinMode(relayPin, INPUT);
pinMode(onPin, OUTPUT);
pinMode(offPin, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
relayState = digitalRead (relayPin);
  if (relayState == HIGH) {
 digitalWrite(onPin, HIGH);
 delay (1500);
 digitalWrite(onPin, LOW);
} else {
  digitalWrite(offPin, HIGH);
  delay (1500);
  digitalWrite(offPin, LOW);
}
}

Неактивний

#2 2018-01-02 22:22:51

MikeM
Учасник
З Киев
Зареєстрований: 2017-11-03
Повідомлень: 160

Re: неправильно работает скетч...

Следует добавить ещё одну переменную, в которой запоминать текущее состояние relayPin.
Импульс формировать только тогда, когда значение relayPin изменилось.

Неактивний

#3 2018-01-02 23:47:49

skryga
Учасник
Зареєстрований: 2018-01-02
Повідомлень: 4

Re: неправильно работает скетч...

Так должно работать, доберусь до proteus'a, проверю:

const int relayPin = 1;
const int onPin = 2;
const int offPin = 3;
int  = 0;
int lastRelayState = 0;

void setup() {
    pinMode(relayPin, INPUT);
    pinMode(onPin, OUTPUT);
    pinMode(offPin, OUTPUT);
    }
   
    void loop() {
    relayState = digitalRead(relayPin);
  if (relayState != lastRelayState){
    if (relayState == HIGH) {
    digitalWrite(onPin, HIGH);
     delay (1500);
     digitalWrite(onPin, LOW);
    } else {
    digitalWrite(offPin, HIGH);
     delay (1500);
    digitalWrite(offPin, LOW); } }
  lastRelayState = relayState   
    }

Неактивний

#4 2018-01-02 23:52:37

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: неправильно работает скетч...

А сколько будет подаваться с реле сигнал ?

Неактивний

#5 2018-01-03 07:18:32

skryga
Учасник
Зареєстрований: 2018-01-02
Повідомлень: 4

Re: неправильно работает скетч...

Сигнал будет постоянньім - или есть или нет... Програмка должна следить за состояние сигнала на входному пине, и менять состояние вьіходньіх пинов (иипульсом) в зависимости от входа.

Остання редакція skryga (2018-01-03 07:40:40)

Неактивний

#6 2018-01-03 17:31:53

MikeM
Учасник
З Киев
Зареєстрований: 2017-11-03
Повідомлень: 160

Re: неправильно работает скетч...

Идея понята правильно, а на мелкие косяки укажет компилятор.
Удачи!

Неактивний

#7 2018-01-03 19:59:29

skryga
Учасник
Зареєстрований: 2018-01-02
Повідомлень: 4

Re: неправильно работает скетч...

Всем спасибо, в Proteus всё заработало как надо...
Финальный код:

const int relayPin = 0;
const int onPin = 1;
const int offPin = 2;
int relayState = 0;
int lastRelayState = 0;

void setup() {
  pinMode(relayPin, INPUT);
  pinMode(onPin, OUTPUT);
  pinMode(offPin, OUTPUT);
}

void loop() {
  relayState = digitalRead(relayPin);
  if (relayState != lastRelayState) {
    if (relayState == HIGH) {
      digitalWrite(onPin, HIGH);
      delay (1500);
      digitalWrite(onPin, LOW);
    } else {
      digitalWrite(offPin, HIGH);
      delay (1500);
      digitalWrite(offPin, LOW);
    }
  }
  lastRelayState = relayState ;
}

Спасибо, что навели на мысль...

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму