Мотосигнализация

Тема в разделе "Посоветуйте детальки", создана пользователем Vladis_a, 17 дек 2015.

  1. ImrDuke

    ImrDuke Гик

    Поделитесь потом результатом.
     
  2. Vladis_a

    Vladis_a Гик

    Конечно! Мне еще человек у нас в городе обещал помочь с программированием, но он сейчас занят. А вообще в окончательном виде будет идентификация по MFRC 522 и отправка данных GPS в случае угона.
     
  3. Vladis_a

    Vladis_a Гик

    Ну вот, скрестил "ужа с ежом". :) Получилась сигналка, которая в случае изменения положения пищит сиреной и звонит на заданный номер. Я с планшета, поэтому код в виде файла. Работает, что странно, т.к.скрещивал я. :)
     

    Вложения:

  4. Vladis_a

    Vladis_a Гик

    Добрался до нормального компьютера, поэтому выложу код еще и так. Возможно, кто-нибудь подправит для красивости.
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial gsm(2, 3);        // RX, TX подключение модема

    #include <ADXL335.h>
    int x; // выходная переменная по оси x
    int y; // выходная переменная по оси y
    int z; // выходная переменная по оси z
    int changelvl;
    int lastx;
    int lasty;
    int lastz;
    int ledPin = 11; // плюс сирены
    int powerPinSenser = 10; // подаём питание на акселерометр
    int powerPinPot = 9; // подаём питание на потенциометр
    int Pot = A2; // средний контакт потенциометра
    int n; // граница срабатывания
    int defaultn;

    void setup(){

      Serial.begin(9600);          /// скорость порта 9600
      gsm.begin(19200);            /// указываем скорость работы UART модема
     
      pinMode(ledPin, OUTPUT); // устанавливаем вывод 11 как выход
      pinMode(powerPinSenser, OUTPUT);
      pinMode(powerPinPot, OUTPUT);
      pinMode(Pot, INPUT);

      digitalWrite(powerPinSenser, HIGH);
      delay(30);
      x = analogRead(5); // считываем вход A5
      y = analogRead(4); // считываем вход A4
      z = analogRead(3); // считываем вход A3

      defaultn = 2; // число срабатываний-циклов
      n = defaultn;
      digitalWrite(powerPinSenser, LOW);
      delay(6000); // задержка после включения

    }

    void loop()
    {

      if (gsm.available())
      Serial.write(gsm.read());
      if (Serial.available())
      gsm.write(Serial.read());
      digitalWrite(powerPinSenser, HIGH);
      digitalWrite(powerPinPot, HIGH);

      delay(3);

      lastx = x;
      lasty = y;
      lastz = z;

      x = analogRead(5); // считываем вход A5
      y = analogRead(4); // считываем вход A4
      z = analogRead(3); // считываем вход A3

      changelvl = map(analogRead(Pot),0,1023,20,2); // значения min/max для потенциометра
       
      digitalWrite(powerPinSenser, LOW);
      digitalWrite(powerPinPot, LOW);

      Serial.print("lvl = "); // выводим значение по x
      Serial.println(changelvl);

      Serial.print("X = "); // выводим значение по x
      Serial.println(x);
      Serial.print("Y = "); // выводим значение по y
      Serial.println(y);
      Serial.print("Z = "); // выводим значение по z
      Serial.println(z);

      Serial.print("dX = ");
      Serial.println(abs(x - lastx));
      Serial.print("dY = ");
      Serial.println(abs(y - lasty));
      Serial.print("dZ = ");
      Serial.println(abs(z - lastz));

      if (changelvl < abs(x - lastx) || changelvl < abs(y - lasty) || changelvl < abs(z - lastz) ){
        if (n > 0 ){
          n = n -1;
        }
        else{
        digitalWrite(ledPin, HIGH);
        delay(10000); // время работы сирены при срабатывании
        digitalWrite(ledPin, LOW);
        digitalWrite(powerPinSenser, HIGH);
        delay(30);
        gsm.println("ATD+7XXXXXXXXXX;");/// звоним по указанному номеру
        delay(1000);
        if (gsm.find("OK")) Serial.println("ATD+OK!"); /// выводим в порт информацию об успешном звонке

        lastx = x;
        lasty = y;
        lastz = z;

        x = analogRead(5); // считываем вход A5
        y = analogRead(4); // считываем вход A4
        z = analogRead(3); // считываем вход A3

        digitalWrite(powerPinSenser, LOW);      
        }
      }
      else{
        n = defaultn;
      }
      delay(500);  
     
                                    /////////////////// и\или отправляем SMS

    /*
        gsm.println("AT+CMGF=1");
        delay(100);
        gsm.println("AT+CSCS=\"GSM\"");
        delay(100);
        gsm.println("AT+CMGS=\"7XXXXXXXXXX\""); // даем команду на отправку смс
        delay(100);
        gsm.print("111");             // отправляем текст (здесь вместо 111 можно вбить свой текст, например Alarm!)
        gsm.print((char)26);          // символ завершающий передачу
        Serial.println("SMS ok");     // выводим информацию об успешной отправке
        delay(100);
         
    */

     
    }
     
     
  5. Vladis_a

    Vladis_a Гик

    Здесь был неправильный и нерабочий код! Скоро выложу новый.
     
    Последнее редактирование: 2 фев 2016
  6. Vladis_a

    Vladis_a Гик

    Как только разберусь с вышеуказанным скетчем, буду скрещивать уже с тем, который является непосредственно сигнализацией. В итоге получу, что и хотел - GSM-сигнализацию, которая при изменении положения мотоцикла сначала звонит на указанный номер, а при поступлении СМС с паролем - отправляет посредством СМС свои координаты.
    Ну и потом останется еще MFRC522 прикрутить для идентификации (ха, блин, какая мелочь :):):)).
     
    ImrDuke нравится это.
  7. Vladis_a

    Vladis_a Гик

    Как и обещал, выкладываю рабочий код, который отправляет СМС с координатами, да еще и со ссылкой на карты Google. Благодарности не мне, т.к. я его всего лишь немного подправил под модуль Neoway M590, ну и вставил ссылку на карты (так нагляднее).
    Код (C++):
    #include <SoftwareSerial.h> // Подключаем библиотеку SoftwareSerial
    #include <string.h>
    #include <TinyGPS.h> // Подключаем библиотеку для GPS

    SoftwareSerial GSM(2,3); // Модуль GSM с именем GSM на пинах 2 - RX, 3 - TX Ардуино

    byte buffer[128]; // Размер буфера для данных. Обратите внимание на размер! Необходимо править библиотеку SoftwareSerial.h
    int count=0; // Счетчик для буфера данных

    SoftwareSerial GPS(4,5); // Модуль GPS с именем GPS на пинах 4 - RX, 5 - TX Ардуино
    TinyGPS gps;

    unsigned long fix_age;
    long lat, lon;
    float LAT, LON; // Какие данные GPS будем вычислять
    void gpsdump(TinyGPS &gps);
    bool feedgps();
    void getGPS();

    /*void SIM900power() // Функция программного включения GSM модуля
    {
    digitalWrite(9, HIGH); // На 9 пине программное включение GSM
    delay(1000);
    Sim900_Inti();
    }*/


    void setup()
    {
    GSM.begin(19200); // Скорость работы модуля GSM
    GPS.begin(9600); // Скорость работы модуля GPS
    Serial.begin(19200); // Скорость работы последовательного порта
    delay(500);
    Sim900_Inti();
    }

    void loop()
    {
    GSM.listen();
    if (GSM.available())
    {
    while(GSM.available())
    {
    buffer[count++]=GSM.read();
    if(count == 64)break;
    }

    Serial.write(buffer,count);
    Cmd_Read_Act(); // вызываем функцию проверки пароля
    clearBufferArray(); // вызываем функцию очистки буфера
    count = 0;
    }

    if (Serial.available())
    GSM.println(Serial.read());

    }
    void clearBufferArray() // функция очистки буфера
    {

    for (int i=0; i<count;i++)
    { buffer[i]=NULL;}

    }

    void Sim900_Inti(void)
    {
    GSM.println("AT+CLIP=1");  // Включаем АОН
    Serial.println("AT+CLIP=1");
    delay(500);
    GSM.println("AT+CMGF=1"); // Устанавливаем модуль GSM в режим СМС
    Serial.println("AT+CMGF=1");
    delay(500);
    GSM.println("AT+CNMI=2,2");
    Serial.println("AT CMGF=1");
    delay(500);
    GSM.println("AT+CSCS=\"GSM\"");  // Режим кодировки текста
    Serial.println("AT+CSCS=\"GSM\"");
    delay(500);
    }

    void Cmd_Read_Act(void) // Функция чтения СМС
    char buffer2[64];
    for (int i=0; i<count;i++)
    { buffer2[i]=char(buffer[i]);}
    if (strstr(buffer2,"1234")) // Сравниваем пароль в программе с паролем в СМС, вместо 1234 можете вбить свой
    {

    Serial.println("Password Authenticated.");
    Serial.println("Sending reply SMS. ");
    SendTextMessage();

    }

    }

    void SendTextMessage()
    {
    GSM.print("AT+CMGF=1\r"); // Устанавливаем модуль GSM в режим СМС
    delay(100);
    GSM.println("AT+CMGS=\"+7ХХХХХХХХХХ\"");// Разрешенный номер
    delay(100);
    GSM.println("Calculates position!");// Содержание первой СМС
    delay(100);
    GSM.println((char)26);
    delay(100);
    GSM.println();
    delay(5000);
    int counter=0;
    GPS.listen();
    for (;;)

    {
    long lat, lon;
    unsigned long fix_age, time, date, speed, course;
    unsigned long chars;
    unsigned short sentences, failed_checksum;
    long Latitude, Longitude;
    // retrieves /- lat/long in 100000ths of a degree
    gps.get_position(&lat, &lon, &fix_age);

    getGPS();
    Serial.print("Latitude : ");
    Serial.print(LAT/1000000,7);
    Serial.print(" :: Longitude : ");
    Serial.println(LON/1000000,7);

    /*if (LAT == 0 && LON == 0)

    {
    continue;
    }
    counter ;
    if (counter<30)
    {
    continue;
    }
    */


    GSM.print("AT+CMGF=1\r"); // Устанавливаем модуль GSM в режим СМС
    delay(100);
    GSM.println("AT+CMGS=\"+7ХХХХХХХХХХ\"");// Разрешенный номер
    delay(100);
    GSM.print("maps.google.com/maps?q="); // Ссылка на карты Google
    //GSM.print("Latitude : ");
    GSM.print(LAT/1000000,7);
    GSM.print("+");
    //GSM.print(" :: Longitude : ");
    GSM.println(LON/1000000,7);//the content of the message
    delay(100);
    GSM.println((char)26);//the ASCII code of the ctrl z is 26
    delay(5000);
    GSM.println();
    counter=0;
    break;
    }

    }

    void getGPS()
    {
    bool newdata = false;
    unsigned long start = millis();
    while (millis() - start < 1000)
    {
    if (feedgps ())
    {
    newdata = true;
    }
    }
    if (newdata)
    {
    gpsdump(gps);
    }

    }

    bool feedgps()
    {
    while (GPS.available())
    {
    if (gps.encode(GPS.read()))
    return true;
    }return 0;

    }

    void gpsdump(TinyGPS &gps)
    {
    gps.get_position(&lat, &lon);
    LAT = lat;
    LON = lon;
    {
    feedgps();
    }

    }
     
  8. DrProg

    DrProg Вечный нерд

    В ветку СМС тоже закиньте. Или хотя бы ссылку.
     
  9. Vladis_a

    Vladis_a Гик

    Все, на сегодня крыша уехала в дальние края..........
    Соединил 2 скетча, откомпилировалось без ошибок. НО!!! Работает как-то странно.
    Сама сигнализация проделывает 2 первых цикла и останавливается (в Монитор больше ничего не выдает).
    Как только позвонишь на модуль Neoway M590 (или отправишь смс), видно, что сигнализация считывает свое положение, а потом опять останавливается.
     
  10. Ромаха

    Ромаха Нуб

    А можно как нибудь сделать чтобы каждый час модуль отправлял смс?
     
  11. Vladis_a

    Vladis_a Гик

    Я думаю, можно. Но моих познаний на это не хватит. :) Я новичок. Может быть более опытные товарищи что-то подскажут.
     
  12. DrProg

    DrProg Вечный нерд

    Можно. Надежнее всего по RTC.
     
  13. Vladis_a

    Vladis_a Гик

    Все, мои познания кончились! :) Добрые люди, помогайте.
    Скетч работает странно. Запускаю, сигнализация проходит 2 цикла проверки и останавливается. Если после остановки позвонить или отправить смс на модуль, то вижу, что акселерометр считывает свои координаты. Как только звонок прекращен, опять останавливается. СМС с координатами присылает, а вот в случае отклонения на мой номер не звонит (видимо, из-за того, что акселерометр не отслеживает изменения положения).
    Код (C++):
    #include <SoftwareSerial.h> // Подключаем библиотеку SoftwareSerial
    #include <string.h>
    #include <TinyGPS.h> // Подключаем библиотеку для GPS

    SoftwareSerial GSM(2,3); // Модуль GSM с именем GSM на пинах 2 - RX, 3 - TX Ардуино

    byte buffer[128]; // Размер буфера для данных. Обратите внимание на размер! Необходимо править библиотеку SoftwareSerial.h
    int count=0; // Счетчик для буфера данных

    SoftwareSerial GPS(4,5); // Модуль GPS с именем GPS на пинах 4 - RX, 5 - TX Ардуино
    TinyGPS gps;

    unsigned long fix_age;
    long lat, lon;
    float LAT, LON; // Какие данные GPS будем вычислять
    void gpsdump(TinyGPS &gps);
    bool feedgps();
    void getGPS();

    #include <ADXL335.h>
    int x; // выходная переменная по оси x
    int y; // выходная переменная по оси y
    int z; // выходная переменная по оси z
    int changelvl;
    int lastx;
    int lasty;
    int lastz;
    int ledPin = 7; // плюс сирены пин 7
    //int powerPinSenser = 10; // питание акселерометра пин 10
    int powerPinPot = 6; // питание потенциометра пин 6
    int Pot = A2; // средний контакт потенциометра пин А2
    int n; // граница срабатывания
    int defaultn;



    void setup()
    {
    GSM.begin(19200); // Скорость работы модуля GSM
    GPS.begin(9600); // Скорость работы модуля GPS
    Serial.begin(19200); // Скорость работы последовательного порта
    delay(500);
    Sim900_Inti();

    pinMode(ledPin, OUTPUT); // устанавливаем вывод 11 для сирены как выход
    pinMode(powerPinPot, OUTPUT); // устанавливаем вывод потенциометра 9 как выход
    pinMode(Pot, INPUT); // устанавливаем вывод среднего контакта потенциометра А2 как вход

    delay(30);
    x = analogRead(5); // считываем вход A5
    y = analogRead(4); // считываем вход A4
    z = analogRead(3); // считываем вход A3

    defaultn = 2; // число срабатываний-циклов
    n = defaultn;
    delay(6000); // задержка после включения

    }

    void loop()
    {
    GSM.listen();
    if (GSM.available())
    {
    while(GSM.available())
    {
    buffer[count++]=GSM.read();
    if(count == 64)break;
    }
    Serial.write(buffer,count);
    Alarm(); // Вызываем функцию сигнализации
    Cmd_Read_Act(); // вызываем функцию проверки пароля
    clearBufferArray(); // вызываем функцию очистки буфера
    count = 0;

    }

    if (Serial.available())
    GSM.println(Serial.read());

    }
    void clearBufferArray() // функция очистки буфера
    {

    for (int i=0; i<count;i++)
    { buffer[i]=NULL;}

    }

    void Cmd_Read_Act(void) // Функция проверки пароля
    {
    char buffer2[64];
    for (int i=0; i<count;i++)
    { buffer2[i]=char(buffer[i]);}
    if (strstr(buffer2,"1234")) // Сравниваем пароль в программе с паролем в СМС
    {

    Serial.println("Password Authenticated.");
    Serial.println("Sending reply SMS. ");
    SendTextMessage(); // Если пароль совпал, вызываем функцию отправки СМС

    }

    }

    void SendTextMessage() // Функция отправки СМС
    {
    GSM.print("AT+CMGF=1\r"); // Устанавливаем модуль GSM в режим СМС
    delay(100);
    GSM.println("AT+CMGS=\"+7988ХХХХХХХ\"");// Разрешенный номер
    delay(100);
    GSM.println("Calculates position!");// Содержание первой СМС
    delay(100);
    GSM.println((char)26);
    delay(100);
    GSM.println();
    delay(5000);
    int counter=0;
    GPS.listen();
    for (;;)

    {
    long lat, lon;
    unsigned long fix_age, time, date, speed, course;
    unsigned long chars;
    unsigned short sentences, failed_checksum;
    long Latitude, Longitude;
    gps.get_position(&lat, &lon, &fix_age);

    getGPS();
    Serial.print("Latitude : ");
    Serial.print(LAT/1000000,7);
    Serial.print(" :: Longitude : ");
    Serial.println(LON/1000000,7);

    GSM.print("AT+CMGF=1\r"); // Устанавливаем модуль GSM в режим СМС
    delay(100);
    GSM.println("AT+CMGS=\"+7988ХХХХХХХ\"");// Разрешенный номер
    delay(100);
    GSM.print("maps.google.com/maps?q="); // Ссылка на карты Google
    //GSM.print("Latitude : ");
    GSM.print(LAT/1000000,7);
    GSM.print("+");
    //GSM.print(" :: Longitude : ");
    GSM.println(LON/1000000,7);//the content of the message
    delay(100);
    GSM.println((char)26);//the ASCII code of the ctrl z is 26
    delay(5000);
    GSM.println();
    counter=0;
    break;
    }

    }

    void getGPS()
    {
    bool newdata = false;
    unsigned long start = millis();
    while (millis() - start < 1000)
    {
    if (feedgps ())
    {
    newdata = true;
    }
    }
    if (newdata)
    {
    gpsdump(gps);
    }

    }

    bool feedgps()
    {
    while (GPS.available())
    {
    if (gps.encode(GPS.read()))
    return true;
    }return 0;

    }

    void gpsdump(TinyGPS &gps)
    {
    gps.get_position(&lat, &lon);
    LAT = lat;
    LON = lon;
    {
    feedgps();
    }
    }
    void Alarm() // Функция сигнализации
    {

      if (GSM.available())
      Serial.write(GSM.read());
      if (Serial.available())
      GSM.write(Serial.read());
      digitalWrite(powerPinPot, HIGH);
      delay(3);

      lastx = x;
      lasty = y;
      lastz = z;

      x = analogRead(5); // считываем вход A5
      y = analogRead(4); // считываем вход A4
      z = analogRead(3); // считываем вход A3

      changelvl = map(analogRead(Pot),0,1023,20,2); // значения min/max для потенциометра

      digitalWrite(powerPinPot, LOW);

      Serial.print("lvl = "); // выводим значение по x
      Serial.println(changelvl);

      Serial.print("X = "); // выводим значение по x
      Serial.println(x);
      Serial.print("Y = "); // выводим значение по y
      Serial.println(y);
      Serial.print("Z = "); // выводим значение по z
      Serial.println(z);

      Serial.print("dX = ");
      Serial.println(abs(x - lastx));
      Serial.print("dY = ");
      Serial.println(abs(y - lasty));
      Serial.print("dZ = ");
      Serial.println(abs(z - lastz));

      if (changelvl < abs(x - lastx) || changelvl < abs(y - lasty) || changelvl < abs(z - lastz) ){
        if (n > 0 ){
          n = n -1;
        }
        else{
        digitalWrite(ledPin, HIGH);
        delay(10000); // время работы сирены при срабатывании
        digitalWrite(ledPin, LOW);
        delay(30);
        GSM.println("ATD+7988ХХХХХХХ;");/// звоним по указанному номеру
        delay(1000);
        if (GSM.find("OK")) Serial.println("ATD+OK!"); /// выводим в порт информацию об успешном звонке

        lastx = x;
        lasty = y;
        lastz = z;

        x = analogRead(5); // считываем вход A5
        y = analogRead(4); // считываем вход A4
        z = analogRead(3); // считываем вход A3
       
        }
      }
      else{
        n = defaultn;
      }
      delay(500);
    }
     
     
    Последнее редактирование: 22 фев 2016
  14. dwk26111974

    dwk26111974 Гик

    Вечер добрый. Решил скомпилироать Ваш последний код - выдал ошибку...
    Библиотеку TinyGPS.h подключил.

    C:\Users\Ариночка\Documents\Arduino\GPS_trekker_motov_2\GPS_trekker_motov_2.ino:20:21: fatal error: ADXL335.h: No such file or directory
    exit status 1
    Ошибка компиляции.

    Библиотеку TinyGPS.h подключил.
    #include <string.h> - это тоже библиотека? посмотрел в нете ничего не понял)))
     
  15. Vladis_a

    Vladis_a Гик

    Вы, наверное, скачали скетч, где я объединял сигнализацию и трекер. Судя по тому, что ошибку выдало именно про библиотеку акселерометра. Скачайте из сообщения 27, там только трекер. Будут вопросы - спрашивайте. Код рабочий, проверял неоднократно. Только номер телефона и пароль изменить не забудьте.
     
  16. dwk26111974

    dwk26111974 Гик

    Загрузил указанный Вами код (27 сообщение), при компеляции выдал ошибку:
    C:\Users\Ариночка\Documents\Arduino\GPS_trekker_moto_27msn\GPS_trekker_moto_27msn.ino: In function 'void loop()':

    GPS_trekker_moto_27msn:48: error: 'Cmd_Read_Act' was not declared in this scope

    C:\Users\Ариночка\Documents\Arduino\GPS_trekker_moto_27msn\GPS_trekker_moto_27msn.ino: In function 'void clearBufferArray()':

    C:\Users\Ариночка\Documents\Arduino\GPS_trekker_moto_27msn\GPS_trekker_moto_27msn.ino:61:12: warning: converting to non-pointer type 'byte {aka unsigned char}' from NULL [-Wconversion-null]

    C:\Users\Ариночка\Documents\Arduino\GPS_trekker_moto_27msn\GPS_trekker_moto_27msn.ino: At global scope:

    GPS_trekker_moto_27msn:82: error: expected initializer before 'char'

    GPS_trekker_moto_27msn:83: error: expected unqualified-id before 'for'

    GPS_trekker_moto_27msn:83: error: 'i' does not name a type

    GPS_trekker_moto_27msn:83: error: 'i' does not name a type

    GPS_trekker_moto_27msn:85: error: expected unqualified-id before 'if'

    GPS_trekker_moto_27msn:94: error: expected declaration before '}' token

    Несколько библиотек найдено для "TinyGPS.h"
    Используется: C:\Users\Ариночка\Documents\Arduino\libraries\TinyGPS-master
    Не используется: C:\Users\Ариночка\Documents\Arduino\libraries\TinyGPS-13
    exit status 1
    'Cmd_Read_Act' was not declared in this scope
    Что не так?
     
  17. Vladis_a

    Vladis_a Гик

    Вечером буду дома, посмотрю. А пока оставьте только одну библиотеку Tiny, ту, которая без master. И еще - Вы библиотеку SoftwareSerial отредатировали? В скетче есть про это. Ну и на крайний случай - я компилировал в 1.6.7.
    Если хотите, можно сделать еще проще - в личку Ваш e-mail, пришлю уже скомпилированное.
     
    Последнее редактирование: 18 мар 2016
  18. dwk26111974

    dwk26111974 Гик

    Отлично! Вот моя личка - dwk26111974@gmail.com
    Я также компилирую в 1.6.7
    Про SoftwareSerial - редактирование-запись в последнем скетче видел, но не совсем понял,что требуется)))
     
  19. Vladis_a

    Vladis_a Гик

    Где-то через час пришлю. И заодно правленную библиотеку.
     
  20. Vladis_a

    Vladis_a Гик

    Отправил.