Составить программу

vvbelin
Offline
Зарегистрирован: 01.04.2016

Уважаемые программисты! Помогите пожалуйста создать программу для arduino uno у самого мозг не справляется.

Принцып работы:Как только через оптопару начинают поступать хаотичные импулься, включается таймер на 45 секунд, после отсчета происходит кратковременное нажатие кнопки для запуска устройста, и через 15 секунд проверка наличия импульсов с оптопары в течении 20 секунд, если их нет то ардуино переходит в дежурный режим для следующей проверки, если есть импульсы включается сигнализация.

С Уважением. Валерий.

Green
Offline
Зарегистрирован: 01.10.2015

Пишите htpicc@hmail.com

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

пиши на скайп p.masyukov

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

vvbelin пишет:

Как только через оптопару начинают поступать хаотичные импулься ...

А каков критерий хаотичности импульсов? Как отличить хаотичные от нехаотичных?

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

Я подозреваю, что имеются в виду просто наличие имульсов. То есть любое изменение уровня влечет за собой запуск таймера, если он был остановлен.

Тут интереснее кто или что нажимает кнопку, по истечении 45 секунд

Напишу за 1000 рублей на телефон. brokly(at)mail.ru

Но почти уверен, что кто нибудь напишет бесплатно :)

phoenixoid
Offline
Зарегистрирован: 14.07.2015

Пишите мой_ник@ya.ru

 

madmax96
Offline
Зарегистрирован: 22.09.2011

fmv.electronics (gmail) com

vvbelin
Offline
Зарегистрирован: 01.04.2016

Как написал brokly: Просто наличие имульсов. То есть любое изменение уровня влечет за собой запуск таймера, если он был остановлен.

vvbelin
Offline
Зарегистрирован: 01.04.2016

Вот уже нашел похожую программу, остался маленький ньюанс а мозга нет! Помогите пожалуйста доработать.

http://arduino.ru/forum/programmirovanie/pomogite-dorabotat-skech

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

// ДЛЯ ЭКОНОМИИ ПАМЯТИ, ДЛЯ НЕИЗМЕНЯЕМЫХ И ЗАРАНЕЕ ИЗВЕСТНЫХ ЗНАЧЕНИЙ ИСПОЛЬЗУЙТЕ ТАКОЙ ПРИЕМ,
// ТЕПЕРЬ КОМПИЛЯТОР ПРИ ГЕНЕРАЦИИ КОДА БУДЕТ ПРОСТО ЗАМЕНЯТЬ ПАРАМЕТР после #define НА ВТОРОЙ ПАРАМЕТР\

#define buttonPin  3              // ДЛЯ РЕГИСТРАЦИИ ИЗМЕНЕНИЙ НУЖНА НОГА НА КОТОРОЙ МОЖЕТ РАБОТАТЬ ПРЕРЫВАНИЕ , на этой ноге работает прерывание 1
#define ledPin   2                // назначаем пин 2 для сигнального светодиода
#define buzzerPin  12             // назначаем PWM-пин 12 для пищалки, кроме 3 и 11!!!
#define highLevelPin  15          // назначаем пин 15 для дублирущего светодиода (кнопка исполнения)

volatile boolean buttonState = false;    // логическая переменная для состояния кнопки (флаг наличия изменения на ножке)

void noise_registrator(void) { // обработчик прерываний, эта процедура автоматически вызывается при любом изменении уровня на ножке 3
   buttonState = true; // произошло прерывание из-за изменения ситуации на ножке 3 - поднимаем флаг для основного тела программы 
}
  
void setup()
{
  // инициализация пинов
  pinMode(buttonPin, INPUT_PULLUP);  // НЕ ЗАБЫВАЕМ ВКЛЮЧИТЬ ПОДТЯГИВАЮШИЙ РЕЗИСТОР !!!!  
  
  pinMode(ledPin, OUTPUT);  
  digitalWrite(ledPin, LOW); // гасим светодиод
 
  pinMode(buzzerPin, OUTPUT);  
  //  digitalWrite(buzzerPin, LOW); // затыкаем пищалку
 
  pinMode(highLevelPin, OUTPUT); 
  digitalWrite(highLevelPin, LOW); // обнуляем выход на устройство
    
  Serial.begin(9600);  // вывод отладочной информации
  //Serial.println("Ready...");
  // ДЛЯ ЭКОНОМИИ ПАМЯТИ, при печати неизменных текстовых сентенций используйте диррективу компилятору F()
  // В ЭТОМ СЛУЧАЕ текст будет размещен во флеш памяти и не займет место в памяти переменных
  Serial.println(F("Ready..."));
  
  attachInterrupt(1, noise_registrator, CHANGE); // включаем прерывание на ноге 3 и ждем там изменений
}
  
void loop() {
  if (buttonState) { // раз поднят флаг наличия изменения на ножке
     mainStart();
     sendSignal();
     finish(); // выполняем условия финиша
     buttonState = false; // СНОВА опустим флаг
     delay(20000);
     while (buttonState) { // если импульсы не пропали сигналим до пропадания
        buttonState = false;
        alarm();
     }
     Serial.println(F("Waiting for...")); 
  }
}

void mainStart()
{
    Serial.println(F("Main Start!"));   
    digitalWrite(ledPin, HIGH); // включаем светодиод
   
    for (int i = 0; i <= 20; i++) // время первого отсчета 20 сек
    {
      Serial.println(i);  // выводим в порт показания отсчета
      delay(1000);        // ждем 1 сек
    }
   
    digitalWrite(ledPin, LOW);// гасим светодиод
    Serial.println(F("Done.")); 
}
   
void sendSignal()
{
    Serial.println(F("Send HI to device")); 
    digitalWrite(highLevelPin, HIGH); // подаем высокий уровень на устройство
   
    delay(250);        // ждем 250 мсек (задержка свечения светодиода (нажатие кнопки)
   
    digitalWrite(highLevelPin, LOW);
    Serial.println(F("Send LOW to device")); 
}
   
void finish()
{
    Serial.println(F("Wait 15 seconds..."));   
    delay(15000);  // ничего не делаем 15 сек
}

void alarm() {
    Serial.println(F("ALARM...")); 
    for (int i = 0; i < 40; i++)  // пищим
    { 
      tone(buzzerPin, 3000, 100); 
      delay(500);   //  частота включения пищалки
    }     
    noTone(buzzerPin); // затыкаем пищалку 
}

 

vvbelin
Offline
Зарегистрирован: 01.04.2016

Огромная благодарность brokly! Я тут целый день разбираюсь (оказалось полезно самому мыслить,курить и опять мыслить :), собрал приблуду, вроде отрабатывает задачу, только еще не успел время сканирования входа сделать чтобы несколько минут проверял наличие изменений. Сейчас запущу Ваш скетч!

Что я сляпал:

const int buttonPin = 14;       // назначаем пин A0 для кнопки
const int ledPin =  2;         // назначаем пин 2 для сигнального светодиода
const int buzzerPin =  12;      // назначаем PWM-пин 12 для пищалки, кроме 3 и 11!!!
const int highLevelPin =  15;   // назначаем пин 15 для дублирущего светодиода (кнопка исполнения)
boolean buttonState = false;    // логическая переменная для состояния кнопки
int duration; // объявление переменной duration типа int

void setup() 
{
  // инициализация пинов
  pinMode(buttonPin, INPUT);     
  digitalWrite(buttonPin, HIGH); //включаем внутренний подтягивающий резистор на 20К, чтобы не закоротить пины при нажатии кнопки без обвязки

  pinMode(ledPin, OUTPUT);   
  digitalWrite(ledPin, LOW); // гасим светодиод

  pinMode(buzzerPin, OUTPUT);   
  //  digitalWrite(buzzerPin, LOW); // затыкаем пищалку

  pinMode(highLevelPin, OUTPUT);  
  digitalWrite(highLevelPin, LOW); // обнуляем выход на устройство

  
  Serial.begin(9600);  // вывод отладочной информации
  Serial.println("Ready...");
}


void loop()
{
  buttonState = !digitalRead(buttonPin);  // читаем состояние кнопки и инвертируем его, т.к. у нас включен подтягивающий резистор
  //  Serial.println(buttonState);

  if (buttonState == true) 
  {  // дeйствия при нажатии кнопки
    Serial.println("Button pressed!");
    
    mainStart(); // выполняем условия старта
    sendSignal(); // подаем сигнал на устройство (исполнитедьная кнопка) 
     
    finish(); // выполняем условия финиша
    Serial.println("THE END");  
  } 
  else 
  {  // действия, если кнопка не нажата
    //    digitalWrite(ledPin, LOW); 
  }
}


void mainStart()
{
  Serial.println("Main Start!");    
  digitalWrite(ledPin, HIGH); // включаем светодиод 

  for (int i = 0; i <= 20; i++) // время первого отсчета 47 сек
  {
    Serial.println(i);  // выводим в порт показания отсчета
    delay(1000);        // ждем 1 сек
  }

  digitalWrite(ledPin, LOW);// гасим светодиод 
  Serial.println("Done.");  
}

 

void sendSignal()
{
  Serial.println("Send HI to device");  
  digitalWrite(highLevelPin, HIGH); // подаем высокий уровень на устройство

  delay(250);        // ждем 250 мсек

  digitalWrite(highLevelPin, LOW);
  Serial.println("Send LOW to device");  
}



void finish()
{
  Serial.println("Finish...");  

  duration = pulseIn(14, LOW); // измеряем длительность импульса
  noTone(buzzerPin); // затыкаем пищалку  
  Serial.println("Wait 15 seconds...");    
  delay(15000);  // ничего не делаем 15 сек
  

  
{
  if (digitalRead(buttonPin) == HIGH)
{
  Serial.println("NORMA");// действие A
}
else
{
  for (int i = 0; i <= 10; i++)  // тревога
  {  
    tone(buzzerPin, 3000, 100);  
    delay(500);   //  частота включения пищалки
  }      
  
  noTone(buzzerPin); // затыкаем пищалку
  Serial.println("DANGER");// действие B
}

 
  delay(1000);
}

  
        
  
  noTone(buzzerPin); // затыкаем пищалку  
  // display.show("--");  // закончили задачу, выводим режим готовности к следующему этапу
  buttonState = false;  // устанавливаем исходное состояние кнопки 
  Serial.println("Done.");  

 

vvbelin
Offline
Зарегистрирован: 01.04.2016

Первый опыт. как то так. :)

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

Зачем вам переменная duration ?

vvbelin
Offline
Зарегистрирован: 01.04.2016

Лепил с найденного скетча под себя а что там duration делает не разобрался. :)