Помощь ! Код сигнализации на arduino

svitr
Offline
Зарегистрирован: 16.04.2017

Здравствуйте. При помощи коллег на форуме, написал следующий код..
Задача простая, при активации датчика начинает бесконечно пищать зуммер и загорается зеленый лед (этот этап у меня получился). Отключить все это можно нажав импульсную кнопку 1 раз (нажал-отпустил), но у меня что-то не выходит никак. 
Прошу помочь ! Буду премного благодарен !
 

int zelPin = 2; // зеленый лед
int krasnPin = 3; // красный лед
int zum = 4; // зуммер
int pir = 5; // датчик пир
int buttonPin = 6;
int buttonState = 0;

void setup()
{
  pinMode(2, OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, INPUT);
  pinMode(6,INPUT);
  Serial.begin(9600);
}
boolean exitWhile = false ;
void loop() {
buttonState = digitalRead(buttonPin);

int pirVal = digitalRead(pir);

  //Если обнаружили движение
  if(pirVal == HIGH)
 { 
  digitalWrite(zelPin, LOW);
  digitalWrite(krasnPin, HIGH);
  while (exitWhile == false) {
  digitalWrite(zum, HIGH);
  delay(1);
  digitalWrite(zum, LOW);
  delay(1); 
  if (buttonState == HIGH){
    exitWhile = true;
  }
    }
 }
  else
  {
   digitalWrite (zelPin,HIGH);
    digitalWrite(krasnPin,LOW);
    digitalWrite(zum, LOW);
  }
}

 

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

svitr,

судя по Вашей предыдущей теме, в которой El как-то пытался Вам помочь, Вы совсем не умеете программирования и не знаете языка (когда он по запарке предложил Вам строку на другом языке, Вы стали спрашивать куда её вставлять). Судя по тому коду, что Вы выложили сейчас, Вы совсем не понимаете, что в нём написано.

Я конечно могу Вам сказать, что сделать, чтобы пищалка замолкала - перенесите строку 19 пониже - вставьте её между строками 32 и 33. А строки 37-39 удалите вовсе. Пищалка начнёт замолкать, только Вам это не поможет - это не помощь, т.к. завтра у Вас появится новая пищалка и снова начнётся "мыло и мочало - мы начнём сначала, давайте всем миром помогайте".

Реальная помощь Вам может быть только одна - совет научиться программировать и изучить язык на котором Вы собираетесь писать. Ну, или, если писать Вы не собираетесь, то впредь просто обращайтесь в раздел "Ищу исполнителя", там всё напишут за Вас по вполне сходной цене.

svitr
Offline
Зарегистрирован: 16.04.2017

Что поделать... специалистами не рождаются, специалистами становятся. Не все вокруг Энштейны и Менделеевы, многие как я с нуля начинают, и имеют право задавать хотя бы элементарные вопросы. Если вы не любите новичков - внесите соответствующие корректировки в правила создания тем.
К слову, я отлично понимаю свой же код который сам же и написал, а то что я задаю вопросы по программированию не говорит о том что я не понимаю что делаю. Процесс обучения всегда сопровождается вопросами и непониманием, поэтому наверное в школах работаю учителя, да ?
За помощь благодарю. Пообещаю больше не беспокоить местное экспертное сообщество своими вопросами.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

svitr пишет:

К слову, я отлично понимаю свой же код который сам же и написал, 

Ничего Вы в этом коде не понимаете. Могу позадавать вопросы по разным строчкам, типа "для чего и что делает", чтобы Вы в этом убедились. А писали Вы его не сами. Сами Вы только кнопки нажимали. Писал за Вас El и другие.

Лучшее, что Вы можете сделать, это взять книги по программированию и читать, разбирая все примеры, а не пытаться написать программу на языке, который для Вас набор бессмысленных букв. Впрочем, не хотите учиться - не надо, мне пофиг - Вам жить.

svitr
Offline
Зарегистрирован: 16.04.2017

Считайте как угодно. Со своей стороны лишь отмечу, мне было непонятно как реализовать вышеприведенный сценарий с выключением сирены посредством кнопки, потому что логические функции на С++ для новичка это сложно. Особенно если с математикой в школе не дружил.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

И будет сложно пока не последуете моему совету - взять книги и учиться вместо того, чтобы побираться по форумам, справшивая как строку на бейсике в С-шный код вставить.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

svitr пишет:

...потому что логические функции на С++ для новичка это сложно.

Нет на С++ никаких логических функций!

Есть раздел математики - называется "Булева алгебра". И все логические функции в любом языке программирования, будь то Си, Фортран, Кобол, Паскаль, РХП или Бейсик берутся только оттуда.

Цитата:

Особенно если с математикой в школе не дружил.

Собственно, у Вам есть три варианта, два приемлемых и один - позорный. Где какой - разбирайтесь сами:

1. Подружиться с математикой.

2. Обратиться в раздел "Ищу исполнителя".

3. Побираться по форуму в недежде, что кто-то напишет за Вас либо исправит Ваши ошибки.

 

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

svitr пишет:

Здравствуйте. При помощи коллег на форуме, написал следующий код..
Задача простая, при активации датчика начинает бесконечно пищать зуммер и загорается зеленый лед (этот этап у меня получился). Отключить все это можно нажав импульсную кнопку 1 раз (нажал-отпустил), но у меня что-то не выходит никак. 
Прошу помочь ! Буду премного благодарен !

Я правильно понимаю логику вашего устройства - устройство должно иметь два состояния - "пищит" или "не пищит". В состояние "пищит" оно взводится по датчику и даже, если датчик больше не показывает движения, то устройство все равно пищит. В состояние "не пищит" оно сбрасывается кнопкой без фиксации - так?

svitr
Offline
Зарегистрирован: 16.04.2017

Совершенно верно.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Ну, как вариант:

int zelPin = 2; // зеленый лед
int krasnPin = 3; // красный лед
int zum = 4; // зуммер
int pir = 5; // датчик пир
int buttonPin = 6;
int buttonState = 0;

int _dev = 0;       // состояние устройства: 0 - нет тревоги

void setup()
{
  pinMode(2, OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, INPUT);
  pinMode(6,INPUT);
  int _dev = 0;
  digitalWrite (zelPin,HIGH);
  digitalWrite(krasnPin,LOW);
  digitalWrite(zum, LOW);
  Serial.begin(9600);
}

void loop()
{
  // состояние - не пищит, проверяем датчик движения
  if(_dev == 0)
  {
    // Сработал датчик, устанавливаем состояние прибора в состояние пищит
    if(digitalRead(pir) == HIGH)
    {
      _dev = 1;
      digitalWrite(zelPin, LOW);
      digitalWrite(krasnPin, HIGH);      
    }    
  }
  // состояние - пищит
  else
  {
    // Пищим и проверяем состояние кнопки
    digitalWrite(zum, HIGH);
    delay(500);
    digitalWrite(zum, LOW);
    delay(500);

    if(digitalRead(buttonPin) == HIGH)
    {
      _dev = 0;
      digitalWrite (zelPin,HIGH);
      digitalWrite(krasnPin,LOW);    
    }    
  }
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

svitr пишет:

Считайте как угодно. Со своей стороны лишь отмечу, мне было непонятно как реализовать вышеприведенный сценарий с выключением сирены посредством кнопки, потому что логические функции на С++ для новичка это сложно. Особенно если с математикой в школе не дружил.

Вам здесь старшие товарищи порекомендовали книжки и в целом они совершенно правы. Но первое, с чего начинается программа, это алгоритм. Возьмите лист бумаги и распишите, что в какой момент и по какой причине должно произойти. После чего переводите свои тезисы в понятный МК язык (здесь уже без словаря никак). И математика в вашем случае не причем. Да и в основной массе задач достаточно курса воскресной школы.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Еще вариант, без delay()

int zelPin = 2; // зеленый лед
int krasnPin = 3; // красный лед
int zum = 4; // зуммер
int pir = 5; // датчик пир
int buttonPin = 6;
int buttonState = 0;
unsigned long _zum;         // Для пищалки

int _dev = 0;       // состояние устройства: 0 - нет тревоги

// Функция инициализации
void fnIni()
{
  pinMode(2, OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, INPUT);
  pinMode(6,INPUT);
  _dev = 0;
  
  fnSetLeds(0);  
  digitalWrite(zum, LOW);
  _zum = millis();  
}

// Функция включения светодиодов
void fnSetLeds(int a)
{
  if(a == 0)
  {
    digitalWrite (zelPin,HIGH);
    digitalWrite(krasnPin,LOW);    
  }
  else
  {
    digitalWrite(zelPin, LOW);
    digitalWrite(krasnPin, HIGH);      
  }
}
// Функция пищания
void fnSetZum(int a)
{ 
  if(a == 0)
  {
    digitalWrite(zum, LOW);      
  }

  else
  {
    if((millis() - _zum) < 200)
    {
      digitalWrite(zum, HIGH);      
    }
    else
    {
       digitalWrite(zum, LOW);
       if((millis() - _zum > 400))
       {
        _zum = millis();
       }       
    }
  }
}

void setup()
{
  fnIni();
}

void loop()
{
  // состояние - не пищит, тогда проверяем датчик движения
  if(_dev == 0)
  {
    // Выключаем пищалку на всякий случай
    fnSetZum(0);
    
    // Сработал датчик, устанавливаем состояние прибора в состояние "пищит", включаем красный, гасим зеленый
    if(digitalRead(pir) == HIGH)
    {
      _dev = 1;
      fnSetLeds(1);      
    }    
  }
  
  // состояние - "пищит"
  else
  {
    // Пищим и пищим
    fnSetZum(1);
           
    // Проверяем состояние кнопки сброса, если была нажата, устанавливаем статус в 0, гасим красный, зажигаем зеленый
   if(digitalRead(buttonPin) == HIGH)
    {
      _dev = 0;
     fnSetLeds(0);
    }    
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

ulis пишет:

Ну, как вариант:

Ну, всё, карта пошла!

Прав был ТС - нафига книжки читать? 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ulis пишет:

Ну, как вариант:

Ну, всё, карта пошла!

Прав был ТС - нафига книжки читать? 

так от скуки жеж, кому то не сложно, а на более сложные задачи настроя нет

svitr
Offline
Зарегистрирован: 16.04.2017

Всем большое спасибо, тему можно закрывать.