Доводчик стекол

evgta
Offline
Зарегистрирован: 02.09.2016
Делать было нечего сваял проект в протеусе доводчиков стекол(на будущее вдруг пригодится) с их параллельной работой и возможностью легко расширить до 3-х или 4-х.
 
Описание работы.
 
При удержании кнопки более 0.5 сек включается автодовод который прекращается по 3-м условиям:
 
1) прошло более 7сек
 
2) стекло уперлось (настраивается подбором шунта и значением на ток блокировки)
 
3) повторное нажатие клавиши вверх или вниз
 
Есть режим доводчика при постановке на охрану, при этом подается либо положит. импульс , либо постоянный +,
 
если подается потоянный + работа в режиме доводчика прекращается.
 
Глючный протеус на проекте работает только до значений миллис 31125, дальше виснет, при заливке на нану миллис работает нормально.
 
схема нарисована частично, доводчик врезается в проводку между клавишей управления и мотором.
код не стал автоформатировать, т.к мне так читать удобнее.

int kn_lev_niz = 8;     // кнопки стеклоподъемника
int kn_lev_verh =7;
int kn_pr_niz =6;
int kn_pr_verh =5;
int closed1=4; 

int v_lev_mo =A3;     //напряжение после шунта левый мотор
int v_pr_mo =A4;       //напряжение после шунта правый мотор
int v_pitani =A5;       // напряжение питания

int v_lev_mot =0;     //напряжение после шунта левый мотор
int v_pr_mot =0;       //напряжение после шунта правый мотор
int v_pitania =0;
int shunt_lev=0;
int shunt_lev_usred=0;
int shunt_lev1=0;
unsigned long time1=0;
unsigned long time2=0;

int shunt_pr=0;
int shunt_pr_usred=0;
int shunt_pr1=0;

int rel_lev_niz = 12;     //реле влево левого мотора
int rel_lev_verh =11;
int rel_pr_niz =10;
int rel_pr_verh =9;
int tok_lev=800;        //ограничение по току блокировки 
int tok_pr=800;        //ограничение по току блокировки 

unsigned long time_mot_lev;
unsigned long time_mot_lev1=7000; // макс время работы мотора
unsigned long time_mot_lev2=500; // время до включения авторежима
unsigned long time_mot_pr;
unsigned long time_mot_pr1=7000; // макс время работы мотора
unsigned long time_mot_pr2=500; // время до включения авторежима


int flag_mot_lev=0;
int flag_mot_lev1=0;
int flag_mot_pr=0;
int flag_mot_pr1=0;


void setup() {
//Serial.begin(9600); 

pinMode(rel_lev_niz, OUTPUT);
pinMode(rel_lev_verh, OUTPUT);
pinMode(rel_pr_niz, OUTPUT);
pinMode(rel_pr_verh, OUTPUT);

pinMode(closed1, INPUT);
pinMode(kn_lev_niz, INPUT);
pinMode(kn_lev_verh, INPUT);
pinMode(kn_pr_niz, INPUT);
pinMode(kn_pr_verh, INPUT);
pinMode(v_lev_mot, INPUT);
pinMode(v_pr_mot, INPUT);
pinMode(v_pitania, INPUT);


}
void loop() 
{

//блок по работе левого мотора
if (digitalRead(kn_lev_niz)==HIGH && flag_mot_lev==0 ){digitalWrite(rel_lev_niz, HIGH);time_mot_lev= millis();flag_mot_lev=1;}  // флаг запускающий отсчет макс времени авторежима
if (digitalRead(kn_lev_niz)==LOW ){flag_mot_lev=0;}
if (time_mot_lev2>millis()-time_mot_lev && flag_mot_lev==0){digitalWrite(rel_lev_niz, LOW);shunt_lev_usred=0; shunt_lev1=0;}  //при отпускании кнопки раньше времени автоработы вверх соответственно автодовод не включается
if (time_mot_lev1<millis()-time_mot_lev && flag_mot_lev==0){digitalWrite(rel_lev_niz, LOW);shunt_lev_usred=0; shunt_lev1=0; flag_mot_lev1=0;}  // по превышению макс времени автодовода автодовод вверх отключается
if (digitalRead( kn_lev_verh)==HIGH && flag_mot_lev1==0 ){ digitalWrite(rel_lev_verh, HIGH);time_mot_lev= millis();flag_mot_lev1=1;}  // флаг запускающий отсчет макс времени авторежима
if (digitalRead( kn_lev_verh)==LOW){flag_mot_lev1=0;}
if (time_mot_lev2>millis()-time_mot_lev && flag_mot_lev1==0){digitalWrite(rel_lev_verh, LOW);shunt_lev_usred=0; shunt_lev1=0; flag_mot_lev1=0; }       //при отпускании кнопки раньше времени автоработы вниз соответственно автодовод не включается
if (time_mot_lev1<millis()-time_mot_lev && flag_mot_lev1==0){digitalWrite(rel_lev_verh, LOW);shunt_lev_usred=0; shunt_lev1=0; flag_mot_lev1=0;  }   // по превышению макс времени автодовода автодовод вниз отключается

if (time_mot_lev2<millis()-time_mot_lev && flag_mot_lev==0){v_pitania = analogRead(v_pitani); v_lev_mot = analogRead(v_lev_mo); shunt_lev=v_pitania-v_lev_mot; shunt_lev_usred=shunt_lev+shunt_lev_usred;shunt_lev1=shunt_lev1+1;  }
if (shunt_lev1==10){if (shunt_lev_usred>tok_lev){digitalWrite(rel_lev_niz, LOW);digitalWrite(rel_lev_verh, LOW);flag_mot_lev1=0;  }}   // блокировка по току c усреднением по 10 значениям
if (shunt_lev1==10){shunt_lev_usred=0; shunt_lev1=0;}                                                                                   // блокировка по току c усреднением по 10 значениям

// блок по работе правого мотора
if (digitalRead(kn_pr_niz)==HIGH && flag_mot_pr==0 ){digitalWrite(rel_pr_niz, HIGH);time_mot_pr= millis();flag_mot_pr=1;}  
if (digitalRead(kn_pr_niz)==LOW ){flag_mot_pr=0;}
if (time_mot_pr2>millis()-time_mot_pr && flag_mot_pr==0){digitalWrite(rel_pr_niz, LOW);shunt_pr_usred=0; shunt_pr1=0;}
if (time_mot_pr1<millis()-time_mot_pr && flag_mot_pr==0){digitalWrite(rel_pr_niz, LOW);shunt_pr_usred=0; shunt_pr1=0; flag_mot_pr1=0;}
if (digitalRead( kn_pr_verh)==HIGH && flag_mot_pr1==0 ){ digitalWrite(rel_pr_verh, HIGH);time_mot_pr= millis();flag_mot_pr1=1;}  
if (digitalRead( kn_pr_verh)==LOW){flag_mot_pr1=0;}
if (time_mot_pr2>millis()-time_mot_pr && flag_mot_pr1==0){digitalWrite(rel_pr_verh, LOW);shunt_pr_usred=0; shunt_pr1=0; flag_mot_pr1=0;}
if (time_mot_pr1<millis()-time_mot_pr && flag_mot_pr1==0){digitalWrite(rel_pr_verh, LOW);shunt_pr_usred=0; shunt_pr1=0; flag_mot_pr1=0;}

if (time_mot_pr2<millis()-time_mot_pr && flag_mot_pr==0){v_pitania = analogRead(v_pitani); v_pr_mot = analogRead(v_pr_mo); shunt_pr=v_pitania-v_pr_mot; shunt_pr_usred=shunt_pr+shunt_pr_usred;shunt_pr1=shunt_pr1+1;  }
if (shunt_pr1==10){if (shunt_pr_usred>tok_pr){digitalWrite(rel_pr_niz, LOW);digitalWrite(rel_pr_verh, LOW);flag_mot_pr1=0;  }}   
if (shunt_pr1==10){shunt_pr_usred=0; shunt_pr1=0;}                                                                                  

//Serial.println(millis());
//Serial.println(shunt_pr);
//Serial.println(shunt_pr1);
//Serial.println(shunt_pr_usred);
//Serial.println(" ");


if (digitalRead(closed1)==HIGH){closedlev();closedpr(); } // доводка при постановке на охрану

}

// функция доводки при закрытии дверей

void closedlev() 
{
//   довод при охране лев мотор
time2=0;
shunt_lev1=0;
shunt_lev_usred=0;
digitalWrite(rel_lev_verh, HIGH);
for (time1 = millis(); time2 <=time_mot_lev1; time2=millis()-time1)  // цикл на макс время довода
{
v_pitania = analogRead(v_pitani); v_lev_mot = analogRead(v_lev_mo); shunt_lev=v_pitania-v_lev_mot; shunt_lev_usred=shunt_lev+shunt_lev_usred;shunt_lev1=shunt_lev1+1;  
if (shunt_lev1==10){if (shunt_lev_usred>tok_lev){digitalWrite(rel_lev_niz, LOW);digitalWrite(rel_lev_verh, LOW);break; }}   // блокировка по току
if (shunt_lev1==10){shunt_lev_usred=0; shunt_lev1=0;}  
}
digitalWrite(rel_lev_verh, LOW);shunt_lev_usred=0; shunt_lev1=0;flag_mot_lev=0;
}
//   довод при охране прав мотор
void closedpr()
{
time2=0;
shunt_pr1=0;
shunt_pr_usred=0;
digitalWrite(rel_pr_verh, HIGH);
for (time1 = millis(); time2 <=time_mot_pr1; time2=millis()-time1)  
{
v_pitania = analogRead(v_pitani); v_pr_mot = analogRead(v_pr_mo); shunt_pr=v_pitania-v_pr_mot; shunt_pr_usred=shunt_pr+shunt_pr_usred;shunt_pr1=shunt_pr1+1;  
if (shunt_pr1==10){if (shunt_pr_usred>tok_pr){digitalWrite(rel_pr_niz, LOW);digitalWrite(rel_pr_verh, LOW);break; }}   // блокировка по току
if (shunt_pr1==10){shunt_pr_usred=0; shunt_pr1=0;}  
}


digitalWrite(rel_pr_verh, LOW);shunt_pr_usred=0; shunt_pr1=0;flag_mot_pr=0;
while(1){if(digitalRead(closed1)==LOW){break;}}
}













 

ссылк на проект

https://drive.google.com/open?id=0B7zPXIoEu3Ohbk9kU3c0Q2QydVk

 

 

 

evgta
Offline
Зарегистрирован: 02.09.2016

вот в автоформатировании


int kn_lev_niz = 8;     // кнопки стеклоподъемника
int kn_lev_verh = 7;
int kn_pr_niz = 6;
int kn_pr_verh = 5;
int closed1 = 4;

int v_lev_mo = A3;    //напряжение после шунта левый мотор
int v_pr_mo = A4;      //напряжение после шунта правый мотор
int v_pitani = A5;      // напряжение питания

int v_lev_mot = 0;    //напряжение после шунта левый мотор
int v_pr_mot = 0;      //напряжение после шунта правый мотор
int v_pitania = 0;
int shunt_lev = 0;
int shunt_lev_usred = 0;
int shunt_lev1 = 0;
unsigned long time1 = 0;
unsigned long time2 = 0;

int shunt_pr = 0;
int shunt_pr_usred = 0;
int shunt_pr1 = 0;

int rel_lev_niz = 12;     //реле влево левого мотора
int rel_lev_verh = 11;
int rel_pr_niz = 10;
int rel_pr_verh = 9;
int tok_lev = 800;      //ограничение по току блокировки
int tok_pr = 800;      //ограничение по току блокировки

unsigned long time_mot_lev;
unsigned long time_mot_lev1 = 7000; // макс время работы мотора
unsigned long time_mot_lev2 = 500; // время до включения авторежима
unsigned long time_mot_pr;
unsigned long time_mot_pr1 = 7000; // макс время работы мотора
unsigned long time_mot_pr2 = 500; // время до включения авторежима


int flag_mot_lev = 0;
int flag_mot_lev1 = 0;
int flag_mot_pr = 0;
int flag_mot_pr1 = 0;


void setup() {
  //Serial.begin(9600);

  pinMode(rel_lev_niz, OUTPUT);
  pinMode(rel_lev_verh, OUTPUT);
  pinMode(rel_pr_niz, OUTPUT);
  pinMode(rel_pr_verh, OUTPUT);

  pinMode(closed1, INPUT);
  pinMode(kn_lev_niz, INPUT);
  pinMode(kn_lev_verh, INPUT);
  pinMode(kn_pr_niz, INPUT);
  pinMode(kn_pr_verh, INPUT);
  pinMode(v_lev_mot, INPUT);
  pinMode(v_pr_mot, INPUT);
  pinMode(v_pitania, INPUT);


}
void loop()
{

  //блок по работе левого мотора
  if (digitalRead(kn_lev_niz) == HIGH && flag_mot_lev == 0 ) {
    digitalWrite(rel_lev_niz, HIGH);  // флаг запускающий отсчет макс времени авторежима
    time_mot_lev = millis();
    flag_mot_lev = 1;
  }
  if (digitalRead(kn_lev_niz) == LOW ) {
    flag_mot_lev = 0;
  }
  if (time_mot_lev2 > millis() - time_mot_lev && flag_mot_lev == 0) {
    digitalWrite(rel_lev_niz, LOW);  //при отпускании кнопки раньше времени автоработы вверх соответственно автодовод не включается
    shunt_lev_usred = 0;
    shunt_lev1 = 0;
  }
  if (time_mot_lev1 < millis() - time_mot_lev && flag_mot_lev == 0) {
    digitalWrite(rel_lev_niz, LOW);  // по превышению макс времени автодовода автодовод вверх отключается
    shunt_lev_usred = 0;
    shunt_lev1 = 0;
    flag_mot_lev1 = 0;
  }
  if (digitalRead( kn_lev_verh) == HIGH && flag_mot_lev1 == 0 ) {
    digitalWrite(rel_lev_verh, HIGH);  // флаг запускающий отсчет макс времени авторежима
    time_mot_lev = millis();
    flag_mot_lev1 = 1;
  }
  if (digitalRead( kn_lev_verh) == LOW) {
    flag_mot_lev1 = 0;
  }
  if (time_mot_lev2 > millis() - time_mot_lev && flag_mot_lev1 == 0) {
    digitalWrite(rel_lev_verh, LOW);  //при отпускании кнопки раньше времени автоработы вниз соответственно автодовод не включается
    shunt_lev_usred = 0;
    shunt_lev1 = 0;
    flag_mot_lev1 = 0;
  }
  if (time_mot_lev1 < millis() - time_mot_lev && flag_mot_lev1 == 0) {
    digitalWrite(rel_lev_verh, LOW);  // по превышению макс времени автодовода автодовод вниз отключается
    shunt_lev_usred = 0;
    shunt_lev1 = 0;
    flag_mot_lev1 = 0;
  }

  if (time_mot_lev2 < millis() - time_mot_lev && flag_mot_lev == 0) {
    v_pitania = analogRead(v_pitani);
    v_lev_mot = analogRead(v_lev_mo);
    shunt_lev = v_pitania - v_lev_mot;
    shunt_lev_usred = shunt_lev + shunt_lev_usred;
    shunt_lev1 = shunt_lev1 + 1;
  }
  if (shunt_lev1 == 10) {
    if (shunt_lev_usred > tok_lev) {
      digitalWrite(rel_lev_niz, LOW);  // блокировка по току c усреднением по 10 значениям
      digitalWrite(rel_lev_verh, LOW);
      flag_mot_lev1 = 0;
    }
  }
  if (shunt_lev1 == 10) {
    shunt_lev_usred = 0;  // блокировка по току c усреднением по 10 значениям
    shunt_lev1 = 0;
  }

  // блок по работе правого мотора
  if (digitalRead(kn_pr_niz) == HIGH && flag_mot_pr == 0 ) {
    digitalWrite(rel_pr_niz, HIGH);
    time_mot_pr = millis();
    flag_mot_pr = 1;
  }
  if (digitalRead(kn_pr_niz) == LOW ) {
    flag_mot_pr = 0;
  }
  if (time_mot_pr2 > millis() - time_mot_pr && flag_mot_pr == 0) {
    digitalWrite(rel_pr_niz, LOW);
    shunt_pr_usred = 0;
    shunt_pr1 = 0;
  }
  if (time_mot_pr1 < millis() - time_mot_pr && flag_mot_pr == 0) {
    digitalWrite(rel_pr_niz, LOW);
    shunt_pr_usred = 0;
    shunt_pr1 = 0;
    flag_mot_pr1 = 0;
  }
  if (digitalRead( kn_pr_verh) == HIGH && flag_mot_pr1 == 0 ) {
    digitalWrite(rel_pr_verh, HIGH);
    time_mot_pr = millis();
    flag_mot_pr1 = 1;
  }
  if (digitalRead( kn_pr_verh) == LOW) {
    flag_mot_pr1 = 0;
  }
  if (time_mot_pr2 > millis() - time_mot_pr && flag_mot_pr1 == 0) {
    digitalWrite(rel_pr_verh, LOW);
    shunt_pr_usred = 0;
    shunt_pr1 = 0;
    flag_mot_pr1 = 0;
  }
  if (time_mot_pr1 < millis() - time_mot_pr && flag_mot_pr1 == 0) {
    digitalWrite(rel_pr_verh, LOW);
    shunt_pr_usred = 0;
    shunt_pr1 = 0;
    flag_mot_pr1 = 0;
  }

  if (time_mot_pr2 < millis() - time_mot_pr && flag_mot_pr == 0) {
    v_pitania = analogRead(v_pitani);
    v_pr_mot = analogRead(v_pr_mo);
    shunt_pr = v_pitania - v_pr_mot;
    shunt_pr_usred = shunt_pr + shunt_pr_usred;
    shunt_pr1 = shunt_pr1 + 1;
  }
  if (shunt_pr1 == 10) {
    if (shunt_pr_usred > tok_pr) {
      digitalWrite(rel_pr_niz, LOW);
      digitalWrite(rel_pr_verh, LOW);
      flag_mot_pr1 = 0;
    }
  }
  if (shunt_pr1 == 10) {
    shunt_pr_usred = 0;
    shunt_pr1 = 0;
  }

  //Serial.println(millis());
  //Serial.println(shunt_pr);
  //Serial.println(shunt_pr1);
  //Serial.println(shunt_pr_usred);
  //Serial.println(" ");


  if (digitalRead(closed1) == HIGH) {
    closedlev();  // доводка при постановке на охрану
    closedpr();
  }

}

// функция доводки при закрытии дверей

void closedlev()
{
  //   довод при охране лев мотор
  time2 = 0;
  shunt_lev1 = 0;
  shunt_lev_usred = 0;
  digitalWrite(rel_lev_verh, HIGH);
  for (time1 = millis(); time2 <= time_mot_lev1; time2 = millis() - time1) // цикл на макс время довода
  {
    v_pitania = analogRead(v_pitani); v_lev_mot = analogRead(v_lev_mo); shunt_lev = v_pitania - v_lev_mot; shunt_lev_usred = shunt_lev + shunt_lev_usred; shunt_lev1 = shunt_lev1 + 1;
    if (shunt_lev1 == 10) {
      if (shunt_lev_usred > tok_lev) {
        digitalWrite(rel_lev_niz, LOW);  // блокировка по току
        digitalWrite(rel_lev_verh, LOW);
        break;
      }
    }
    if (shunt_lev1 == 10) {
      shunt_lev_usred = 0;
      shunt_lev1 = 0;
    }
  }
  digitalWrite(rel_lev_verh, LOW); shunt_lev_usred = 0; shunt_lev1 = 0; flag_m

 

Murzilka
Offline
Зарегистрирован: 25.02.2017

Добрый день! Этот проект был реализован в жизнь? 

Хочу повторить данный девайс, но иемю малый опыт )).

evgta
Offline
Зарегистрирован: 02.09.2016

этот небыл, он выложен для того чтобы не потерять, был проверен в протеусе и все.

Murzilka
Offline
Зарегистрирован: 25.02.2017

Можно как-то связатся с Вами в более удобном месенджере? )) Есть вопросик.

sirota
Offline
Зарегистрирован: 18.08.2015

Murzilka пишет:

Можно как-то связатся с Вами в более удобном месенджере? )) Есть вопросик.

http://www.gsm-signalka.ru/avtosignal-aksessuar-steklopod-control.php

Ну и вообще поиском. В оффлайне будет не дороже.

serg3751
Offline
Зарегистрирован: 17.02.2020

Добрый день.Решил повторить схему,собрал на столе.Работает но хотелось бы поменять кое чего.При быстром нажатии до 0,5 сек включался автодовод, а придлительном нажатии более 0,5 сек стекло опускалось или поднималось пока держишь кнопку.

 

b707
Онлайн
Зарегистрирован: 26.05.2017

serg3751 пишет:

 хотелось бы поменять кое чего.

ну так меняйте, код открыт

serg3751
Offline
Зарегистрирован: 17.02.2020

Вот этом и проблема,я не силён в программировании,пытаюсь но пока без успешно(

b707
Онлайн
Зарегистрирован: 26.05.2017

serg3751 пишет:
Вот этом и проблема,я не силён в программировании,пытаюсь но пока без успешно(

за вас ваши желания вряд ли кто-то возьмется реализовывать

serg3751
Offline
Зарегистрирован: 17.02.2020

b707 пишет:

serg3751 пишет:
Вот этом и проблема,я не силён в программировании,пытаюсь но пока без успешно(

за вас ваши желания вряд ли кто-то возьмется реализовывать

Мир не без добрых людей

vk007
Offline
Зарегистрирован: 16.06.2015

serg3751 пишет:

Мир не без добрых людей

Вы не там их ищите. Значительно больше шансов встретиться двум добрым людям в разделе Ищу исполнителя. Там один добрый жертвует другому свое время, а второй, в качестве благодарности (он ведь тоже добрый) - некую денежную сумму.

serg3751
Offline
Зарегистрирован: 17.02.2020

Тут есть кто поможет?не бесплатно

satelit 2
Offline
Зарегистрирован: 04.12.2016

доводчик стекл на ниссане таким методом работает, не проще с авторазбора готовое приобрести.