Код:
/* Подключение
* д2 выход на реле зажигания
* д3 выход на реле стартера
* д4 выход на реле габариток от дверного замка
* д5 выход на динамик или пищалку
* A2 вход от педали тормоза если 1 то нажата и выключает зажигание
* A3 вход от ручника 5 в. если 0 то натянут
* д6 вход от ГСМ статус включен ли ГСМ модуль
* д7 и д8 комуникация с ГСМ модулем
* д9 включение и выключение ГСМ модуля
* д10 на реле открытия замка
* д11 на реле закрытия замка
* д12 выход на лазеры
* д13 выход на сигнальный светодиод
* A0 вход от 1 фото резистора от коробки передач для определения нетральной скорости
* A1 вход от 2 фото резистора от коробки передач для определения нетральной скорости
* A4 вход от генератора для определения работы мотора
*/
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(7, 8);
int zundungs_Pin = 2;
int starter_Pin = 3;
int taste_Pin = 3;
int sensor_GSM_Pin=6;
int bremse_Pin=A2;
int laser_Pin=12;
int handbremse_Pin=A3;
int motorgestartet_Pin=A4;
int getriebe_V_Pin=A0;
int getriebe_V_Wert;
int getriebe_H_Pin=A1;
int getriebe_H_Wert;
int motorgestartet_Wert;
int bremse_Wert; //если равен 0 то педаль не нажата
int handbremse_Wert; //если равен 0 то ручник натянут
int versuch=0;
int schloss_Auf_Pin=10;
int schloss_Zu_Pin=11;
int blinker_Pin=4;
int status_Led_Pin=13;
int toner_Pin=5;
const long time_out=60000*15; //через какое время будет выключен мотор, если ничего не происходит
const long versuch_dauer=29000; //Zeit zwischen Startversuche
unsigned long altMillis = 0;
unsigned long neuMillis;
bool motorgestartet = false; //логика если правда то мотор включен
bool gsmmodul = true; //логика если правда то модуль сим900 включен
bool prozess_autostart=false; //логика если правда то автозапуск активен
bool neutrale; //логика если правда то скорость нетральная включена
bool bremse;
bool handbremse;
bool fehlversuch=false;
void setup(){
gprsSerial.begin(19200);
Serial.begin(19200);
pinMode(zundungs_Pin, OUTPUT);
pinMode(starter_Pin, OUTPUT);
pinMode(laser_Pin, OUTPUT);
pinMode(status_Led_Pin, OUTPUT);
pinMode(schloss_Auf_Pin, OUTPUT);
pinMode(schloss_Zu_Pin, OUTPUT);
pinMode(blinker_Pin, OUTPUT);
pinMode(toner_Pin, OUTPUT);
pinMode(sensor_GSM_Pin, INPUT);
pinMode(bremse_Pin, INPUT);
pinMode(handbremse_Pin, INPUT);
pinMode(motorgestartet_Pin, INPUT);
pinMode(getriebe_V_Pin, INPUT);
pinMode(getriebe_H_Pin, INPUT);
power();
}
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
void loop()
{
check();
if(!gsmmodul){power();}
smserkennen();
//Debuging
//handbremse=true; neutrale=true; //обязательно отключить - только для отладки кода
if (versuch>=3){versuch=0; MotorStop();prozess_autostart=false;feedback3versuchefaul();fehlversuch=true;}
check();
if(prozess_autostart){digitalWrite(laser_Pin,HIGH);}else{digitalWrite(laser_Pin,LOW);}
if(prozess_autostart&& neutrale && !motorgestartet && (versuch<3) && (versuch>0)){Serial.print("z87 Zaehler=");Serial.println(neuMillis-altMillis);
if(versuch_dauer>(neuMillis-altMillis)){Serial.println("Versuch Zeit abg. neu Versuch");
MotorStop();delay(3000);MotorStart();}}
if(prozess_autostart && motorgestartet){ if(time_out<(neuMillis-altMillis)){zeit20Abgelaufen();Serial.println("Zeit 20min ist abgelaufen - STOP!!!");prozess_autostart=false;
MotorStop();versuch=0; } }
if(bremse){fehlversuch=false;digitalWrite(laser_Pin,HIGH); check();if(neutrale){digitalWrite(status_Led_Pin,HIGH);}else{digitalWrite(status_Led_Pin,LOW);}}
if(!bremse){digitalWrite(status_Led_Pin,LOW);}
if(bremse && prozess_autostart){MotorStop();prozess_autostart=false;versuch=0;fehlversuch=false;}
//digitalWrite(laser_Pin,HIGH);
//Serial.println(getriebe_V_Wert);
//Serial.println(getriebe_H_Wert);
//Serial.println(neutrale);
//Serial.println(handbremse);
}
//распознование смс
void smserkennen(){
if (!gprsSerial.available())
return;
char currSymb = gprsSerial.read();
if ('\r' == currSymb) {
if (isStringMessage) {
//если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
if (!currStr.compareTo("MotorStart")) {Serial.println("sms MotorStart empfangen");prozess_autostart=true;MotorStart();}
else if (!currStr.compareTo("MotorStop")) {Serial.println("sms MotorStop empfangen"); if(prozess_autostart){prozess_autostart=false;MotorStop();}}
else if (!currStr.compareTo("Tuereauf")) {Serial.println("sms Tuereauf empfangen");tuereAuf();}
else if (!currStr.compareTo("Tuerezu")) {Serial.println("sms Tuerezu empfangen");tuereZu();}
else if (!currStr.compareTo("status")) {Serial.println("sms status empfangen");statusBool();}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}
void MotorStart() {
altMillis=neuMillis;digitalWrite(laser_Pin,HIGH);delay(20); check();
if(neutrale){
digitalWrite(zundungs_Pin, HIGH);Serial.println("Zuendung eingeschaltet");delay(4000);digitalWrite(starter_Pin, HIGH);Serial.println("Starter eingeschaltet");
delay(4000);digitalWrite(starter_Pin, LOW);Serial.println("Starter ausgeschaltet"); versuch++;Serial.print("Versuch: ");Serial.println(versuch);
Serial.print("Prozess Austostart=");Serial.println(prozess_autostart);Serial.print("Motorgestartet=");Serial.println(motorgestartet);
Serial.print("Zaehler=");Serial.println(neuMillis-altMillis);
delay(500);check();if(motorgestartet){feedbackMotorGestartet();}
delSms();}else{statusBool();prozess_autostart=false;fehlversuch=true;}
}
void MotorStop()
{
digitalWrite(zundungs_Pin, LOW);Serial.println("Motor / Zuendung aus");digitalWrite(laser_Pin,LOW);delay(200);
}
void tuereAuf()
{digitalWrite(blinker_Pin,HIGH);delay(500);digitalWrite(schloss_Auf_Pin,HIGH);delay(700);digitalWrite(blinker_Pin,LOW);digitalWrite(schloss_Auf_Pin,LOW);delay(50);
}
void tuereZu()
{digitalWrite(blinker_Pin,HIGH);delay(500);digitalWrite(blinker_Pin,LOW);digitalWrite(schloss_Zu_Pin,HIGH);
delay(700);digitalWrite(blinker_Pin,HIGH);digitalWrite(schloss_Zu_Pin,LOW);delay(50);delay(450);digitalWrite(blinker_Pin,LOW);}
void feedback3versuchefaul()
{
gprsSerial.print("AT+CMGF=1\r"); // AT command to send SMS message
delay(100);
gprsSerial.println("AT + CMGS = \"+49151xxxx\""); // recipient's mobile number, in international format
delay(100);
gprsSerial.println("Nach 3 Versuche koennte den Motor nicht starten"); // message to send
delay(100);
gprsSerial.println((char)26); // End AT command with a ^Z, ASCII code 26
delay(100);
gprsSerial.println();
}
void feedbackMotorGestartet()
{
gprsSerial.print("AT+CMGF=1\r"); // AT command to send SMS message
delay(100);
gprsSerial.println("AT + CMGS = \"+49151xxxx\""); // recipient's mobile number, in international format
delay(100);
gprsSerial.println("Motor ist erfolgreich gestartet"); // message to send
delay(100);
gprsSerial.println((char)26); // End AT command with a ^Z, ASCII code 26
delay(100);
gprsSerial.println();
}
void zeit20Abgelaufen()
{
gprsSerial.print("AT+CMGF=1\r"); // AT command to send SMS message
delay(100);
gprsSerial.println("AT + CMGS = \"+49151xxxx\""); // recipient's mobile number, in international format
delay(100);
gprsSerial.println("Zeit - 20 Min. abgelaufen, Motor ist ausgeschaltet"); // message to send
delay(100);
gprsSerial.println((char)26); // End AT command with a ^Z, ASCII code 26
delay(100);
gprsSerial.println();
}
void statusBool(){
if(prozess_autostart && !neutrale && !handbremse)
{
gprsSerial.print("AT+CMGF=1\r"); // AT command to send SMS message
delay(100);
gprsSerial.println("AT + CMGS = \"+49151xxxx\""); // recipient's mobile number, in international format
delay(100);
gprsSerial.println("Gang ist nicht Neutral und Handbremse nicht angezogen, Motor wird nicht gestartet"); // message to send
delay(100);
gprsSerial.println((char)26); // End AT command with a ^Z, ASCII code 26
delay(100);
gprsSerial.println();
}
if(prozess_autostart && neutrale && !handbremse)
{
gprsSerial.print("AT+CMGF=1\r"); // AT command to send SMS message
delay(100);
gprsSerial.println("AT + CMGS = \"+49151xxxx\""); // recipient's mobile number, in international format
delay(100);
gprsSerial.println("Gang ist Neutral aber Handbremse nicht angezogen, Motor wird nicht gestartet"); // message to send
delay(100);
gprsSerial.println((char)26); // End AT command with a ^Z, ASCII code 26
delay(100);
gprsSerial.println();
}
if(neutrale && handbremse && motorgestartet && prozess_autostart)
{
gprsSerial.print("AT+CMGF=1\r"); // AT command to send SMS message
delay(100);
gprsSerial.println("AT + CMGS = \"+49151xxxx\""); // recipient's mobile number, in international format
delay(100);
gprsSerial.println("alles OK. Autostart ist aktiv, Motor ist gestartet"); // message to send
delay(100);
gprsSerial.println((char)26); // End AT command with a ^Z, ASCII code 26
delay(100);
gprsSerial.println();
}
if(fehlversuch)
{
gprsSerial.print("AT+CMGF=1\r"); // AT command to send SMS message
delay(100);
gprsSerial.println("AT + CMGS = \"+49151xxxx\""); // recipient's mobile number, in international format
delay(100);
gprsSerial.println("Nach 3 Versuche, den Motor ist nicht gestartet"); // message to send
delay(100);
gprsSerial.println((char)26); // End AT command with a ^Z, ASCII code 26
delay(100);
gprsSerial.println();
}
}
void check()
{
neuMillis = millis();
gsmmodul = digitalRead(sensor_GSM_Pin);
bremse_Wert = analogRead(bremse_Pin); if(bremse_Wert>1000){bremse=true;}else{bremse=false;}
handbremse_Wert = analogRead(handbremse_Pin); if(handbremse_Wert<150){handbremse=true;}else{handbremse=false;}delay(300);
motorgestartet_Wert = analogRead(motorgestartet_Pin); if(motorgestartet_Wert<100){motorgestartet=true;}else{motorgestartet=false;}
getriebe_V_Wert = analogRead(getriebe_V_Pin);
getriebe_H_Wert = analogRead(getriebe_H_Pin);
if((getriebe_V_Wert>850)&&(getriebe_H_Wert>500)){neutrale=true;}else{neutrale=false;}
}
//стереть все смс
void delSms(){
gprsSerial.print("AT+CMGD=1,4 ");
delay(2000);
}
void ShowSerialData()
{
while(gprsSerial.available()!=0)
Serial.write(gprsSerial.read());
}
//включить модуль гсм
void power(){
digitalWrite(9, HIGH);
delay(1000);Serial.println("GSM Modul wird gestartet");
digitalWrite(9, LOW);
delay(5000);
gprsSerial.print("AT+IPR=19200");
delay(500);
gprsSerial.print("AT+CMGF=1\r");
delay(300);
gprsSerial.print("AT+IFC=1, 1\r");
delay(300);
gprsSerial.print("AT+CPBS=\"SM\"\r");
delay(300);
gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
delay(500);
gprsSerial.print("AT+CMGD=1,4 ");
delay(3000);
Serial.println("GSM Modul ist bereit");
}