Доводчик стекол
- Войдите на сайт для отправки комментариев
Чт, 11/05/2017 - 13:40
Делать было нечего сваял проект в протеусе доводчиков стекол(на будущее вдруг пригодится) с их параллельной работой и возможностью легко расширить до 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

вот в автоформатировании
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Добрый день! Этот проект был реализован в жизнь?
Хочу повторить данный девайс, но иемю малый опыт )).
этот небыл, он выложен для того чтобы не потерять, был проверен в протеусе и все.
Можно как-то связатся с Вами в более удобном месенджере? )) Есть вопросик.
Можно как-то связатся с Вами в более удобном месенджере? )) Есть вопросик.
http://www.gsm-signalka.ru/avtosignal-aksessuar-steklopod-control.php
Ну и вообще поиском. В оффлайне будет не дороже.
Добрый день.Решил повторить схему,собрал на столе.Работает но хотелось бы поменять кое чего.При быстром нажатии до 0,5 сек включался автодовод, а придлительном нажатии более 0,5 сек стекло опускалось или поднималось пока держишь кнопку.
хотелось бы поменять кое чего.
ну так меняйте, код открыт
Вот этом и проблема,я не силён в программировании,пытаюсь но пока без успешно(
за вас ваши желания вряд ли кто-то возьмется реализовывать
за вас ваши желания вряд ли кто-то возьмется реализовывать
Мир не без добрых людей
Мир не без добрых людей
Вы не там их ищите. Значительно больше шансов встретиться двум добрым людям в разделе Ищу исполнителя. Там один добрый жертвует другому свое время, а второй, в качестве благодарности (он ведь тоже добрый) - некую денежную сумму.
Тут есть кто поможет?не бесплатно
доводчик стекл на ниссане таким методом работает, не проще с авторазбора готовое приобрести.