Модуль автозапуска автомобиля, с голосовыми сообщениями работы авто, по каналу GSM, разрабатывался с целью отсутствия автозапуска в авто, как дополнение к любой “простой” или штатной сигнализации. А так-же не иметь привязки к интернету (дополнительные траты) и SMS сообщений (сообщения могут “зависнуть” на сервере провайдера сотовой связи). Способностью работы с любым телефоном, кнопочным или смартфоном. Модуль работает в сетях GSM, надежность связи блока зависит от покрытия связью провайдером связи. Он не является автосигнализацией, а дополнением для автосигнализации с возможностью дистанционного запуска двигателя авто с ручной коробкой передач.
У модуля имеются следующие сервисные возможности.
-
Режим пидстопа. Если при работающем двигателе включить ручной тормоз, начнут периодически включатся фонари поворотников, и включится вентилятор печки (в режим, установленный при монтаже модуля). И при этом извлечь ключ из замка зажигания двигатель будет работать еще 10 минут. Если позвонить в это время на номер SIM карты модуля он сообщит “в режиме пидстопа”.
-
Если в режиме пидстопа выйти из авто, двигатель при этом продолжает работать, и закрыть брелком двери, поставить на охрану, то произойдет постановка на разрешение автозапуска.
-
Если при работающем двигателе, сначала заглушить мотор, затем включить ручной тормоз, подготовки к автозапуску не произойдет.
-
Если авто не было подготовлено к автозапуску, и при звонке на модуль попытаться подать команду на запуск, три раза сработает сигнал поворотников, сообщит “не в режиме запуска”.
-
Автозапуск двигателя происходит четырьмя попытками, если не произошло запуска сообщит “повторный запуск”. 1 попытка прокрутка стартера 0,75 сек., последующие попытки старта прибавляют по 0,25 сек.
-
Если после 4 попыток авто не завелось, сообщит “не получилось попробуйте еще раз”, три раза моргнет поворотником.
-
Двигатель авто в режиме авто прогрева работает 10 минут, если Вы считаете, что этого недостаточно после первого цикла прогрева, позвоните и еще раз запустите двигатель. В режиме авто прогрева периодически включаются фонари поворотников.
-
Если авто было подготовлено к автозапуску и открыли дверь авто, то режим автозапуска сбросится. И дистанционного запуска не произойдет.
-
Если авто находится в режиме авто прогрева, двигатель работает и открыть двери (взять или положить в салон авто что ни будь), а затем авто поставить вновь на сигнализацию. То будет проведено разрешение на автозапуск для следующего раза.
-
Если авто находится в режиме авто прогрева. И позвонить в это время сообщит “уже прогреваюсь”.
-
Если авто уже работает и не включен ручной тормоз, возможно авто в движении, то модуль при входящем звонке сообщит “двигатель уже запущен”.
-
Если у Вашей установленной или штатной сигнализации, на брелке имеется кнопка открытия багажника ее можно задействовать как старт для автозапуска авто, подготовленного к старту, подав команду нажав на кнопку открытия багажника.
-
При срабатывании “колокола” автосигнализации, модуль перезвонит вам и сообщит “сработала сигнализация авто”. Можно прослушать или не отвечать на звонок, сбросить.
-
Если авто ставилось на охрану сигнализацией и колокол “пикнул”, то при открытии двери модуль перезвонит вам и сообщит “открыта дверь авто”. Полезна тем что, если сняли авто с охраны сканером она Вам перезвонит. Можно не отвечать на звонок, сбросить. Что бы модуль не звонил Вам при открытии двери, необходимо позвонив на модуль, подать команду 56 или ставить на охрану беззвучно. Не забудьте потом включить контроль открытия дверей командой 65.
-
Если в авто включено зажигание, но не работает мотор, то модуль при входящем звонке сообщит “ включено зажигание”.
-
Если авто в режиме прогрева, при звонке на модуль будет сообщение “уже прогреваюсь”.
Управление модулем следующее.
Когда пользователь звонит, на номер SIM карты, установленной в модуле. Происходит автоответ модуля и в динамике звучит двух тональный гудок. После прекращения звуков, в динамике наступает тишина.
После этого можно подавать следующие команды с клавиатуры телефона;
-
45 прозвучит “контроль связи”, модуль отключит Вас и перезвонит на номер записанный на SIM карте. Опция необходима для проверки находится ли авто в зоне уверенного приема сотового оператора. Или что бы 1 раз в три месяца модуль перезвонил Вам, в противном случае возможно отключение SIM карты от сети.
-
03 прозвучит “все поняла завожу”, если была проведена процедура подготовки авто к запуску. Модуль проведет запуск двигателя, от 1 до 4 попыток. Будет сообщать о режимах “зажигание”, “стартер”, “повторный запуск”, об успешном запуске “двигатель запушен” или не успешном “не запустилась! попробуйте еще раз!” и автоматически отключится. Если не было подготовки авто к запуску прозвучит “не в режиме запуска”, 3 раза моргнет поворотниками и отключится.
-
30 прозвучит “стоп прогрева”, модуль остановит двигатель, если авто было в режиме прогрева и автоматически отключится.
-
56 прозвучит “ отключен контроль дверей”, отключит автодозвон при открытии двери авто и автоматически отключится
-
65 прозвучит “ включен контроль дверей”, включит автодозвон при открытии двери авто и автоматически отключится.
-
89 прозвучит “ двигатель блокирован”, заблокирует двигатель (блокировка реле бензонасоса), будет включен периодический сигнал клаксона, моргание дальним светом фар и фонарями поворотников, для привлечения внимания. Автоматического отключения звонка не произойдет. Полезна для поиска авто на крупном паркинге.
-
98 прозвучит “ продолжайте движение”, разблокирует двигатель (разблокирует реле бензонасоса), отключит периодический сигнал клаксона и моргание дальним светом фар и фонари поворотников, автоматически отключится.
Основная часть интерфейса построена, из следующих функциональных блоков;
-
Основная монтажная плата.
-
Две платы Arduino_Promini 328-5V, 1я плата программная, 2я обработчик тахометра
-
GSM модуль SIM800L.
-
Стабилизатора напряжения mini360, для питания gsm модуля.
-
Платы преобразователя уровня тахометра
-
Блока внешних реле, выполненных “на проводах”
Принципиальная схема.
Рис1.

Пояснения входов схемы;
Podxvat выход на реле зажигания Podxvat
Start выход на реле стартера
Block выход на реле блокировки двигателя
Klaxon Ligh выход на реле дальнего света и клаксона
Parking вход на датчик паркинга или ручника
Stop вход от концевика педали тормоза
Ignition1 вход от замка зажигания для контроля наличия ключа в замке
Ignition 2 вход для контроля работы при отсутствии ключа в замке
Alarm вход при срабатывании колокола сигнализации авто
Tahometr вход от сигнала тахометра или форсунки
CentrZamok вход сигнала от центрального замка при закрытии дверей, замыканием на массу
ACC выход для вторичных приборов авто, мотор печки
Pusk_Sig вход на запуск от автосигнализации, команда открытия багажника
Blinks выход моргать поворотником
Door- или Door+ - в зависимости кокой уровень сигнала при срабатывании датчика двери
автомобиля.
Immo – Deton На реле обходчика иммобилайзера и отключения датчика детонации.
В схеме не прорисованы обмотки катушек реле и их коммутационные цепи.
Некоторые реле коммутирующие цепи автомобиля расположены на печатной плате, как будет осуществлятся коммутация, зависит откомплектации авто.
Схема блока дополнительных реле:

Особенно обратить внимание каким сигналом управляется клаксон плюсом или массой.
Так же если в эл. схеме авто присутствуют силовые реле клаксона и дальнего света то можно исключить дополнительные силовые реле.
Собранное устройство напоминает технологию “бутерброд”, из-за экономии места, и следствия доработок.



Процесс сборки, когда готова печатная плата, в моем случае изготовлялась способом ЛУТ.
Сначала монтируются все оптопары и smd резисторы, так как две оптопары и резисторы находятся под SIM модулем. Затем монтируется GSM SIM модуль. SIM модуль, 1я (arduino) плата программная (нижняя) и 2я (arduino) обработчик тахометра (верхняя) устанавливаются при монтаже на штырьках. Печатные платы в Sprint-Layout6 и PDF прилагаются в архиве.
Стабилизатор mini360, впаивается вертикально рядом с SIM модулем, предварительно установив на нем 4,0 вольта, так как GSM модулю для работы, согласно документации, необходимо 3,6-4,2 вольта. Вход (12V.) и выход (4.0V) стабилизатора соединены к контактным площадкам основной платы проводниками.
Далее необходимо запрограммировать GSM SIM модуль для работы в Российских сетях сотовой связи. Мною была использована терминальная программа SIM900 DIALOG. Подключение, к примеру, по следующей схеме.

Отправив в терминальной программе, GSM модулю, по отдельности, следующие команды;
AT+IPR=9600
ATE1
AT+DDET=1
AT+CMGF=0
AT+CMCB=1
AT+CSCS="gsm"
AT+CNMI=2,1,0,0,0
AT+VTD=1
AT+CMEE=1
AT+COLP=1
AT&W
На каждую из команд должен прийти ответ ОК, в терминальной программе.

Не отключая модуля от компьютера, необходимо записать во внутреннюю flash память GSM модуля, голосовые файлы с расширением amr. Делается это через программу Sim800 Series ArmFile Download v1.00, следующие сообщения;
// 1 открываю двери! (зарезервировано на будущие доработки)
// 2 двигатель запущен, двигатель запущен!...
// 3 оп, повторный запуск!
// 4 закрываю двери! (зарезервировано на будущие доработки)
// 5 уже, прогреваюсь!
// 6 стоп прогрева!
// 7 все поняла, завожу!
// 8 двигатель блокирован, двигатель блокирован...
// 9 продолжайте движение!
// 10 оп, двигатель уже запущен!
// 11 контроль связи!
// 12 низкое напряжение!
// 13 короткие гудки (зарезервировано на будущие доработки)
// 14 нарушение охраны!
// 15 открыта! дверь! авто!
// 16 Включена Тихая Блокировка. (зарезервировано на будущие доработки)
// 17 отключен! контроль! двери!
// 18 включен! контроль! двери!
// 19 Стартер
// 20 не в режиме запуска
// 21 Зажигание!
// 22 SMS
// 23 Включено! Зажигание!
// 24 не запустилась! попробуйте еще раз!...
// 25 авто! в режиме! пидстопа!
В комплекте прилагается программа и голосовые файлы. Так как программа, ArmFile Download, не может записать одновременно более 10 файлов. То для удобства (что бы не прописывать каждый раз путь к файлам), на диск D:\ копируем папку Voice_files, с amr. файлами. И перед каждым запуском программы, для удобства, подменяем Config.ini в папке с программой ArmFile Download, прилагаемыми файлами (Config1.ini _ Config2.ini _ Config3.ini.), из папки Voice_files, переименовывая их в Config.ini.
После того как все запрограммировали, проверяем работоспособность GSM SIM800L модуля, например программой SIM900 DIALOG. Установив в модуль sim карту, подключив к питанию, запускаем терминальную программу, звоним на номер сим карты модуля. Увидев в терминале сообщение о входящем звонке, отправляем команду ответа на звонок АТА. Когда соединение произойдет можно проиграть записанные arm. файлы, отправив в окне терминала следующее.
Воспроизвести файл "в телефон" с уровнем громкости 90%: AT+CREC=4,"C:\User\9.amr",0,90 (где 9.amr это номер голосового сообщения).
Убедившись, что все голосовые сообщения нормально проигрываются. Отключаем модуль для дальнейшей сборки.
Впаиваем на штырьках из комплекта Arduino остальные платы и рядом плату преобразователя уровней тахометра. Соединяем недостающие соединения проводниками. Так как у процессора Arduino 1й программной платы использованы все ножки, включая TX-RX, предназначенные для программирования и работы в мониторе порта, программирование при этом происходит нормально так как в Arduino присутствует загрузчик. И чтобы модуль мог корректно определять напряжение аккумуляторной батареи авто, необходимо вычислить коэффициент деления АЦП процессора, из-за разброса параметров резисторов на pin A6. Загружаем в плату скетч ACP_pin, наблюдая через монитор порта подбираем значение float m1 = ХХ.ХХ в скетче и сверяя с показанием тестера, измеряя напряжение питания модуля. Вычислив коэффициент АЦТ (ХХ.ХХ), записываем это значение в основном скетче Programs. Программируем обе платы Arduino нижнюю программную скетчем Programs (со скорректированным коэффициентом АЦП), верхнюю частотомера скетчем Frequency_meter. Подсоединяем необходимые внешние силовые реле.
Проверяем полностью собранное устройство на столе, вместо исполнительных устройств авто подключаем тумблера, кнопки и светодиоды. В качестве источника частоты тахометра, использовал трансформатор 220/3V. Работа скетчей расписана в них самих. Подключение к авто согласно схемы конкретного автомобиля.
ACP_pin.ino
03 | #include <SoftwareSerial.h> |
04 | #define BAT_Pin A6 // вход на батарею, через делитель напряжения 47kom / 10 кОм |
06 | float Vbat1, Vbat1Start, V_min1 ; |
10 | unsigned long Time1 = 0; |
19 | if (millis() > Time1 + 500) Time1 = millis(), detection1(); |
29 | float ADCC1 = analogRead(BAT_Pin); |
32 | if (ADCC1 < V_min1) V_min1 = ADCC1; |
Programs.ino
037 | #include <SoftwareSerial.h> |
038 | SoftwareSerial SIM800(7, 6); |
040 | #define Podxvat 12 // выход на реле зажигания Podxvat + реле датчик детонации-иммобилайзер |
041 | #define Start 10 // выход на реле стартера |
042 | #define Block 13 // выход на реле блокировки двигателя с клаксоном |
043 | #define ObrabotkaCall A5 // вывод для отработки обратного звонка |
044 | #define Klaxon 8 // выход на реле дальнего света и клаксона |
045 | #define BAT_Pin A6 // вход на батарею, через делитель напряжения 47kom / 10 кОм |
046 | #define Parking A1 // вход на датчик паркинга или ручник, HIGH на паркинге(программно) |
047 | #define StopPin A2 // вход на концевик педали тормоза, HIGH |
048 | #define Ignition A3 // вход на провод от замка зажигания, HIGH |
049 | #define Alarm 2 // вход для звонка при срабатывания сигналки |
050 | #define Door 3 // вход для звонка при срабатывании дверей, на массу, LOW |
051 | #define ObrabotkaDveri A4 // вывод для обработки открытой двери |
052 | #define ZapretDoor A0 // вывод для обработки, отключения контроля открытия двери |
053 | #define Tahometr 5 // вывод Tahometr, HIGH есть подсчет импульсов от тахометра |
054 | #define RazrAutoZap 11 // вывод для обработки разрешения на авто запуск, HIGH |
055 | #define CentrZamok 4 // вход сигнала от центр замка при закрытии дверей, на массу, LOW |
056 | #define ACC 9 // выход для вторичных приборов авто, HIGH |
057 | #define Pusk_Sig A7 // вход от авто сигнализации на запуск |
058 | #define Blinks9 1 // выход 3 раза моргнуть поворотником, не в режиме запуска |
059 | #define Blinks10 0 // выход моргать поворотником в режиме прогрева |
068 | unsigned long Time1 = 0; |
069 | unsigned long Time2 = 0; |
070 | unsigned long StartTimeON = 0; |
071 | unsigned long previousMillis = 0; |
076 | unsigned long PsoTime4 = 0; |
078 | uint32_t TimePush4 = 600000; |
080 | unsigned long PsoTime5 = 0; |
082 | uint16_t TimePush5 = 500; |
083 | bool call_is_made5 = false ; |
085 | unsigned long PsoTime6 = 0; |
087 | uint16_t TimePush6 = 2500; |
088 | bool call_is_made6 = false ; |
090 | unsigned long PsoTime7 = 0; |
092 | uint16_t TimePush7 = 500; |
093 | bool call_is_made7 = false ; |
095 | unsigned long PsoTime8 = 0; |
097 | uint16_t TimePush8 = 10; |
098 | bool call_is_made8 = false ; |
101 | unsigned long previousMillis2 = 0; |
105 | int Blinks9state9 = LOW; |
107 | unsigned long previousMillis3 = 0; |
109 | long OffTime10 = 3000; |
111 | int Blinks10state10 = LOW; |
113 | unsigned long previousMillis4 = 0; |
117 | int Klaxonstate11 = LOW; |
122 | pinMode(Podxvat, OUTPUT); |
123 | pinMode(Start, OUTPUT); |
124 | pinMode(Block, OUTPUT); |
125 | pinMode(ObrabotkaCall, OUTPUT); |
126 | pinMode(Klaxon, OUTPUT); |
130 | pinMode(Alarm, INPUT_PULLUP); |
131 | pinMode(Door, INPUT_PULLUP); |
132 | pinMode(ObrabotkaDveri, OUTPUT); |
133 | pinMode(ZapretDoor, OUTPUT); |
135 | pinMode(RazrAutoZap, OUTPUT); |
136 | pinMode(CentrZamok, INPUT_PULLUP); |
137 | pinMode(ACC, OUTPUT); |
138 | pinMode(Blinks9, OUTPUT); |
139 | pinMode(Blinks10, OUTPUT); |
145 | digitalWrite(Podxvat, LOW); |
146 | digitalWrite(Block, LOW); |
147 | digitalWrite(ObrabotkaCall, LOW); |
148 | digitalWrite(RazrAutoZap, LOW); |
149 | digitalWrite(Blinks9, LOW); |
150 | digitalWrite(Blinks10, LOW); |
160 | if (SIM800.available()) resp_modem(); |
161 | if ( Serial .available()) resp_serial(); |
162 | if (millis() > Time1 + 2000) Time1 = millis(), detection1(); |
163 | if (millis() > Time2 + 100) Time2 = millis(), detection2(); |
164 | if (heating == true && digitalRead(StopPin) == HIGH) heatingstop(1), delay(1000), digitalWrite(RazrAutoZap, LOW); |
165 | if (heating == true && digitalRead(Podxvat) == HIGH && digitalRead(Parking) == LOW) heatingstop(1), delay(1000), digitalWrite(RazrAutoZap, LOW); |
168 | if (digitalRead(Block) == HIGH) Gygok(); |
169 | if (digitalRead(Block) == LOW) digitalWrite(Klaxon, LOW); |
172 | if (digitalRead(Ignition) == HIGH && digitalRead(Parking) == HIGH && digitalRead(Tahometr) == HIGH && digitalRead(RazrAutoZap) == LOW) { |
173 | digitalWrite(Podxvat, HIGH); |
175 | digitalWrite(ACC, HIGH); |
178 | if (digitalRead(Podxvat) == HIGH && digitalRead(Parking) == HIGH && digitalRead(Tahometr) == LOW) { |
185 | if (digitalRead(Tahometr) == HIGH && digitalRead(Podxvat) == HIGH && digitalRead(Door) == HIGH && digitalRead(CentrZamok) == LOW) { |
187 | digitalWrite(RazrAutoZap, HIGH); |
193 | if (heating == false && digitalRead(RazrAutoZap) == HIGH && digitalRead(Door) == LOW) { |
195 | digitalWrite(RazrAutoZap, LOW); |
198 | if (digitalRead(StopPin) == HIGH && digitalRead(RazrAutoZap) == HIGH && heating == false ) { |
200 | digitalWrite(RazrAutoZap, LOW); |
204 | if (digitalRead(Podxvat) == LOW) { |
206 | digitalWrite(ACC, LOW); |
210 | if (!timer4 && digitalRead(Ignition) == HIGH && digitalRead(Parking) == HIGH && digitalRead(Tahometr) == HIGH && digitalRead(Podxvat) == HIGH && heating == false ) { |
214 | if (digitalRead(Parking) == LOW && digitalRead(Tahometr) == HIGH && digitalRead(Podxvat) == HIGH && heating == false ) { |
216 | digitalWrite(Podxvat, LOW); |
218 | if (timer4 && millis() - PsoTime4 > TimePush4) |
221 | digitalWrite(Podxvat, LOW); |
225 | if (digitalRead(ACC) == LOW) digitalWrite(Blinks10, LOW); |
226 | if (digitalRead(ACC) == HIGH) Blinker(); |
229 | unsigned long currentMillis2 = millis(); |
231 | if ((Blinks9state9 == HIGH) && (currentMillis2 - previousMillis2 >= OnTime9)) |
234 | previousMillis2 = currentMillis2; |
235 | digitalWrite(Blinks9, Blinks9state9); |
237 | if (k2 > 2 ) state9 = 1; |
239 | else if ((Blinks9state9 == LOW) && (currentMillis2 - previousMillis2 >= OffTime9) && !state9) |
241 | Blinks9state9 = HIGH; |
242 | previousMillis2 = currentMillis2 ; |
243 | digitalWrite(Blinks9, Blinks9state9); |
247 | if (!timer5 && digitalRead(ObrabotkaCall) == HIGH) { |
251 | if (digitalRead(ObrabotkaCall) == LOW) { |
255 | if (timer5 && millis() - PsoTime5 > TimePush5) |
258 | if (call_is_made5 == 0) call1(); |
262 | if (!timer6 && digitalRead(Alarm) == LOW) { |
266 | if (digitalRead(Alarm) == HIGH) { |
270 | if (timer6 && millis() - PsoTime6 > TimePush6) |
274 | if (call_is_made6 == 0) call2(); |
278 | if (!timer7 && digitalRead(Door) == LOW && digitalRead(ObrabotkaDveri) == HIGH) { |
282 | if (digitalRead(Door) == HIGH && digitalRead(ObrabotkaDveri) == HIGH) { |
286 | if (timer7 && millis() - PsoTime7 > TimePush7) |
289 | if (call_is_made7 == 0) call3(); |
294 | if (!timer8 && digitalRead(Alarm) == LOW && digitalRead(ZapretDoor) == LOW) { |
298 | if (digitalRead(Alarm) == HIGH) { |
302 | if (timer8 && millis() - PsoTime8 > TimePush8) |
305 | if (call_is_made8 == 0) digitalWrite(ObrabotkaDveri, HIGH); |
312 | SIM800.println( "AT+CPBR=1" ); |
314 | SIM800.println( "ATD>1" ); |
316 | SIM800.println( "ATDL" ); |
318 | if (SIM800.find( "OK" )); |
320 | SIM800.println( "AT+CPAS" ); |
321 | if (SIM800.find( ":" )) break ; |
325 | SIM800.print( "AT+CREC=4,\"C:\\User\\" ), SIM800.println( "11.amr\",0,95" ); |
327 | SIM800.println( "ATH0" ); |
329 | digitalWrite(ObrabotkaCall, LOW); |
335 | SIM800.println( "AT+CPBR=1" ); |
337 | SIM800.println( "ATD>1" ); |
339 | SIM800.println( "ATDL" ); |
341 | if (SIM800.find( "OK" )); |
343 | SIM800.println( "AT+CPAS" ); |
344 | if (SIM800.find( ":" )) break ; |
348 | SIM800.print( "AT+CREC=4,\"C:\\User\\" ), SIM800.println( "14.amr\",0,95" ); |
350 | SIM800.println( "ATH0" ); |
357 | SIM800.println( "AT+CPBR=1" ); |
359 | SIM800.println( "ATD>1" ); |
361 | SIM800.println( "ATDL" ); |
363 | if (SIM800.find( "OK" )); |
365 | SIM800.println( "AT+CPAS" ); |
366 | if (SIM800.find( ":" )) break ; |
370 | SIM800.print( "AT+CREC=4,\"C:\\User\\" ), SIM800.println( "15.amr\",0,95" ); |
372 | SIM800.println( "ATH0" ); |
374 | if (digitalRead(Alarm) == HIGH) digitalWrite(ObrabotkaDveri, LOW); |
381 | while ( Serial .available()) k = Serial .read(), at += char (k), delay(1); |
382 | SIM800.println(at), at = "" ; |
389 | while (SIM800.available()) k = SIM800.read(), at += char (k), delay(1); |
392 | if (at.indexOf( "RING" ) > -1) { |
393 | delay(200), SIM800.println( "ATA" ), ring = true ; |
395 | else if (at.indexOf( "+DTMF: " ) > -1) { |
396 | String key = at.substring(at.indexOf( "" ) + 9, at.indexOf( "" ) + 10); |
398 | if (pin.indexOf( "*" ) > -1 ) pin = "" ; |
400 | else if (at.indexOf( "NO CARRIER" ) > -1 ) { |
401 | SIM800.println( "AT+CLIP=1;+DDET=1" ); |
405 | if (pin.indexOf( "45" ) > -1 ) { |
406 | pin = "" , Voice(11), delay (3000), SIM800.println( "ATH0" ), delay (100), digitalWrite(ObrabotkaCall, HIGH); |
409 | else if (pin.indexOf( "89" ) > -1 ) { |
410 | pin = "" , Voice(8), digitalWrite(Block, HIGH), heatingstop(1); |
413 | else if (pin.indexOf( "98" ) > -1 ) { |
414 | pin = "" , Voice(9), digitalWrite(Block, LOW), delay (3000), SIM800.println( "ATH0" ); |
417 | else if (pin.indexOf( "03" ) > -1 ) { |
419 | if (digitalRead(Block) == HIGH) |
421 | Voice(8), delay (4000), SIM800.println( "ATH0" ); |
423 | else if (digitalRead(Podxvat) == LOW && digitalRead(Ignition) == LOW && digitalRead(StopPin) == LOW && digitalRead(RazrAutoZap) == HIGH && digitalRead(Block) == LOW) |
425 | Voice(7), delay (2000), enginestart(4); |
427 | else if (heating == true ) |
429 | Voice(5), delay (3000), SIM800.println( "ATH0" ); |
431 | else if (digitalRead(RazrAutoZap) == LOW) |
433 | Voice(20), delay (3000), SIM800.println( "ATH0" ); |
438 | else if (digitalRead(Ignition) == HIGH && digitalRead(Tahometr) == HIGH && digitalRead(Block) == LOW) |
440 | Voice(10), delay (3000), SIM800.println( "ATH0" ); |
444 | else if (pin.indexOf( "30" ) > -1 ) { |
448 | Voice(6), delay(2000), heatingstop(1); |
449 | SIM800.println( "ATH0" ); |
451 | else if (heating == false ) |
454 | SIM800.println( "ATH0" ); |
458 | else if (pin.indexOf( "56" ) > -1 ) { |
459 | pin = "" , Voice(17), digitalWrite(ZapretDoor, HIGH), delay (3000), SIM800.println( "ATH0" ); |
462 | else if (pin.indexOf( "65" ) > -1 ) { |
463 | pin = "" , Voice(18), digitalWrite(ZapretDoor, LOW), delay (3000), SIM800.println( "ATH0" ); |
468 | ring = false , delay (2000), pin = "" ; |
470 | if (digitalRead(Alarm) == LOW && digitalRead(Block) == LOW) { |
473 | else if (digitalRead(Block) == HIGH) { |
476 | else if (digitalRead(Podxvat) == LOW && digitalRead(Ignition) == HIGH && digitalRead(Block) == LOW && digitalRead(Tahometr) == HIGH && heating == false ) { |
479 | else if (digitalRead(Podxvat) == HIGH && digitalRead(Block) == LOW && digitalRead(Tahometr) == HIGH && heating == false ) { |
482 | else if (digitalRead(Podxvat) == LOW && digitalRead(Ignition) == HIGH && digitalRead(Block) == LOW && digitalRead(Tahometr) == LOW && heating == false ) { |
485 | else if (Vbat1 < 10.5) { |
488 | else if (digitalRead(Podxvat) == LOW && digitalRead(Ignition) == LOW && digitalRead(Tahometr) == LOW && digitalRead(Block) == LOW) { |
491 | else if (heating == true ) { |
499 | if (Timer > 0) Timer--; |
500 | if (heating == true && Timer < 1) heatingstop(0); |
501 | if (heating == true && Vbat1 < 10.00) heatingstop(1); |
506 | if (Vbat2 >= 5.00 && digitalRead(RazrAutoZap) == HIGH && digitalRead(Ignition) == LOW && digitalRead(Podxvat) == LOW) enginestart(4); |
507 | else if (Vbat2 >= 5.00 && digitalRead(RazrAutoZap) == LOW) { |
514 | void enginestart( int Attempts) { |
515 | int StTime = constrain(StTime, 750, 3000); |
516 | Timer = constrain(Timer, 300, 300); |
520 | while (Vbat1 > 10.00 && digitalRead(Ignition) == LOW && count < Attempts) { |
524 | digitalWrite(Podxvat, HIGH); |
528 | if (digitalRead(RazrAutoZap) == HIGH && digitalRead(Podxvat) == HIGH && digitalRead(Parking) == HIGH) { |
530 | StartTimeON = millis(); |
531 | digitalWrite(Start, HIGH); |
534 | while (millis() < (StartTimeON + StTime) && digitalRead(RazrAutoZap) == HIGH); |
535 | digitalWrite(Start, LOW); |
539 | if (digitalRead(Podxvat) == HIGH && digitalRead(Parking) == HIGH && digitalRead(Tahometr) == HIGH && digitalRead(RazrAutoZap) == HIGH) { |
543 | digitalWrite(ACC, HIGH); |
548 | StTime = StTime + 250; |
552 | if (heating == false ) { |
553 | Voice(24), Timer = 0; |
557 | delay(3000), SIM800.println( "ATH0" ); |
561 | void heatingstop ( bool reset_timer) { |
562 | digitalWrite(ACC, LOW), delay (2000); |
563 | digitalWrite(Podxvat, LOW), delay (10); |
564 | heating = false , delay(1000); |
565 | if (reset_timer == true ) Timer = 0; |
571 | float ADCC1 = analogRead(BAT_Pin); |
573 | if (ADCC1 < V_min1) V_min1 = ADCC1; |
578 | float ADCC2 = analogRead(Pusk_Sig); |
580 | if (ADCC2 < V_min2) V_min2 = ADCC2; |
585 | void Voice( int Track) { |
586 | SIM800.print( "AT+CREC=4,\"C:\\User\\" ), SIM800.print(Track), SIM800.println( ".amr\",0,95" ); |
591 | unsigned long currentMillis3 = millis(); |
592 | if ((Blinks10state10 == HIGH) && (currentMillis3 - previousMillis3 >= OnTime10)) |
594 | Blinks10state10 = LOW; |
595 | previousMillis3 = currentMillis3; |
596 | digitalWrite(Blinks10, Blinks10state10); |
598 | else if ((Blinks10state10 == LOW) && (currentMillis3 - previousMillis3 >= OffTime10) && !state10) |
600 | Blinks10state10 = HIGH; |
601 | previousMillis3 = currentMillis3 ; |
602 | digitalWrite(Blinks10, Blinks10state10); |
608 | unsigned long currentMillis4 = millis(); |
609 | if ((Klaxonstate11 == HIGH) && (currentMillis4 - previousMillis4 >= OnTime11)) |
612 | previousMillis4 = currentMillis4; |
613 | digitalWrite(Klaxon, Klaxonstate11); |
615 | else if ((Klaxonstate11 == LOW) && (currentMillis4 - previousMillis4 >= OffTime11) && !state11) |
617 | Klaxonstate11 = HIGH; |
618 | previousMillis4 = currentMillis4 ; |
619 | digitalWrite(Klaxon, Klaxonstate11); |
frequency_meter.ino
01 | #define Out_LED 4 //Вывод счетчика |
02 | #define Taho 3 //Вход сигнал тахометра |
03 | #define ObrabotkaTaho 5 //Выход обработанного счетчика, задержка 0.5 сек |
05 | volatile unsigned int RPM_ON_LED = 200; |
06 | volatile unsigned long microcod = 0; |
07 | volatile unsigned int rpm2 = 0; |
08 | volatile unsigned int rpm2OFF = 0; |
10 | volatile boolean st = false ; |
12 | unsigned long previousMillis = 0; |
13 | unsigned long PsoTime5 = 0; |
15 | uint16_t TimePush5 = 3000; |
19 | pinMode(Out_LED, OUTPUT); |
21 | pinMode(ObrabotkaTaho, OUTPUT); |
24 | digitalWrite(Out_LED, LOW); |
26 | digitalWrite(Taho, HIGH); |
27 | digitalWrite(ObrabotkaTaho, LOW); |
30 | attachInterrupt(1, RPM2, FALLING); |
37 | if (!timer5 && digitalRead(Out_LED) == HIGH) { |
41 | if (digitalRead(Out_LED) == LOW) { |
43 | digitalWrite(ObrabotkaTaho, LOW); |
45 | if (timer5 && millis() - PsoTime5 > TimePush5) |
48 | digitalWrite(ObrabotkaTaho, HIGH); |
57 | rpm2OFF = rpm2 + 4000; |
61 | if (rpm2 >= RPM_ON_LED) { |
62 | digitalWrite(Out_LED, HIGH); |
63 | } else if (rpm2 < RPM_ON_LED) { |
64 | digitalWrite(Out_LED, LOW); |
73 | rpm2 = (1000 / (millis() - microcod)) * 60 / 2; |
Архивные файлы с печатной платой, по адресу; https://disk.yandex.ru/d/0Okfvvu34RQPVw
01
//ACP_pin.ino
02
//Настройка АЦП канала
03
04
#include <SoftwareSerial.h>
05
#define BAT_Pin A6 // вход на батарею, через делитель напряжения 47kom / 10 кОм
06
07
float
Vbat1, Vbat1Start, V_min1 ;
// переменная хранящая напряжение бортовой сети1
08
// делитель для перевода АЦП1 в вольты для резистров 47/10kOm, подбор напряжения индикации АЦП в мониторе порта.
09
// больше значение меньше напряжение в мониторе порта
10
float
m1 = 36.45;
// уменьшаю увеличивается значение напряжения питания
11
unsigned
long
Time1 = 0;
// время выполнения detection1
12
13
void
setup
() {
14
Serial
.begin(9600);
//скорость порта
15
detachInterrupt(0);
// отключаем обработку внешнего прерывания на Pin2
16
detachInterrupt(1);
// отключаем обработку внешнего прерывания на Pin3
17
}
18
19
void
loop
() {
20
if
(millis() > Time1 + 500) Time1 = millis(), detection1();
// выполняем функцию detection1 () каждые 0,5 сек
21
}
22
23
void
detection1() {
// условия проверяемые каждые 10 сек
24
Vbat1 = VoltRead1();
// замеряем напряжение на батарее, на A6
25
Serial
.println(
""
);
26
}
27
28
//--- замеряем напряжение на батарее и переводим значения в вольты ----------
29
float
VoltRead1() {
30
float
ADCC1 = analogRead(BAT_Pin);
31
ADCC1 = ADCC1 / m1 ;
32
Serial
.print(ADCC1);
// ОТКЛЮЧИТЬ ПОСЛЕ НАСТРОЙКИ АЦП
33
if
(ADCC1 < V_min1) V_min1 = ADCC1;
// переводим данные ацп1 в вольты
34
return
(ADCC1);
35
}
ACP_pin
Programs
001
// Programs.ino
002
// рисунок sxema_34
003
// -----КОМАНДЫ DTMF------
004
// "45" обратный звонок
005
// "03" старт
006
// "30" стоп
007
// "56" отключение контроля дверей
008
// "65" включение контроля дверей
009
// "89" блокировка двигателя
010
// "98" снятие блокировки двигателя
011
// -----Voice -- голосовые сообщения------
012
// ------1 откываю двери!...
013
// 2 двигатель запущен, двигатель запущен!...
014
// 3 оп, повторный запуск!...
015
// ----- 4 закрываю двери!...
016
// 5 уже, прогреваюсь!...
017
// 6 стоп прогрева!...
018
// 7 все поняла, завожу!...
019
// 8 двигатель блокирован, двигатель блокирован...
020
// 9 продолжайте движение!...
021
// 10 оп, двигатель уже запущен!...
022
// 11 контроль связи!...
023
// 12 низкое напряжение!...
024
// 13 короткие гудки
025
// 14 нарушение охраны!...
026
// 15 открыта! дверь! авто!
027
// 16 нажат тормоз!
028
// 17 отключен! контроль! двери!
029
// 18 включен! контроль! двери!
030
// 19 Стартер+
031
// 20 не в режиме запуска+
032
// 21 Зажигание!+
033
// 22 SMS
034
// 23 Включено! Зажигание!
035
// 24 не запустилась! попробуйте еще раз!...
036
// 25 авто! в режиме! пидстопа!
037
038
#include <SoftwareSerial.h>
039
SoftwareSerial SIM800(7, 6);
// для новых плат начиная с версии RX,TX
040
041
#define Podxvat 12 // выход на реле зажигания Podxvat + реле датчик детонации-иммобилайзер
042
#define Start 10 // выход на реле стартера
043
#define Block 13 // выход на реле блокировки двигателя с клаксоном
044
#define ObrabotkaCall A5 // вывод для отработки обратного звонка
045
#define Klaxon 8 // выход на реле дальнего света и клаксона
046
#define BAT_Pin A6 // вход на батарею, через делитель напряжения 47kom / 10 кОм
047
#define Parking A1 // вход на датчик паркинга или ручник, HIGH на паркинге(программно)
048
#define StopPin A2 // вход на концевик педали тормоза, HIGH
049
#define Ignition A3 // вход на провод от замка зажигания, HIGH
050
#define Alarm 2 // вход для звонка при срабатывания сигналки
051
#define Door 3 // вход для звонка при срабатывании дверей, на массу, LOW
052
#define ObrabotkaDveri A4 // вывод для обработки открытой двери
053
#define ZapretDoor A0 // вывод для обработки, отключения контроля открытия двери
054
#define Tahometr 5 // вывод Tahometr, HIGH есть подсчет импульсов от тахометра
055
#define RazrAutoZap 11 // вывод для обработки разрешения на авто запуск, HIGH
056
#define CentrZamok 4 // вход сигнала от центр замка при закрытии дверей, на массу, LOW
057
#define ACC 9 // выход для вторичных приборов авто, HIGH
058
#define Pusk_Sig A7 // вход от авто сигнализации на запуск
059
#define Blinks9 1 // выход 3 раза моргнуть поворотником, не в режиме запуска
060
#define Blinks10 0 // выход моргать поворотником в режиме прогрева
061
062
//------- настройки переменных --------
063
String pin =
""
;
// строковая переменная набираемого пинкода
064
bool
ring =
false
;
// флаг момента снятия трубки
065
float
Vbat1, V_min1 ;
// переменные хранящие напряжение бортовой сети1
066
float
m1 = 36.88;
// делитель для перевода АЦП1 в вольты для резистров 47/10kOm, подбор напряжения индикации АЦП в мониторе порта.
067
float
Vbat2, V_min2 ;
// переменная хранящая напряжение бортовой сети2
068
float
m2 = 100.00;
// делитель для перевода АЦП2 в вольты
069
unsigned
long
Time1 = 0;
// время выполнения detection1
070
unsigned
long
Time2 = 0;
// время выполнения detection2
071
unsigned
long
StartTimeON = 0;
// время работы стартера
072
unsigned
long
previousMillis = 0;
// Зададим начальное значение для счетчика millis
073
int
Timer = 0;
// таймер времени прогрева двигателя по умолчанию = 0
074
bool
heating =
false
;
// переменная состояния режим прогрева двигателя
075
int
count = 0;
// для счетчиков запуска
076
077
unsigned
long
PsoTime4 = 0;
// для таймера в цикле отработки временного пидстопа
078
bool
timer4 = 0;
// флаг включен ли таймер, 0 - выключен, 1 - включен
079
uint32_t TimePush4 = 600000;
// Время срабатывания 600000 мсек.= 10 мин
080
081
unsigned
long
PsoTime5 = 0;
// для таймера в цикле отработки обратного звонка
082
bool
timer5 = 0;
// флаг включен ли таймер, 0 - выключен, 1 - включен
083
uint16_t TimePush5 = 500;
// Время срабатывания вывод для отработки обратного звонка
084
bool
call_is_made5 =
false
;
// флаг "звонок выполнен" (в цикле отработки обратного звонка)
085
086
unsigned
long
PsoTime6 = 0;
// для таймера в цикле срабатывания сигналки
087
bool
timer6 = 0;
// флаг включен ли таймер
088
uint16_t TimePush6 = 2500;
// Время срабатывания сигналки
089
bool
call_is_made6 =
false
;
// флаг "звонок выполнен" (в цикле срабатывания сигналки)
090
091
unsigned
long
PsoTime7 = 0;
// для таймера в цикле срабатывания двери
092
bool
timer7 = 0;
// флаг включен ли таймер
093
uint16_t TimePush7 = 500;
// Время срабатывания двери
094
bool
call_is_made7 =
false
;
// флаг "выполнения" (в цикле срабатывания двери)
095
096
unsigned
long
PsoTime8 = 0;
// для таймера в цикле включения опции обработки для срабатыванияобратных звонков сигналки и двери
097
bool
timer8 = 0;
// флаг включен ли таймер
098
uint16_t TimePush8 = 10;
// Время включения опции обработки для срабатывания двери
099
bool
call_is_made8 =
false
;
// флаг "выполнения" (в цикле включения опции обработки для срабатывания двери)
100
101
int
k2 = 0;
// для счетчика последний момент времени, когда состояние светодиода изменялось
102
unsigned
long
previousMillis2 = 0;
103
long
OnTime9 = 500;
// длительность свечения светодиода (в миллисекундах)
104
long
OffTime9 = 700;
// светодиод не горит (в миллисекундах)
105
bool
state9 = 0;
//
106
int
Blinks9state9 = LOW;
// состояние выхода, 3 раза моргнуть поворотником
107
108
unsigned
long
previousMillis3 = 0;
109
long
OnTime10 = 500;
// длительность свечения светодиода (в миллисекундах)
110
long
OffTime10 = 3000;
// светодиод не горит (в миллисекундах)
111
bool
state10 = 0;
//
112
int
Blinks10state10 = LOW;
// состояние выхода, моргать поворотником
113
114
unsigned
long
previousMillis4 = 0;
// Зададим начальное значение для счетчика millis для Gygok()
115
long
OnTime11 = 500;
// длительность свечения светодиода (в миллисекундах)
116
long
OffTime11 = 500;
// светодиод не горит (в миллисекундах)
117
bool
state11 = 0;
//
118
int
Klaxonstate11 = LOW;
// состояние выхода Klaxon
119
120
bool
gabarit =
false
;
121
122
void
setup
() {
123
pinMode(Podxvat, OUTPUT);
124
pinMode(Start, OUTPUT);
125
pinMode(Block, OUTPUT);
126
pinMode(ObrabotkaCall, OUTPUT);
127
pinMode(Klaxon, OUTPUT);
128
// pinMode(Parking, INPUT);
129
// pinMode(StopPin, INPUT);
130
// pinMode(Ignition, INPUT);
131
pinMode(Alarm, INPUT_PULLUP);
// указываем пин на вход для с внутричипной подтяжкой к +V, для звонка при срабатывания сигналки
132
pinMode(Door, INPUT_PULLUP);
// указываем пин на вход для с внутричипной подтяжкой к +V, для звонка при срабатывании двери
133
pinMode(ObrabotkaDveri, OUTPUT);
134
pinMode(ZapretDoor, OUTPUT);
135
// pinMode(Tahometr, INPUT); // Tahometr HIGH есть подсчет импульсов от счетчика оборотов
136
pinMode(RazrAutoZap, OUTPUT);
137
pinMode(CentrZamok, INPUT_PULLUP);
138
pinMode(ACC, OUTPUT);
139
pinMode(Blinks9, OUTPUT);
140
pinMode(Blinks10, OUTPUT);
141
142
delay(100);
143
SIM800.begin(9600);
//скорость связи с модемом
144
detachInterrupt(0);
// отключаем обработку внешнего прерывания на Pin2
145
detachInterrupt(1);
// отключаем обработку внешнего прерывания на Pin3
146
digitalWrite(Podxvat, LOW);
147
digitalWrite(Block, LOW);
148
digitalWrite(ObrabotkaCall, LOW);
149
digitalWrite(RazrAutoZap, LOW);
150
digitalWrite(Blinks9, LOW);
151
digitalWrite(Blinks10, LOW);
152
// SIM800_reset();
153
}
154
155
/* ---- - Перезагрузка МОДЕМА SIM800L ----//на некоторых модемах не работает
156
void SIM800_reset() {
157
delay(10000); SIM800.println("AT+CMGDA=\"DEL ALL\""); // Удаляем все СМС чекрез 10 сек, после старта SIM модуля
158
}*/
159
160
void
loop
() {
161
if
(SIM800.available()) resp_modem();
// если что-то пришло от SIM800 в Ардуино отправляем для разбора
162
if
(
Serial
.available()) resp_serial();
// если что-то пришло от Ардуино отправляем в SIM800
163
if
(millis() > Time1 + 2000) Time1 = millis(), detection1();
// выполняем функцию detection1 () каждые 2 сек
164
if
(millis() > Time2 + 100) Time2 = millis(), detection2();
// выполняем функцию detection2 () каждые 0,1 сек
165
if
(heating ==
true
&& digitalRead(StopPin) == HIGH) heatingstop(1), delay(1000), digitalWrite(RazrAutoZap, LOW);
// если нажали на педаль тормоза в режиме прогрева, сброс прогрева и RazrAutoZap
166
if
(heating ==
true
&& digitalRead(Podxvat) == HIGH && digitalRead(Parking) == LOW) heatingstop(1), delay(1000), digitalWrite(RazrAutoZap, LOW);
// если выключили Parking в режиме прогрева, сброс прогрева и RazrAutoZap
167
168
//----моргаем реле дальнего света и клаксона, при блокировке мотора-------------
169
if
(digitalRead(Block) == HIGH) Gygok();
170
if
(digitalRead(Block) == LOW) digitalWrite(Klaxon, LOW);
171
172
//--- подхват зажигания Podxvat при заведнном двигателе и включенном ручнике, режим пидстопа -------
173
if
(digitalRead(Ignition) == HIGH && digitalRead(Parking) == HIGH && digitalRead(Tahometr) == HIGH && digitalRead(RazrAutoZap) == LOW) {
174
digitalWrite(Podxvat, HIGH);
175
delay(1);
176
digitalWrite(ACC, HIGH);
177
}
178
// заглох мотор отключить подхват зажигания Podxvat
179
if
(digitalRead(Podxvat) == HIGH && digitalRead(Parking) == HIGH && digitalRead(Tahometr) == LOW) {
180
delay(1);
181
heatingstop(1);
182
delay(1);
183
timer4 = 0;
184
}
185
//включение разрешения автозапуска RazrAutoZap, при закрытии дверей центр. замком
186
if
(digitalRead(Tahometr) == HIGH && digitalRead(Podxvat) == HIGH && digitalRead(Door) == HIGH && digitalRead(CentrZamok) == LOW) {
187
delay(1);
188
digitalWrite(RazrAutoZap, HIGH);
189
delay(1);
190
heatingstop(1);
191
}
192
193
//если открыли дверь авто после постановки на авто запуск, сброс RazrAutoZap в LOW
194
if
(heating ==
false
&& digitalRead(RazrAutoZap) == HIGH && digitalRead(Door) == LOW) {
195
delay(1);
196
digitalWrite(RazrAutoZap, LOW);
197
}
198
//если нажали на тормоз после постановки на авто запуск, сброс RazrAutoZap в LOW
199
if
(digitalRead(StopPin) == HIGH && digitalRead(RazrAutoZap) == HIGH && heating ==
false
) {
200
delay(1);
201
digitalWrite(RazrAutoZap, LOW);
202
}
203
204
// отключился Podxvat, отключаем АСС
205
if
(digitalRead(Podxvat) == LOW) {
206
delay(1);
207
digitalWrite(ACC, LOW);
208
}
209
210
//---- обработка времени выполнения пидстопа ---------
211
if
(!timer4 && digitalRead(Ignition) == HIGH && digitalRead(Parking) == HIGH && digitalRead(Tahometr) == HIGH && digitalRead(Podxvat) == HIGH && heating ==
false
) {
212
timer4 = 1;
// если условия выполнены запускаем таймер на пидстоп
213
PsoTime4 = millis();
214
}
215
if
(digitalRead(Parking) == LOW && digitalRead(Tahometr) == HIGH && digitalRead(Podxvat) == HIGH && heating ==
false
) {
216
timer4 = 0;
// если Parking выключен выключаем таймер, сбрасываем флаг
217
digitalWrite(Podxvat, LOW);
218
}
219
if
(timer4 && millis() - PsoTime4 > TimePush4)
// если таймер был включен и кончился,
220
{
221
timer4 = 0;
// выключаем таймер и
222
digitalWrite(Podxvat, LOW);
// если флаг выполнен то выключаем подхват зажигания Podxvat
223
}
224
225
// включился АСС моргать поворотником, отключился не моргаем
226
if
(digitalRead(ACC) == LOW) digitalWrite(Blinks10, LOW);
227
if
(digitalRead(ACC) == HIGH) Blinker();
228
229
// 3 раза моргнуть поворотником, не в режиме запуска
230
unsigned
long
currentMillis2 = millis();
// текущее время в миллисекундах, выясняем не настал ли момент сменить состояние светодиода
231
// если светодиод включен и светится больше чем надо
232
if
((Blinks9state9 == HIGH) && (currentMillis2 - previousMillis2 >= OnTime9))
233
{
234
Blinks9state9 = LOW;
// выключаем
235
previousMillis2 = currentMillis2;
// запоминаем момент времени
236
digitalWrite(Blinks9, Blinks9state9);
// реализуем новое состояние
237
k2++;
238
if
(k2 > 2 ) state9 = 1;
// если больше переводим в другое состояние
239
}
240
else
if
((Blinks9state9 == LOW) && (currentMillis2 - previousMillis2 >= OffTime9) && !state9)
//здесь проверяем 3 пунктом это состояние
241
{
242
Blinks9state9 = HIGH;
// включаем
243
previousMillis2 = currentMillis2 ;
// запоминаем момент времени
244
digitalWrite(Blinks9, Blinks9state9);
// реализуем новое состояние
245
}
246
247
//---- обработка обратного звонка -----------
248
if
(!timer5 && digitalRead(ObrabotkaCall) == HIGH) {
249
timer5 = 1;
// если таймер выключен и ObrabotkaCall == HIGH запускаем таймер
250
PsoTime5 = millis();
251
}
252
if
(digitalRead(ObrabotkaCall) == LOW) {
253
timer5 = 0;
// если ObrabotkaCall == LOW молчит выключаем таймер, сбрасываем флаг "звонок выполнен"
254
call_is_made5 = 0;
255
}
256
if
(timer5 && millis() - PsoTime5 > TimePush5)
// если таймер был включен и кончился,
257
{
258
timer5 = 0;
// выключаем таймер и
259
if
(call_is_made5 == 0) call1();
// если флаг "звонок выполнен" в фальсе то звоним хозяину
260
}
261
262
//----------------срабатывание сигналки-----------------
263
if
(!timer6 && digitalRead(Alarm) == LOW) {
264
timer6 = 1;
// если таймер выключен и работает колокол запускаем таймер, 2,5 сек
265
PsoTime6 = millis();
266
}
267
if
(digitalRead(Alarm) == HIGH) {
268
timer6 = 0;
// если колокол молчит выключаем таймер, сбрасываем флаг "звонок выполнен"
269
call_is_made6 = 0;
270
}
271
if
(timer6 && millis() - PsoTime6 > TimePush6)
// если таймер был включен и кончился,
272
{
273
timer6 = 0;
// выключаем таймер и
274
heatingstop(1);
// стоп прогрева
275
if
(call_is_made6 == 0) call2();
// если флаг "звонок выполнен" то звоним хозяину
276
}
277
278
//----------------срабатывание дверей-----------------
279
if
(!timer7 && digitalRead(Door) == LOW && digitalRead(ObrabotkaDveri) == HIGH) {
280
timer7 = 1;
// если таймер выключен и открыты двери запускаем таймер, 0,5 сек
281
PsoTime7 = millis();
282
}
283
if
(digitalRead(Door) == HIGH && digitalRead(ObrabotkaDveri) == HIGH) {
284
timer7 = 0;
// если дверь закрыли выключаем таймер, сбрасываем флаг
285
call_is_made7 = 0;
286
}
287
if
(timer7 && millis() - PsoTime7 > TimePush7)
// если таймер был включен и кончился,
288
{
289
timer7 = 0;
// выключаем таймер и
290
if
(call_is_made7 == 0) call3();
// если флаг "звонок выполнен" в фальсе то звоним хозяину
291
}
292
293
//---- запуск обработки на срабатывание открытых дверей ---------
294
//---- что бы звонок проходил только, после постановки/снятия с охраны --------
295
if
(!timer8 && digitalRead(Alarm) == LOW && digitalRead(ZapretDoor) == LOW) {
296
timer8 = 1;
// если таймер выключен и пикнул колокол запускаем таймер, 10 мсек
297
PsoTime8 = millis();
298
}
299
if
(digitalRead(Alarm) == HIGH) {
300
timer8 = 0;
// если колокол молчит выключаем таймер, сбрасываем флаг
301
call_is_made8 = 0;
302
}
303
if
(timer8 && millis() - PsoTime8 > TimePush8)
// если таймер был включен и кончился,
304
{
305
timer8 = 0;
// выключаем таймер и
306
if
(call_is_made8 == 0) digitalWrite(ObrabotkaDveri, HIGH);
// если флаг выполнен в фальсе то включаем ObrabotkaDveri
307
}
308
}
309
310
//----------------обратный звонок------------------
311
void
call1() {
312
delay(100);
313
SIM800.println(
"AT+CPBR=1"
);
// считывает запись с индексом 1 телефонной книги SIM-карты
314
delay(200);
315
SIM800.println(
"ATD>1"
);
// позвонить на 1 номер телефонной книги SIM-карты, читает номер с sim карты но не набирает, поэтому->
316
delay(200);
317
SIM800.println(
"ATDL"
);
// позвонить на последний номер
318
delay(100);
319
if
(SIM800.find(
"OK"
));
320
while
(1) {
// ожидание ответа вызова
321
SIM800.println(
"AT+CPAS"
);
// при каждой итерации опрашиваем модуль
322
if
(SIM800.find(
":"
))
break
;
// если :, то выходим из цикла while
323
delay(100);
324
}
325
delay(1000);
326
SIM800.print(
"AT+CREC=4,\"C:\\User\\"
), SIM800.println(
"11.amr\",0,95"
);
//голосовое сообщение "контроль связи"
327
delay(4000);
328
SIM800.println(
"ATH0"
);
329
call_is_made5 = 1;
// флаг "звонок выполнен" в труе
330
digitalWrite(ObrabotkaCall, LOW);
331
}
332
333
//--------звонок при срабатывании сигналки------------
334
void
call2() {
335
delay(100);
336
SIM800.println(
"AT+CPBR=1"
);
// считывает запись с индексом 1 телефонной книги SIM-карты
337
delay(200);
338
SIM800.println(
"ATD>1"
);
// позвонить на 1 номер телефонной книги SIM-карты, читает номер с sim карты но не набирает, поэтому->
339
delay(200);
340
SIM800.println(
"ATDL"
);
// позвонить на последний номер
341
delay(100);
342
if
(SIM800.find(
"OK"
));
343
while
(1) {
// ожидание ответа вызова
344
SIM800.println(
"AT+CPAS"
);
// при каждой итерации опрашиваем модуль
345
if
(SIM800.find(
":"
))
break
;
// если :, то выходим из цикла while
346
delay(100);
347
}
348
delay(1000);
349
SIM800.print(
"AT+CREC=4,\"C:\\User\\"
), SIM800.println(
"14.amr\",0,95"
);
//голосовое сообщение "нарушение охраны"
350
delay(4000);
351
SIM800.println(
"ATH0"
);
352
call_is_made6 = 1;
// флаг "звонок выполнен" в труе
353
}
354
355
//----звонок при срабатывании двери-----------
356
void
call3() {
357
delay(100);
358
SIM800.println(
"AT+CPBR=1"
);
// считывает запись с индексом 1 телефонной книги SIM-карты
359
delay(200);
360
SIM800.println(
"ATD>1"
);
// позвонить на 1 номер телефонной книги SIM-карты, читает номер с sim карты но не набирает, поэтому->
361
delay(200);
362
SIM800.println(
"ATDL"
);
// позвонить на последний номер
363
delay(100);
364
if
(SIM800.find(
"OK"
));
365
while
(1) {
// ожидание ответа вызова
366
SIM800.println(
"AT+CPAS"
);
// при каждой итерации опрашиваем модуль
367
if
(SIM800.find(
":"
))
break
;
// если :, то выходим из цикла while
368
delay(100);
369
}
370
delay(1000);
371
SIM800.print(
"AT+CREC=4,\"C:\\User\\"
), SIM800.println(
"15.amr\",0,95"
);
//голосовое сообщение "открыта дверь авто"
372
delay(4000);
373
SIM800.println(
"ATH0"
);
374
call_is_made7 = 1;
// флаг "звонок выполнен" в труе
375
if
(digitalRead(Alarm) == HIGH) digitalWrite(ObrabotkaDveri, LOW);
//сброс ObrabotkaDveri, до следующего импульса с сигналки
376
}
377
378
// ------- ТРАНСЛИРУЕМ КОМАНДЫ из ПОРТА В МОДЕМ ----------------
379
void
resp_serial () {
380
String at =
""
;
381
int
k = 0;
382
while
(
Serial
.available()) k =
Serial
.read(), at +=
char
(k), delay(1);
383
SIM800.println(at), at =
""
;
384
}
385
386
//------ AНАЛИЗИРУЕМ БУФЕР ВИРТУАЛЬНОГО ПОРТА МОДЕМА -------------
387
void
resp_modem () {
388
String at =
""
;
// набиваем в переменную at
389
int
k = 0;
390
while
(SIM800.available()) k = SIM800.read(), at +=
char
(k), delay(1);
391
Serial
.println(at);
392
393
if
(at.indexOf(
"RING"
) > -1) {
// входящий звонок
394
delay(200), SIM800.println(
"ATA"
), ring =
true
;
395
}
396
else
if
(at.indexOf(
"+DTMF: "
) > -1) {
397
String key = at.substring(at.indexOf(
""
) + 9, at.indexOf(
""
) + 10);
398
pin = pin + key;
399
if
(pin.indexOf(
"*"
) > -1 ) pin =
""
;
400
}
401
else
if
(at.indexOf(
"NO CARRIER"
) > -1 ) {
402
SIM800.println(
"AT+CLIP=1;+DDET=1"
);
// Активируем АОН и декодер DTMF
403
}
404
at =
""
;
// Возвращаем ответ можема в монитор порта , очищаем переменную
405
406
if
(pin.indexOf(
"45"
) > -1 ) {
407
pin =
""
, Voice(11), delay (3000), SIM800.println(
"ATH0"
), delay (100), digitalWrite(ObrabotkaCall, HIGH);
//обратный звонок
408
}
409
410
else
if
(pin.indexOf(
"89"
) > -1 ) {
411
pin =
""
, Voice(8), digitalWrite(Block, HIGH), heatingstop(1);
// блокировка двигателя "двигатель блокирован", без сброса звонка
412
}
413
414
else
if
(pin.indexOf(
"98"
) > -1 ) {
415
pin =
""
, Voice(9), digitalWrite(Block, LOW), delay (3000), SIM800.println(
"ATH0"
);
//снятие сблокировки двигателя "продолжайте движение"
416
}
417
418
else
if
(pin.indexOf(
"03"
) > -1 ) {
// команда на пуск запуска
419
pin =
""
;
420
if
(digitalRead(Block) == HIGH)
// если на блокировке
421
{
422
Voice(8), delay (4000), SIM800.println(
"ATH0"
);
// "двигатель блокирован"
423
}
424
else
if
(digitalRead(Podxvat) == LOW && digitalRead(Ignition) == LOW && digitalRead(StopPin) == LOW && digitalRead(RazrAutoZap) == HIGH && digitalRead(Block) == LOW)
425
{
426
Voice(7), delay (2000), enginestart(4);
// "все поняла завожу" // запуск (4) попытки
427
}
428
else
if
(heating ==
true
)
// если на прогреве
429
{
430
Voice(5), delay (3000), SIM800.println(
"ATH0"
);
// "уже, прогреваюсь!..."
431
}
432
else
if
(digitalRead(RazrAutoZap) == LOW)
// если нет разрешения автозапуска
433
{
434
Voice(20), delay (3000), SIM800.println(
"ATH0"
);
// "не врежиме запуска"
435
delay (1);
436
k2 = 0;
//обнуление счетчика к2 и state9, что бы 3 раза моргнуть поворотником
437
state9 = 0;
438
}
439
else
if
(digitalRead(Ignition) == HIGH && digitalRead(Tahometr) == HIGH && digitalRead(Block) == LOW)
// если двигатель запущен ключем
440
{
441
Voice(10), delay (3000), SIM800.println(
"ATH0"
);
// "оп, двигатель уже запущен!..."
442
}
443
}
444
445
else
if
(pin.indexOf(
"30"
) > -1 ) {
// команда стоп прогрева
446
pin =
""
;
447
if
(heating ==
true
)
448
{
449
Voice(6), delay(2000), heatingstop(1);
// (стоп прогрева)
450
SIM800.println(
"ATH0"
);
451
}
452
else
if
(heating ==
false
)
453
{
454
false
;
455
SIM800.println(
"ATH0"
);
456
}
457
}
458
459
else
if
(pin.indexOf(
"56"
) > -1 ) {
460
pin =
""
, Voice(17), digitalWrite(ZapretDoor, HIGH), delay (3000), SIM800.println(
"ATH0"
);
// "отключено! срабатывание! двери!"
461
}
462
463
else
if
(pin.indexOf(
"65"
) > -1 ) {
464
pin =
""
, Voice(18), digitalWrite(ZapretDoor, LOW), delay (3000), SIM800.println(
"ATH0"
);
// "включено! срабатывание! двери!"
465
}
466
467
//------голосовые сообщения при входящем звонке-----------
468
if
(ring ==
true
) {
469
ring =
false
, delay (2000), pin =
""
;
// обнуляем пин
470
471
if
(digitalRead(Alarm) == LOW && digitalRead(Block) == LOW) {
//сработала сигнализация на авто
472
Voice(14);
// "нарушение охраны"
473
}
474
else
if
(digitalRead(Block) == HIGH) {
//авто находится в режиме блокирови Voice(8)
475
Voice(8);
// "двигатель блокирован"
476
}
477
else
if
(digitalRead(Podxvat) == LOW && digitalRead(Ignition) == HIGH && digitalRead(Block) == LOW && digitalRead(Tahometr) == HIGH && heating ==
false
) {
//включено зажигание, подхват зажигания и нет прогрева от arduino
478
Voice(10);
// Voice(10) "двигатель уже запущен"
479
}
480
else
if
(digitalRead(Podxvat) == HIGH && digitalRead(Block) == LOW && digitalRead(Tahometr) == HIGH && heating ==
false
) {
//включено зажигание, подхват зажигания и нет прогрева от arduino
481
Voice(25);
// Voice(25) "авто! в режиме! пидстопа!"
482
}
483
else
if
(digitalRead(Podxvat) == LOW && digitalRead(Ignition) == HIGH && digitalRead(Block) == LOW && digitalRead(Tahometr) == LOW && heating ==
false
) {
484
Voice(23);
// "включено зажигание"
485
}
486
else
if
(Vbat1 < 10.5) {
// "низкое напряжение"
487
Voice(12);
488
}
489
else
if
(digitalRead(Podxvat) == LOW && digitalRead(Ignition) == LOW && digitalRead(Tahometr) == LOW && digitalRead(Block) == LOW) {
490
Voice(22);
//при входящем звонке тональный гудок 22
491
}
492
else
if
(heating ==
true
) {
493
Voice(5);
// "уже прогреваюсь"
494
}
495
}
496
}
497
498
void
detection1() {
// условия проверяемые каждые 2 сек
499
Vbat1 = VoltRead1();
// замеряем напряжение на батарее, на A6
500
if
(Timer > 0) Timer--;
//если кол-во попыток запуска >0, запускаем таймер
501
if
(heating ==
true
&& Timer < 1) heatingstop(0);
// остановка прогрева если закончился таймер
502
if
(heating ==
true
&& Vbat1 < 10.00) heatingstop(1);
// остановка прогрева если напряжение просело ниже 10 вольт
503
}
504
505
void
detection2() {
// условия проверяемые каждые 0,1 сек
506
Vbat2 = VoltRead2();
// замеряем напряжение на A7
507
if
(Vbat2 >= 5.00 && digitalRead(RazrAutoZap) == HIGH && digitalRead(Ignition) == LOW && digitalRead(Podxvat) == LOW) enginestart(4);
// запуск с пульта сигналки
508
else
if
(Vbat2 >= 5.00 && digitalRead(RazrAutoZap) == LOW) {
509
k2 = 0;
//обнуление счетчика к2 и state9, что бы 3 раза моргнуть поворотником
510
state9 = 0;
511
}
512
}
513
514
// ---- программа запуска двигателя -----------
515
void
enginestart(
int
Attempts) {
// () заданное количество попыток запуска
516
int
StTime = constrain(StTime, 750, 3000);
// ограничиваем диапазон работы стартера от 0,75 до 6 сек
517
Timer = constrain(Timer, 300, 300);
// ограничиваем таймер - Timer в значениях от 10 до 10 минут
518
count = 0;
// переменная хранящая число совершенных попыток запуска
519
520
// если напряжение АКБ больше 10 вольт, зажигание выключено, счетчик заданного числа попыток ( enginestart(4)
521
while
(Vbat1 > 10.00 && digitalRead(Ignition) == LOW && count < Attempts) {
522
count++;
523
delay (1000);
// пауза на включение Podxvat
524
Voice(21);
// "Зажигание"
525
digitalWrite(Podxvat, HIGH);
// включаем зажигание, и выжидаем 3 сек.
526
delay (3000);
// пауза для анализа ЭБУ авто
527
528
// если есть разрешение на автозапуск то включаем реле стартера на время StTime
529
if
(digitalRead(RazrAutoZap) == HIGH && digitalRead(Podxvat) == HIGH && digitalRead(Parking) == HIGH) {
// если разрешен автозапусск(RazrAutoZap) == HIGH)
530
Voice(19);
// "Стартер"
531
StartTimeON = millis();
532
digitalWrite(Start, HIGH);
// включаем реле стартера
533
}
534
delay (10);
535
while
(millis() < (StartTimeON + StTime) && digitalRead(RazrAutoZap) == HIGH);
//закончилось время стартера и RazrAutoZap == HIGH
536
digitalWrite(Start, LOW);
// отключаем стартер
537
delay (4000);
//ждем 4 сек, что бы двигатель стабильно заработал
538
539
// включился подхват зажигания, на паркинге, тахометр HIGH и есть разрешение запуска
540
if
(digitalRead(Podxvat) == HIGH && digitalRead(Parking) == HIGH && digitalRead(Tahometr) == HIGH && digitalRead(RazrAutoZap) == HIGH) {
541
Voice(2);
//"Двигатель запущен, Двигатель запущен"
542
heating =
true
;
543
delay (4000);
544
digitalWrite(ACC, HIGH);
// включаем реле выхода для вторичных приборов авто, через 4 сек
545
break
;
// считаем старт успешным, выходим из цикла запуска двигателя
546
}
547
548
Voice(3);
// "повторный запуск" если авто не запустилось
549
StTime = StTime + 250;
// увеличиваем время следующего старта на 0,25 сек.
550
heatingstop(0);
// отключаем все реле без обнуления таймера
551
delay(10000);
// пауза между попытками запуска
552
}
553
if
(heating ==
false
) {
554
Voice(24), Timer = 0;
// не запустилась! попробуйте еще раз!/ обнуляем таймер если запуска не произошло
555
k2 = 0;
//обнуление счетчика к2 и state9, что бы 3 раза моргнуть поворотником
556
state9 = 0;
557
}
558
delay(3000), SIM800.println(
"ATH0"
);
// вешаем трубку (для SIM800)
559
}
560
561
//------ программа остановки прогрева двигателя -------------
562
void
heatingstop (
bool
reset_timer) {
563
digitalWrite(ACC, LOW), delay (2000);
564
digitalWrite(Podxvat, LOW), delay (10);
565
heating =
false
, delay(1000);
566
if
(reset_timer ==
true
) Timer = 0;
// обнуляем таймер если авто прогревалось
567
timer4 = 0;
// сбрасываем таймер пидстопа
568
}
569
570
//--- замеряем напряжение на батарее и переводим значения в вольты ----------
571
float
VoltRead1() {
572
float
ADCC1 = analogRead(BAT_Pin);
573
ADCC1 = ADCC1 / m1 ;
574
if
(ADCC1 < V_min1) V_min1 = ADCC1;
// переводим данные ацп1 в вольты
575
return
(ADCC1);
576
}
577
578
float
VoltRead2() {
579
float
ADCC2 = analogRead(Pusk_Sig);
580
ADCC2 = ADCC2 / m2 ;
581
if
(ADCC2 < V_min2) V_min2 = ADCC2;
// переводим данные ацп2 в вольты
582
return
(ADCC2);
583
}
584
585
//проговаривание голосовых треков из SIM800
586
void
Voice(
int
Track) {
587
SIM800.print(
"AT+CREC=4,\"C:\\User\\"
), SIM800.print(Track), SIM800.println(
".amr\",0,95"
);
588
}
589
590
//моргать поворотником в режиме прогрева или пидстопа
591
void
Blinker() {
592
unsigned
long
currentMillis3 = millis();
// текущее время в миллисекундах, выясняем не настал ли момент сменить состояние светодиода
593
if
((Blinks10state10 == HIGH) && (currentMillis3 - previousMillis3 >= OnTime10))
// если светодиод включен и светится больше чем надо
594
{
595
Blinks10state10 = LOW;
// выключаем
596
previousMillis3 = currentMillis3;
// запоминаем момент времени
597
digitalWrite(Blinks10, Blinks10state10);
// реализуем новое состояние
598
}
599
else
if
((Blinks10state10 == LOW) && (currentMillis3 - previousMillis3 >= OffTime10) && !state10)
//здесь проверяем 3 пунктом это состояние
600
{
601
Blinks10state10 = HIGH;
// включаем
602
previousMillis3 = currentMillis3 ;
// запоминаем момент времени
603
digitalWrite(Blinks10, Blinks10state10);
// реализуем новое состояние
604
}
605
}
606
607
//--Выполняем моргание реле дальнего света и клаксона, при блокировке мотора-------
608
void
Gygok() {
609
unsigned
long
currentMillis4 = millis();
// текущее время в миллисекундах, выясняем не настал ли момент сменить состояние светодиода
610
if
((Klaxonstate11 == HIGH) && (currentMillis4 - previousMillis4 >= OnTime11))
// если светодиод включен и светится больше чем надо
611
{
612
Klaxonstate11 = LOW;
// выключаем
613
previousMillis4 = currentMillis4;
// запоминаем момент времени
614
digitalWrite(Klaxon, Klaxonstate11);
// реализуем новое состояние
615
}
616
else
if
((Klaxonstate11 == LOW) && (currentMillis4 - previousMillis4 >= OffTime11) && !state11)
//здесь проверяем состояние
617
{
618
Klaxonstate11 = HIGH;
// включаем
619
previousMillis4 = currentMillis4 ;
// запоминаем момент времени
620
digitalWrite(Klaxon, Klaxonstate11);
// реализуем новое состояние
621
}
622
}
frequency_meter
01
//frequency_meter.ino
02
//тахометр
03
#define Out_LED 4 //Вывод счетчика
04
#define Taho 3 //Вход сигнал тахометра
05
#define ObrabotkaTaho 5 //Выход обработанного счетчика, задержка 0.5 сек
06
07
volatile unsigned
int
RPM_ON_LED = 200;
//Включать Led при достижении оборотов, об/мин
08
volatile unsigned
long
microcod = 0;
//Предыдущее значение таймера
09
volatile unsigned
int
rpm2 = 0;
//Обороты коленвала, об/мин
10
volatile unsigned
int
rpm2OFF = 0;
//Обороты коленвала для отключения коротких каналов, об/мин
11
volatile
byte
sr = 0;
//счетчик обнуления
12
volatile boolean st =
false
;
//триггер
13
14
unsigned
long
previousMillis = 0;
// Зададим начальное значение для счетчика millis
15
unsigned
long
PsoTime5 = 0;
// для таймера в цикле отработки задержки сигнала счетчика
16
bool
timer5 = 0;
// флаг включен ли таймер, 0 - выключен, 1 - включен
17
uint16_t TimePush5 = 3000;
// Время срабатывания вывода для отработки задержки сигнала счетчика
18
19
void
setup
() {
20
Serial
.begin(9600);
// для контроля в Serial, считает или нет, можно закомментировать
21
pinMode(Out_LED, OUTPUT);
22
pinMode(Taho, INPUT);
23
pinMode(ObrabotkaTaho, OUTPUT);
24
25
// При включении зажигания выключить LED
26
digitalWrite(Out_LED, LOW);
//По умолчанию LED выключено
27
//Устанавливаем вход тахометра
28
digitalWrite(Taho, HIGH);
//Внутренняя подтяжка
29
digitalWrite(ObrabotkaTaho, LOW);
//По умолчанию выключено
30
31
detachInterrupt(0);
// отключаем обработку внешнего прерывания на Pin2
32
attachInterrupt(1, RPM2, FALLING);
//Устанавливаем считывание оборотов через прерывание, при смене значения на порту с HIGH на LOW
33
34
}
35
void
loop
() {
36
37
//---- обработка задержки сигнала счетчика тахометра -----------
38
// при старте в авто в линии тахометра мусор, его отфильтровываем
39
if
(!timer5 && digitalRead(Out_LED) == HIGH) {
40
timer5 = 1;
// если таймер выключен и ObrabotkaTaho == HIGH запускаем таймер
41
PsoTime5 = millis();
42
}
43
if
(digitalRead(Out_LED) == LOW) {
44
timer5 = 0;
// если ObrabotkaTaho == LOW молчит выключаем таймер, сбрасываем флаг "звонок выполнен"
45
digitalWrite(ObrabotkaTaho, LOW);
46
}
47
if
(timer5 && millis() - PsoTime5 > TimePush5)
// если таймер был включен и кончился,
48
{
49
timer5 = 0;
// выключаем таймер и
50
digitalWrite(ObrabotkaTaho, HIGH);
// если флаг выполнен в фальсе то
51
}
52
53
Serial
.println(rpm2);
// для контроля в Serial, считает или нет, можно закомментировать
54
if
(sr != 0) {
55
sr--;
56
}
else
{
57
rpm2 = 0;
58
}
59
rpm2OFF = rpm2 + 4000;
// время подсчета пропусков оборотов +1--+100, чем больше, тем точнеев подсчет
60
61
//Если текущие обороты больше или равны заданным, с учетом времени реакции, то включаем LED.
62
//В противном случае выключаем LED
63
if
(rpm2 >= RPM_ON_LED) {
//Включать Led при достижении оборотов, об/мин
64
digitalWrite(Out_LED, HIGH);
65
}
else
if
(rpm2 < RPM_ON_LED) {
//Выключать Led при достижении оборотов, об/мин
66
digitalWrite(Out_LED, LOW);
67
}
68
delay(50);
69
}
70
//Считывание оборотов
71
void
RPM2() {
72
if
(!st) {
73
microcod = millis();
74
}
else
{
75
rpm2 = (1000 / (millis() - microcod)) * 60 / 2;
//об/мин. импульсы 1 раза на один оборот
76
}
//(если 2 импульса за оборот * 60 / 2; смотреть в мониторе порта).
77
st = !st;
78
sr = 20;
// счетчик обнуления, чем больше, тем больше время сброса LED в LOW, 1000~~15сек
79
}
Как здесь сохранить архив со всеми файлами, что бы не хранить на стороннем ресурсе, что то не найду как.
На яндексе файлы могут не долго пролежать, подчищаю иногда диск.
Спасибо.
Как здесь сохранить архив со всеми файлами
никак
А оно надо? Уверены, что стоит выкладывать эту полурабочую поделку?
код с кучей делеев, с таймерами, которые заглючат от первого же переполнения ?
и while(1) вообще гуд. На кпп механику такую поделку ставить нельзя. Уедет
Надеюсь до материального ущерба или уголовки не доведет никого этот проект. Просто сгинет в пучине тысяч подобных
Почему-то всех новичков тянет на ардуину именно сигналку запилить...
Почему-то всех новичков тянет на ардуину именно сигналку запилить...
Неправда. Меня тянуло сделать кнопку старт/стоп. Слава богу вовремя остановился, решил обойтись часами )))