Автозапуск на базе ардуино, проблема с сим900
	
	
		Вообщем жена сдала на права, на первое время купили ей маленький ситроен с1 - простой на нет. Я давно хотел поэксперемеентировать с ардуино и машиной , вот выдался случай.
это моя третия программа для ардуино так что я новичок - не судите о коде строго. Управление по смс через сим900.
скеч работает все нормально. но есть несколько проблем.
1. переодично выключается сим900, непонятно почему. Питания точно хватает. Как временное решение встроил в программу слежение о сим900 , если выключится то сразу включить.
2.  через некоторое время не использования, например день или два. На смс перестает реагировать. светодиоды на сим900 мигают правильно, что сеть есть - все нормально. подозреваю что нарушается связь между ардуино и сим900 по сериалу.
посмтотрите скеч может я в нем намул чего что такое происходит. заранее извиняюсь что так не грамотно написал скеч
	Код:
	
/*   Подключение
 *    д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");
}