#1 2017-01-03 00:51:21

Selen
Учасник
Зареєстрований: 2017-01-02
Повідомлень: 88

Автозапуск на базе ардуино, проблема с сим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");
}

bild

Остання редакція Selen (2017-01-03 05:57:16)

Неактивний

#2 2017-01-03 10:32:55

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Автозапуск на базе ардуино, проблема с сим900

guten morgen
"д12 выход на лазеры" , отстреливаться собираетесь? )

как ведет себя в домашних условиях? на столе
с лета никаких сдвигов?

Неактивний

#3 2017-01-03 15:02:26

Selen
Учасник
Зареєстрований: 2017-01-02
Повідомлень: 88

Re: Автозапуск на базе ардуино, проблема с сим900

Здравствуйте, спасибо за ответ.
д12 это маленькие лазеры для рычага коробки чтоб определить что рычаг находится на нейтральной скорости.

дома от блока питания , тоже часто выключалась сим900 без причин.

а еще она на смс не реагирует например если она включится а ардуино не настроит ее командами из power(); тогда она хоть и работает но смс не принимае. Мне больше всего не нравится то что после определенного времени она перестает принимать\реагировать на смс. и я даже посмотреть не могу в чем проблема. как только я комп подключу то ардуино перестартует. и тогда будет обратно все работать, а 2 дня со включенным компом - не реально сидеть в машине - замерзну).

Неактивний

#4 2017-01-03 15:56:16

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Автозапуск на базе ардуино, проблема с сим900

привет,
тесты только на столе, как ни прискорбно, но с авто нужно снимать, или повторите устройство
как бы  я делал
1.  sim900 -   может работать автономно, отключите интерфейс от ардуино,   по сути нужно только питание,   проверка, звонком, предварительно можно настроить что б модуль подымал трубку после 3 звонка ( для пример ATS0=3 )
если за 3 дня не "отвалится" от сети  проблема в  соединении с ардуино

я не увидел на схеме  модуля согласования уровней интерфейса,
может этот сименс и толерантен к всяким напряжениям,
но лично я бы ставил поставил voltage level translation

для начал сделайте тест без ардуино,
дальше будет видно  )


в идеале - расспросить владельца такого модуля,
я сименсы только  как готовые устройства  ( TC35 ) использовал

Неактивний

#5 2017-01-03 15:58:13

Selen
Учасник
Зареєстрований: 2017-01-02
Повідомлень: 88

Re: Автозапуск на базе ардуино, проблема с сим900

спасибо большое , буду пробовать.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму