#1 2019-02-16 12:51:11

лёля
Учасник
Зареєстрований: 2019-02-16
Повідомлень: 2

помогите написать программу

2 Датчика движения HC-SR501
2 серво привода SG-5010
2 светодиода
примерно должен работать по принципу створчатых турникетов метро
то есть (датчик  движения 1) замечает объект , поворачивает серво в состояние 0 и 180 (градусов).
Объект проходит и (второй датчик) запускает таймер на 3 сек чтобы вернуть серво в изначальное положение (90 и 90 градусов),
светодиоды просто горят показывая в какую сторону работает устройство
после происходит рестарт и прибор работает заново..
собираю на Arduino Mega 2560 R3
собрать не сложно , а написать программу не получается , в интернете слишком мало информации как это сделать , помогите пожалуйста

Остання редакція лёля (2019-02-16 12:52:36)

Неактивний

#2 2019-02-16 15:05:57

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: помогите написать программу

вы хотите, что бы вам помогли или написали за вас программу ?

Неактивний

#3 2019-02-16 15:08:41

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: помогите написать программу

простейший конечный автомат.

Неактивний

#4 2019-02-16 16:06:34

лёля
Учасник
Зареєстрований: 2019-02-16
Повідомлень: 2

Re: помогите написать программу

renoshnik пише:

вы хотите, что бы вам помогли или написали за вас программу ?

Я смог написать конечно программу но работает хоть бы как ,то работает то не работает , можете помочь подкорректировать или предложить другую версию программы 
мой пример:




#define pirPin 8
#define pirPin2 7
#define LedPin 13
#include <Servo.h>
Servo servo1;//серво первое
Servo servo;//серво второе
void setup() {
  Serial.begin(9600); // Объявляем работу com порта со скоростью 9600
  pinMode(pirPin, INPUT); //Объявляем пин, к которому подключен датчик движения, входом
  pinMode(LedPin, OUTPUT); //Объявляем пин, к которому подключен светодиод, выходом
  servo1.attach(11); // привязываем сервопривод к аналоговому выходу 11
  servo.attach(12);
  }

  void loop() {
  int pirVal = digitalRead(pirPin); //Считываем значения с датчика движения. Если обнаружили движение,
int pirVal1 = digitalRead(pirPin2);                                 
                                    //то транслируем сигнал тревоги в монитор порта и включаем светодиод
  if(pirVal == HIGH)
  {
    digitalWrite(LedPin, HIGH);
    Serial.print("Тревога ");
    delay(2000);

    servo1.write(5); // ставим угол поворота под 0 1 серво
    servo.write(5);//ставим угол поворота под 180 2 серво
    delay(3000); // ждем 3 секунды

  }
else if (pirVal1==HIGH)
  {
  Serial.print("Сканирую ");
  digitalWrite(LedPin,LOW);
  delay(1000);
   servo1.write(85); // ставим угол поворота под 180
   servo.write(85);
    delay(3000); // ждем 3 секунды
  }

Неактивний

#5 2019-02-16 16:45:54

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: помогите написать программу

лёля пише:
renoshnik пише:

вы хотите, что бы вам помогли или написали за вас программу ?

Я смог написать конечно программу но работает хоть бы как ,то работает то не работает , можете помочь подкорректировать или предложить другую версию программы 
мой пример:




#define pirPin 8
#define pirPin2 7
#define LedPin 13
#include <Servo.h>
Servo servo1;//серво первое
Servo servo;//серво второе
void setup() {
  Serial.begin(9600); // Объявляем работу com порта со скоростью 9600
  pinMode(pirPin, INPUT); //Объявляем пин, к которому подключен датчик движения, входом
  pinMode(LedPin, OUTPUT); //Объявляем пин, к которому подключен светодиод, выходом
  servo1.attach(11); // привязываем сервопривод к аналоговому выходу 11
  servo.attach(12);
  }

  void loop() {
  int pirVal = digitalRead(pirPin); //Считываем значения с датчика движения. Если обнаружили движение,
int pirVal1 = digitalRead(pirPin2);                                 
                                    //то транслируем сигнал тревоги в монитор порта и включаем светодиод
  if(pirVal == HIGH)
  {
    digitalWrite(LedPin, HIGH);
    Serial.print("Тревога ");
    delay(2000);

    servo1.write(5); // ставим угол поворота под 0 1 серво
    servo.write(5);//ставим угол поворота под 180 2 серво
    delay(3000); // ждем 3 секунды

  }
else if (pirVal1==HIGH)
  {
  Serial.print("Сканирую ");
  digitalWrite(LedPin,LOW);
  delay(1000);
   servo1.write(85); // ставим угол поворота под 180
   servo.write(85);
    delay(3000); // ждем 3 секунды
  }


вставьте код правильно, чтобы можно было читать и давать советы ...

Неактивний

#6 2019-02-16 17:05:20

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: помогите написать программу

Ну вот - нажал на кнопку повернулось на 3 секунды

/**/
const byte btnPin = 2; // кнопка
const byte servoPin = 12; //серва
const byte ledPin = 13; //светодиод
//---------------------------
#include <Servo.h>
Servo servo;
//----автомат-------------------
typedef void (*pDo)();
pDo run = [] {};
// состояния
const byte sCLOSE = 0; // открыто
const byte sOPEN = 1 ; // закрыто
bool state;
const unsigned long time3s=3000;// константа 3 секунды
void set(bool s) {
  static unsigned long past;
  past = millis();
  state = s;
  switch (s) {
    case sCLOSE:
      digitalWrite(ledPin, LOW);
      servo.write(90);
      run = [] {};
      break;
    case sOPEN:
      digitalWrite(ledPin, HIGH);
      servo.write(0);
      run = [] {
        if (millis() - past >= time3s) set(sCLOSE);
      };
      break;
  }
}
//--------кнопка-----------------------------------
pDo runBtn = [] {};
bool btn;
void setBtn(bool b) {
  static unsigned long past;
  btn = b;
  past = millis();
  switch (b) {
    case false:
      set(sOPEN);
      runBtn = [] {
        if (!digitalRead(btn) && millis() - past >= 100)  setBtn(true);
      };
      break;
    case true:
      runBtn = [] {
        if (digitalRead(btn) && millis() - past >= 100)  setBtn(false);
      };
      break;
  }
}
//--------------------------------------------
void setup() {
  servo.attach(servoPin);
  pinMode(btnPin, INPUT_PULLUP);
  setBtn(false);
  pinMode(ledPin, OUTPUT);
  set(sCLOSE);
}

void loop() {
  runBtn();
  run();
}

Неактивний

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

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

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