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

Тема в разделе "Arduino & Shields", создана пользователем Sergey_75, 14 мар 2014.

  1. Sergey_75

    Sergey_75 Нуб

    Замучился я с этим кодом, ничего у меня не получается помогите. Я делаю устройство для управления Фотокамерой, приводом, и вспышкой. Вот схема как я вижу работу данного устройства:
    [​IMG]
    Вот весь код который я написал, не судите строго мой первый блин:
    Код (Text):
    #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, следующих импульсов нет, вообще не могу реализовать, че-то туплю безобразно. Вот этот отрывок кода:
    Код (Text):
    ///////////  Кнопка 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;
      }
      /////////////
     
  2. Unixon

    Unixon Оракул Модератор

    Попробуйте сделать вот как:

    1) Создайте таблицу событий

    Код (Text):
    struct pin_event_t { long int time; byte pin; byte state; };
    const byte N_EVENTS = ...;
    pin_event_t Events[N_EVENTS];
    2) В главном цикле

    Код (Text):
    prev_time = current_time;
    current_time = millis();
    for (byte i = last_event+1; i < N_EVENTS; i++)
    {
     long int t = Events[i].time;
     if ((t>last_time) && (t<=current_time))
     {
      digitalWrite(Events[i].pin, Events[i].state);
      last_event = i;
     }
    }