3-ёх канальное реле помогите с кодом

Нет ответов
Taller
Offline
Зарегистрирован: 25.02.2014
Добрый день.

Замучался я с этим кодом, ничего у меня не получаеться помогите. Я делаю устройство для управления Фотокамерой, приводом, и вспышкой. Вот схема как я вижу работу данного устройства:

Вот весь код котый я написал, не судите строго мой первый блин:  

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int TestPin = 03;     // кнопка тест на 03 пине
int StartPin = 02;    // кнопка Start

int CameraPin = 13;   // пин на камеру
int PrivodPin = 11;   // пин на привод
int FlashPin = 12;    // пин на вспышку

int m=0;            // переменные для меню
int CamT=0;        // переменная для интервала камеры
int PrivT1=100;      // для импульса 2
int PrivT2=0;      // для импульса 2
int PrivT3=0;      // для импульса 3
int PrivT4=0;
int FlashT=0;
int flag=0;         // кнопка тест

long previousMillis = 0;
long interval = 5000;



byte key(){
 int val = analogRead(0);
  if (val < 50) return 5;        // в право 
  else if (val < 150) return 3;  // в верх  // Meny
  else if (val < 350) return 4;  // в низ   // Meny 
  else if (val < 500) return 2;  // в лево 
  else if (val < 800) return 1;  // select
  else return 0;  
}
// --- конец функции кнопок
void setup() {
  pinMode(TestPin, INPUT);           // кнопка Тест вход
  pinMode(StartPin, INPUT);          // кнопка Тест вход
  pinMode(CameraPin, OUTPUT);       // затвор камеры выход
  pinMode(PrivodPin, OUTPUT);       // реле привода выход
  pinMode(FlashPin, OUTPUT);        // реле вспышки выход
  lcd.begin(16, 2);                  // инициализация экрана
  lcd.clear ();
  }
void loop(){
  ///////////  кнопка Test с одиночным срабатыванием
  if(TestPin==HIGH&&flag==0)
  {                                   // поставить небольшую задержку
   digitalWrite(PrivodPin, HIGH);
   delay (100);
   digitalWrite(PrivodPin, LOW);
   flag=1;
  }
  if(TestPin==LOW&&flag==1)
  {
    flag=0;
  }
  ///////////// КонеЦ /////////////////////////
  ///////////  Кнопка Start с одиночным срабатыванием
  if(StartPin==HIGH&&flag==0)
  {
    int x = 500;
    int x1= ((x + PrivT2)+100);
    int x2= ((x1 + PrivT3)+100);
    int x3= ((x2 + PrivT4)+100);
    int y = (x+CamT);
    int z = (y+50);
   delay (x);                     // поставить небольшую задержку
   digitalWrite(PrivodPin, HIGH);       // вкл 1-ый импульс
   delay (100);
   digitalWrite(PrivodPin, LOW);        // выкл
   delay (x1);
   digitalWrite(PrivodPin, HIGH);       // вкл 2-ой импульс
   delay (100);
   digitalWrite(PrivodPin, LOW);        // выкл
   delay (x2);
   digitalWrite(PrivodPin, HIGH);       // вкл 3-ий импульс
   delay (100);
   digitalWrite(PrivodPin, LOW);        // выкл   
   delay (x3);
   digitalWrite(PrivodPin, HIGH);       // вкл 4-ый импульс
   delay (100);
   digitalWrite(PrivodPin, LOW);
   delay (y);
   digitalWrite(CameraPin, HIGH);       // вкл Фотоаппарат
   delay (100);
   digitalWrite(CameraPin, LOW);
   delay (y);
   digitalWrite(FlashPin, HIGH);       // вкл Вспышка
   delay (FlashT);
   digitalWrite(FlashPin, LOW);
}
  if(TestPin==LOW&&flag==1)
  {
    flag=0;
  }
  /////////////
unsigned long currentMillis = millis();  //обработка кнопки  4 в низ
if ((key()==4)==HIGH)
{
  m++;
 lcd.clear ();
 previousMillis = currentMillis;        // если кнопка была нажата сбросить счетчик автовозврата к главному экрану
 delay(100);
 if ((key()==4)==LOW)
   {
   lcd.clear ();
   }
if (m>4)                               // если уровень больше 3
  {  
  m=0;                                 // то вернуться к началу
  }
 }
if ((key()==3)== HIGH)                 // Обработка нажатия кнопки PREV
{
  m--;
previousMillis = currentMillis;
delay (100);
if ((key()==3)== LOW)
  {
  lcd.clear ();
   }
 if (m<0)
  {
  m=4;
  }
}

                     // тут  код для уменьшения значений
                     // аналогичен коду увеличения если нужно
                     
//Вывод меню
//Описание экранов меню
 if (m==0)                 
  {                         
  lcd.setCursor(0, 0);      
  lcd.print("1.Camera"); 
  lcd.setCursor(0, 1);      
  lcd.print("Tm:-");        
  lcd.print(CamT/10);            // переменная Интервал камеры 
  lcd.setCursor(7, 1); 
  lcd.print("msec");
  if(key()==5)CamT+=5;       // управление переменной кнопка 5 + 5мсек
  if(key()==3)CamT-=5;       // управление переменной кнопка 3 - 5мсек
  if(CamT < 10)CamT=995;
  if(CamT > 995)CamT=10;
  }
 else if (m==1)            
  {                        
  lcd.setCursor(0, 0);      
  lcd.print("2.*Impuls-2"); 
  lcd.setCursor(0, 1);      
  lcd.print("Tm:-");        
  lcd.print(PrivT2/10);
  lcd.setCursor(7, 1); 
  lcd.print(" msec");  
  if(key()==5)PrivT2+=5;       // управление переменной кнопка 5 + 5мсек
  if(key()==3)PrivT2-=5;       // управление переменной кнопка 3 - 5мсек
  if(PrivT2 < 0)PrivT2=295;
  if(PrivT2 > 295)PrivT2=0;  
  }
 else if (m==2)            
  {                        
  lcd.setCursor(0, 0);      
  lcd.print("3.*Impuls-3"); 
  lcd.setCursor(0, 1);      
  lcd.print("Tm:-");        
  lcd.print(PrivT3/10);
  lcd.setCursor(7, 1); 
  lcd.print("msec"); 
  if(key()==5)PrivT3+=5;       // управление переменной кнопка 5 + 5мсек
  if(key()==3)PrivT3-=5;       // управление переменной кнопка 3 - 5мсек
  if(PrivT3 < 0)PrivT3=295;
  if(PrivT3 > 295)PrivT3=0;    
  }
 else if (m==3)             
  {                         
  lcd.setCursor(0, 0);      
  lcd.print("4.*Impuls-4"); 
  lcd.setCursor(0, 1);      
  lcd.print("Tm:-");        
  lcd.print(PrivT4/10);
  lcd.setCursor(7, 1); 
  lcd.print("msec");        
  if(key()==5)PrivT4+=5;       // управление переменной кнопка 5 + 5мсек
  if(key()==3)PrivT4-=5;       // управление переменной кнопка 3 - 5мсек
  if(PrivT4 < 0)PrivT3=295;
  if(PrivT4 > 295)PrivT3=0;
  }
 else if (m==4)             
  {                         
  lcd.setCursor(0, 0);      
  lcd.print("5.***Flash***"); 
  lcd.setCursor(0, 1);      
  lcd.print("Tm:-");        
  lcd.print(FlashT);
  lcd.setCursor(7, 1); 
  lcd.print("msec");        
  if(key()==5)FlashT+=5;       // управление переменной кнопка 5 + 5мсек
  if(key()==3)FlashT-=5;       // управление переменной кнопка 3 - 5мсек
  if(FlashT < 0)FlashT=95;
  if(FlashT > 95)FlashT=0;
  }
  
  //Проверка автовозврата
    if(currentMillis - previousMillis > interval && m !=0)  //Если счетчик
    {
    previousMillis = currentMillis;              //достиг интервала
    lcd.clear();
    m=0;                                         //то отобразить главный экран
     }
 }



  

 

А вот то что меня имнересует, как реализовать сам процес импульсов и интервалов, у меня получилось вот так но не работает. И с условием для импульсов привода если какой либо интервал =0, следующих импульсов нет, вообще не могу реализовать, че-то туплю безобразно. Вот этот отрывак кода:

///////////  Кнопка Start с одиночным срабатыванием
  if(StartPin==HIGH&&flag==0)
  {
    int x = 500;
    int x1= ((x + PrivT2)+100);
    int x2= ((x1 + PrivT3)+100);
    int x3= ((x2 + PrivT4)+100);
    int y = (x+CamT);
    int z = (y+50);
   delay (x);                     // поставить небольшую задержку
   digitalWrite(PrivodPin, HIGH);       // вкл 1-ый импульс
   delay (100);
   digitalWrite(PrivodPin, LOW);        // выкл
   delay (x1);
   digitalWrite(PrivodPin, HIGH);       // вкл 2-ой импульс
   delay (100);
   digitalWrite(PrivodPin, LOW);        // выкл
   delay (x2);
   digitalWrite(PrivodPin, HIGH);       // вкл 3-ий импульс
   delay (100);
   digitalWrite(PrivodPin, LOW);        // выкл   
   delay (x3);
   digitalWrite(PrivodPin, HIGH);       // вкл 4-ый импульс
   delay (100);
   digitalWrite(PrivodPin, LOW);
   delay (y);
   digitalWrite(CameraPin, HIGH);       // вкл Фотоаппарат
   delay (100);
   digitalWrite(CameraPin, LOW);
   delay (y);
   digitalWrite(FlashPin, HIGH);       // вкл Вспышка
   delay (FlashT);
   digitalWrite(FlashPin, LOW);
}
  if(TestPin==LOW&&flag==1)
  {
    flag=0;
  }
  /////////////