Показано с 1 по 1 из 1
  1. #1
    Новичок
    Регистрация
    19.07.2016
    Возраст
    43
    Сообщений
    3
    Вес репутации
    0

    По умолчанию Автозапуск на базе ардуино, проблема с сим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");
    }
    Последний раз редактировалось Selen; 11.01.2017 в 22:47.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •