roboforum.ru

Технический форум по робототехнике.

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

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

Sergey_75 » 14 мар 2014, 13:38

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

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

RootAdmin » 15 мар 2014, 11:43

А что значит "импульсов нет"?
Переменные x1 x2 x3 задаются очень странно. Как будто от нуля. А выполняется "задержка" последовательно.
То есть если x1=500 то сработает только через 1500. Сначала задержка x потом x1 которая 1000. Как нужно?

Быдлопроверка наличия значения предыдущих интервалов:
Код: Выделить всёРазвернуть
   delay (x1);
if (x1);{ //Если x1 больше 0
   digitalWrite(PrivodPin, HIGH);       // вкл 2-ой импульс
   delay (100);
   digitalWrite(PrivodPin, LOW);        // выкл
         }
   delay (x2);
if (x1 && x2);{//Если x1 И x2 больше 0
   digitalWrite(PrivodPin, HIGH);       // вкл 3-ий импульс
   delay (100);
   digitalWrite(PrivodPin, LOW);        // выкл   
               } 
   delay (x3);
if (x1 && x2 && x3);{//Если x1 И x2 И x3 больше 0
   digitalWrite(PrivodPin, HIGH);       // вкл 4-ый импульс
   delay (100);
   digitalWrite(PrivodPin, LOW);
                    }



Rambler\'s Top100 Mail.ru counter