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