ардуино и андроид связь через GPRS с модулем M590e

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

Здраствствуйте ищу помошника, наставника, и кому это все интересно, будем разбиратся вместе или если вы профи и у вас есть время повозится со мной то я буду очень рад! есть проект GSM сигнализации с автозапуском на ардуино, используется там модуль gsm М590е, все работает отлично! от звонка запускает авто, с проверками скорости и т.д. плюс туда подключил брелок от сигнализации, который ставит на охрану автомобиль, снимает с охраны, и открывает багажник. уже портотип стоит в авто и катается около 2-ух месяцев, глюки некоторые постепенно убираются и добавляется функционал, щас стоит вопрос создания отдельного куска кода на соединение и управление всем этим (для меня "чудом") через интернет, приложение на смартфоне написать смогу(конечно пользуясь примерами) вопрос в том что не знаю как создать сервер для связи приложения и автомобиля, как реализовать связь с помощью GET запросов. 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

Перечитал много информации по этому поводу, и нашел проблему всех людей. что бы устройство всегда работало и можно было им управлять постоянно, оно отправляет слишком много запросов на сервер, тем самым съедая много трафика, выход из этого придумал что бы ардуино начала соединятся с интернетом надо сделать звонок с телефона, реализуется звонок программно из приложения на андроид, т.е. при запуске приложения, сначала идет звонок на ардуиноардуиносвязывается с сервером и посылает на него какую-то команду, например connect_OK вместе с ним посылается состояние авто, т.е. двери закрыты, тревога в норме, двигатель заглушен, тогда приложение в телефоне становится активным и все данные уже проходят через интернет, в приложении активные кнопки, с которых можно управлять автосигнализацией, после всего этого можно закрыть приложение, посылая на сервер команду отсоединить gprs модуль от интернета, и сигнализации переходит на режим звонок, т.е. по любой причине начинает звонить на телефон. и остается либо бежать к авто либо зайти в приложение и посмотреть что с ней, либо отправить допустим смс с командой "status"  и она отсылает ответное смс с состоянием авто. 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

что совсем нет никого кто мог помочь? или я что-то не правильно описал

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Все правильно.

только если не можешь сделать сам- иди в тему насчет разработки за оплату. Если можешь сам - то делай. На конкретные проблемы с конкретным устройством возможно откликнутся. хотя не факт. Но опять эе это касается конкретных внятно описанных проблем с публикацией алгоритма, кода и железа.

А вопрос "давайте вы за меня сделаете" нужно задавать только в теме "платные услуги"....

А с учебниками, даташитами и прочей документацией сейчас по сравнению с прошлым веком просто рай :)

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

Никто не говорит что бы мне написали всю программу за меня, я лишь прошу помощи в создании проекта, т.к. некоторые вещи не могу понять, посто что бы подтолкнули или кому эта тема интересна что-то бы вместе с ним разбираться, код могу выложить без проблем, вопрос нужнно ли это кому.

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Тут еще труднее - потому что для создания проекта нужен не программер а аналитик - постановщик задачи!

Приведу пример.

я сделал реквизит для игры в страйкбол.

1. я разработал ТЗ на реквизит - для себя, неформально - но сделал. ТЗ включает функционал.

2. я прорисовал алгоритм действий реквизита.

3. я разбил алгоритм на модули.

4. я отработал на макете отдельные блоки алгоритма.

5. я собрал на макете прообраз

6. я собрал 6 действующих образцов.

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

сборку всего в кучу делал сам.

чего желаю.

Amid
Offline
Зарегистрирован: 03.12.2016

Выложи код, пожалуйста! 
Мне интересно.

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015
// подключение библиотек
#include <TM1637.h>// индикатор 4 секции 7сегментов
#include <OneWire.h>// считка ТМ ключей 
#include <EEPROM.h>// работа с паматью

// назначение пинов
#define TMread 2//TM key pin
#define LEDclk 3//LED 1637 pin CLK
#define LEDdio 4//LED 1637 pin DIO

#define SoundPin 9//Звук в динамик

#define pinKBx1 6 // 1 столбец кнопок
#define pinKBx2 7 // 2 столбец кнопок
#define pinKBx3 8 // 3 столбец кнопок
#define pinKBy1 14 // 1 строка кнопок
#define pinKBy2 15 // 2 строка кнопок
#define pinKBy3 16 // 3 строка кнопок
#define pinKBy4 17 // 4 строка кнопок
//   x1  x2  x3
//y1  1   2   3
//y2  4   5   6
//y3  7   8   9
//y4  A   B   C

#define Battary 21 // измерение напряги аккма
//long int KBatt=1453; // Коэффициент для измерения напряги аккума 1
//long int KBatt=1442; // Коэффициент для измерения напряги аккума 2
//long int KBatt=1428; // Коэффициент для измерения напряги аккума 3
//long int KBatt=1447; // Коэффициент для измерения напряги аккума 4
//long int KBatt=1425; // Коэффициент для измерения напряги аккума 5
//long int KBatt=1000; // Коэффициент для измерения напряги аккума 6
long int KBatt=1000; // Коэффициент для измерения напряги теста

const long int TimeXX=60000;//делитель миллисекунд
int  TimeCH=1; //минуты для ЧЕМОДАНА
byte Seg_ON=0; //двоеточие на индикаторе
byte TMbuffer[8];// буфер приема
byte TMlistKEY[20][8];// 5 ключей админских и 15 игровых ключей
byte PrevCMD=0;// Предыдущая команда
byte NextCMD=0;// следующая команда
byte ChCMD=0;// буфер считывания команды
byte SetMode=0;// режим - 0 не установлен, 1 кнопки, 2 ключи
byte SetTimerMode=1;// режим - 0 таймер выключен, 1 таймер включен
byte AdminTM=0;// 
unsigned long buffMillis=0;// буфер для расчетов
unsigned long PrevMillis=0;// предыдущее время в миилсах
unsigned long NextMillis=0;// следующее время в миилсах
unsigned long CMDmillis[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};// следующее время в миилсах

byte buffTM[8];// буфер приема ТМ-ключей

byte ChemodanKey[4]={0,0,0,0};

TM1637 tm1637(LEDclk,LEDdio);
OneWire ds(TMread); // выход считывателя на пин TMread

void setup() // стартовая инициализация
{
                      //Serial.begin(9600); //для отладки
                      //Serial.println("Start..."); //для отладки

    //SirenaOUT();
    /* Инициализация структур */    
    pinMode(pinKBx1, INPUT);           // назначить порт ввода X1
    digitalWrite(pinKBx1, HIGH);       // включить подтягивающий резистор
    pinMode(pinKBx2, INPUT);           // назначить порт ввода X2
    digitalWrite(pinKBx2, HIGH);       // включить подтягивающий резистор
    pinMode(pinKBx3, INPUT);           // назначить порт ввода X3
    digitalWrite(pinKBx3, HIGH);       // включить подтягивающий резистор
    pinMode(pinKBy1, OUTPUT);          // назначить порт вывода Y1
    pinMode(pinKBy2, OUTPUT);          // назначить порт вывода Y2
    pinMode(pinKBy3, OUTPUT);          // назначить порт вывода Y3
    pinMode(pinKBy4, OUTPUT);          // назначить порт вывода Y4

    pinMode(Battary, INPUT);          // назначить порт вывода A7
    
    tm1637.init();
    tm1637.set(5);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
    tm1637.display(0,0); //в левом сегменте 0 остальные потушены

    // Читаем с хранилища ключи - 20 шт 5 админских 0-4 и 15 игровых 5-20
    for(byte TM1  = 0; TM1 < 20; TM1++)
    {
      for(byte TM2 = 0; TM2 < 8; TM2++)
      {
          TMlistKEY[TM1][TM2]=EEPROM.read(TM1*8+TM2);
      }
    }
}

void loop() //Основной цикл
{
    //StartBattary();
    
    PrevMillis=millis();//запоминаем первый миллс
    while(1){
      byte buff=0;
      if (SetMode==3)//если режим ЧЕМОДАН
      {
        StartMODE3();
      }
      if (SetMode>0&&NextCMD>0&&PrevCMD>0)//если режим установлен в 1 или 2. Если 0 - пропускаем
      {
        buffMillis=CMDmillis[NextCMD];//вносим в буфер 
        NextMillis=millis();//читаем миллсы
        if(SetTimerMode)
        {
          CMDmillis[NextCMD]+=NextMillis-PrevMillis;//добавляем миллсы в счетчик команды
        }

        PrevMillis=NextMillis;//запоминаем время
        if ((buffMillis/TimeXX!=CMDmillis[NextCMD]/TimeXX)||(AdminTM))//если число минут предыдущей записи отличается от минут текущих - выводим на экран
        {
          buffMillis=CMDmillis[NextCMD]/TimeXX;
          TimeDisplay(NextCMD,buffMillis);
          AdminTM=0;
        }
      }    
      // чтение ТМ-ключа
     if(ds.reset()) // если обнаружено устройттво
     {
        ds.write(0x33); // отправляем команду "считать ROM" 
        delay(10); // на всякий случай ждем
        for(int i=0;i<8;i++)
        {
           buffTM[i] = ds.read(); // считываем ключ
        }
        //проверяем ключ админа
        buff=ScanTM();//проверяем ключ в базе
        if(buff)
        {
          if(buff<6)  {AdminMode();}//если админский ключ идем в режим администрирования
          if(buff>5)//если есть номер команды
          {
            if (!SetMode||ChCMD)//режим не установлен - режим ключей 2
            {
              SetMode=2;
              PrevMillis=millis();
              ChCMD=0;
            }
            if(SetMode==2)//если режим ключей 2 запоминаем номер ключа команды
            {
              NextCMD=buff-5;
            }
          }
        }
     }

      // Чтение кнопок
      delay(500);
      buff=KBDread();//проверяем нажатие кнопок
      if (buff)//если нажата любая кнопка
      {
        if (!SetMode||ChCMD)//режим не установлен - режим кнопок 1
        {
          SetMode=1;
          PrevMillis=millis();
          ChCMD=0;
        }
        if(SetMode==1)//если режим кнопок 1 запоминаем номер кнопки - команды
        {
          NextCMD=buff;
        }
      }
      if (NextCMD!=PrevCMD)//если команда изменилась
      {
        PrevCMD=NextCMD;//запоминаем номер новой команды
        buffMillis=CMDmillis[NextCMD]/TimeXX;
        TimeDisplay(NextCMD,buffMillis);
      }
    delay(200);
    }
}

byte KBDread()//опрос клавиатуры
{
      byte KBread=0;
      byte KBx;
      byte KBy;
      for (KBx=0;KBx<3;KBx++)//цикл по столбцам
      {
        for (KBy=0;KBy<4;KBy++)//цикл по строкам
        {
          digitalWrite(pinKBy1+KBy, LOW);// 0 на столбец
          if (!digitalRead(pinKBx1+KBx))//читаем строку
          {
            KBread=KBy*3+KBx+1;//если 0 определяем кнопку
          }
          digitalWrite(pinKBy1+KBy, HIGH);//1 на столбец
        }
      }
    return KBread;//возвращаем 0 или номер кнопки 1-12
}

void AdminMode(void)
// 1 - чтение ключей из базы, 12 - выход
// 2 - стоп таймера
// 3 - старт таймера если он был включен
// 4 - управление ключами команд, 5 - запись и сл номер, 10 - стирание, 12 - выход, 2с задержка на переключениеключа
// 5 - запись ключа и сл номер
// 6 - запись ключей админов, 5 - запись и сл номер, 10 - стиранние, 12 - выход, 2с задержка на переключениеключа
// 7 - чтение времени команд, 12 - выход, 7 - следующая, 2с задержка на переключениеключа
// 8 - проверка звука - сирена
// 9 - Тест аккума, выход 12
// 10 (А) - режим КНОПКИ
// 11 (В) - режим КЛЮЧИ
// 12 (С) - режим ЧЕМОДАН/ВЫХОД
{
    byte KeySave=0;
    byte numTM=0;
    byte buff=0;
    byte buffZ=0;
    byte buff1=0;
    byte Rkbd=0;
    AdminTM=1;
    tm1637.clearDisplay();
    tm1637.display(0,10); //выводим на дисплей A        
    do{ 
      buff=KBDread();  
      if (buff){tm1637.display(1,buff);}
      delay(200);
      switch(buff){
        case 1://чтение ключей по командам, кнопка 12 выход
          KeySave=1;
          buff1=1;
          do
          {
            if(ds.reset()) // если обнаружено устройттво
            {
              ds.write(0x33); // отправляем команду "считать ROM" 
              delay(10); // на всякий случай ждем
              for(int i=0;i<8;i++)
              {
                buffTM[i] = ds.read(); // считываем ключ
              }
            }
            buffZ=ScanTM();
            if(buffZ>5){tm1637.display(2,12);tm1637.display(3,buffZ-5);}//пользовательский ключ, выводим С*
            if(buffZ>0&&buffZ<6){tm1637.display(2,10);tm1637.display(3,buffZ);}//админский ключ, выводим А*
            if(!buffZ){tm1637.display(2,0);tm1637.display(3,0);}//админский ключ, выводим А*
            delay(1000);
            if(KBDread()==12){buff1=0;}
          }while(buff1);
          KeySave=0;
        break;
        case 2://стоп таймера
          SetTimerMode=0;
        break;
        case 3://старт таймера
          SetTimerMode=1;
        break;
        case 4://запись/стирание ключей команд, 5- запись, 10-стирание, 12 - выход
          KeySave=1;
          numTM=6;
          Rkbd=0;
          buffTM[0]=255;
          do{
            buffZ=0;
            tm1637.display(2,0);
            tm1637.display(3,numTM-5);
            if(ds.reset())// если обнаружено устройттво
            { 
              ds.write(0x33); // отправляем команду "считать ROM" 
              delay(10); // на всякий случай ждем
              for(int i=0;i<8;i++)
              {
                buffTM[i] = ds.read(); // считываем ключ
              }
            }else
            {
              for(int i=0;i<8;i++)
              {
                buffTM[i] = 255; // стираем прошлый ключ в памяти
              }
              tm1637.display(2,0);tm1637.display(3,0);
             }
            buffZ=ScanTM();
            if(buffZ>5){tm1637.display(2,12);tm1637.display(3,buffZ-5);}//пользовательский ключ, выводим С*
            if(buffZ>0&&buffZ<6){tm1637.display(2,10);tm1637.display(3,buffZ);}//админский ключ, выводим А*
            Rkbd=KBDread();
            if(!buffZ)//если ключ не найден в базе
            {
              tm1637.clearDisplay();
              tm1637.display(0,10);
              tm1637.display(1,4);
              tm1637.display(3,numTM-5);
              if(Rkbd==5)//если кнопка 5 записываем ключ
              {
                if(buffTM[0]!=255)
                {
                  for(int i = 0; i < 8; i++)
                  {
                    EEPROM.write((numTM-1)*8+i,buffTM[i]);
                    TMlistKEY[numTM-1][i]=buffTM[i];
                  }
                  buffTM[0]=255;
                  numTM++;
                }else
                {
                  numTM++;
                }
                tm1637.display(2,5);
                tm1637.display(3,numTM-5);//пользовательский ключ, выводим S*
              }
            }
            if(Rkbd==10)//если нажата кнопка 10
            {
              EEPROM.write((numTM-1)*8,255);//стираем ключ
              TMlistKEY[numTM-1][0]=255;
              tm1637.display(2,12);
              tm1637.display(3,numTM-5);//выводим подтверждение стирания ключа С*
            }
            delay(1000);
          if(Rkbd==12){numTM=99;}//если нажата кнопка 12 выход
          }while(numTM<21);
          KeySave=0;
        break;
        // 5 - подтверждение записи и сл номер, 10 - стиранпие записи 12 выход
        case 6://запись/стирание ключей админа, 5 - запись и сл номер, 10 - стирание 12 выход
          KeySave=1;
          numTM=1;
          Rkbd=0;

          do{
            buffZ=0;
            tm1637.display(2,0);
            tm1637.display(3,numTM-1);
            if(ds.reset())// если обнаружено устройттво
            { 
              ds.write(0x33); // отправляем команду "считать ROM" 
              delay(10); // на всякий случай ждем
              for(int i=0;i<8;i++)
              {
                buffTM[i] = ds.read(); // считываем ключ
              }
            }else
            {
              for(int i=0;i<8;i++)
              {
                buffTM[i] = 255; //стираем прошлый  ключ в памяти
              }
              tm1637.display(2,0);tm1637.display(3,0);
             }
            buffZ=ScanTM();
            if(buffZ>5){tm1637.display(2,12);tm1637.display(3,buffZ-5);}//пользовательский ключ, выводим С*
            if(buffZ>0&&buffZ<6){tm1637.display(2,10);tm1637.display(3,buffZ);}//админский ключ, выводим А*
            Rkbd=KBDread();
            if(!buffZ)//если ключ не найден в базе
            {
              tm1637.clearDisplay();
              tm1637.display(0,10);
              tm1637.display(1,6);
              tm1637.display(3,numTM);
              if(Rkbd==5)//если кнопка 5 записываем ключ
              {
                if (buffTM[0]!=255)
                {
                  for(int i = 0; i < 8; i++)
                  {
                    EEPROM.write((numTM-1)*8+i,buffTM[i]);
                    TMlistKEY[numTM-1][i]=buffTM[i];
                  }
                  buffTM[0]=255;
                  numTM++;
                }else
                {
                  numTM++;
                }
                tm1637.display(2,5);
                tm1637.display(3,numTM);//flvbycrbq ключ, выводим S*
              }
            }
            if(Rkbd==10&&numTM>1)//если нажата кнопка 10 и ключ более 1
            {
              EEPROM.write((numTM-1)*8,255);//стираем ключ
              TMlistKEY[numTM-1][0]=255;
              tm1637.display(2,10);
              tm1637.display(3,numTM);//выводим подтверждение стирания ключа С*
            }
            delay(1000);
          if(Rkbd==12)
          {
            numTM=99;
          }//если нажата кнопка 12 выход
          }while(numTM<21);
          KeySave=0;
        break;
        case 7://чтение времени по командам 5 переключение команд 12 выход
          KeySave=1;
          numTM=1;
          Rkbd=0;
          buffMillis=CMDmillis[numTM]/TimeXX;
          TimeDisplay(numTM,buffMillis);          
          while(numTM<16)
          {
            Rkbd=KBDread();
            if(Rkbd==5)//если нажата кнопка 10 и ключ более 1
            {
              numTM++;
              buffMillis=CMDmillis[numTM]/TimeXX;
              TimeDisplay(numTM,buffMillis);          
            }
            delay(1000);
            if(Rkbd==12)
            {
              numTM=99;
            }//если нажата кнопка 12 выход
          }
          KeySave=0;        
        break;
        case 8://проверка сирены
          SirenaOUT();
        break;
        case 9://Напряжение аккума, ввод коэффициента - выход 12
          while (KBDread()!=12)
          {
            StartBattary();
          }
        break;
        case 10://режим КНОПКИ
          SetMode=1;
          ChCMD=1;
          tm1637.display(2,5);
          tm1637.display(3,1);//S1 режим кнопок
        break;
        case 11://режим КЛЮЧИ
          SetMode=2;
          tm1637.display(2,5);
          tm1637.display(3,2);//S2 режим ключей
        break;
        case 12://Режим ЧЕМОДАН
          SetMode=3;
          tm1637.display(2,11);
          tm1637.display(3,3);//S3 режим ЧЕМОДАН
        break;
      }
      delay(200);
    }while(ds.reset()||KeySave);
    delay(200);
    tm1637.clearDisplay();
    tm1637.display(0,0);
    if(!NextCMD)
    {
      PrevMillis=millis();//запоминаем первый миллс
    }
}

void StartMODE3(void)// режим ЧЕМОДАН
{
//при старте выбираем время блокировки
//на экране bd (block delay) в инутах
//выбор на кнопках от 1 до 12 минут
//затем инициализация датчика случайных чисел SE
//генерируется 4 цифры кода, выводятся на экран на 2 сек
//если нажата неправильная цифра - блокировка на время bd минут и сирена
//если все цифры угаданы - звук и переход на новую игру
//если найден ключ ТМ - сбрасываем все включая звук, найденные ключи
//если с ключем ТМ наата любая кнопка - рестарт игры
  while(1)
  {
    byte EndGAME=0;
    byte i=1;
    byte j=0;
    byte buff=0;
    byte ChmNM=0;// цифра угадана
    byte numKey=0;// количество угаданных цифр
    byte ChemodanRead[4]={0,0,0,0};//буфер

    //инициализация параметров игры
    tm1637.clearDisplay();//на экран выводим bd
    tm1637.display(0,11);
    tm1637.display(1,13);
    buff=KBDread();
    do //ждем нажатие на кнопку
    {
      buff=KBDread();//читаем кнопки
      TimeCH=buff;//устанавливаем тайм-аут для ошибки набора мин
      tm1637.display(3,buff);// выводим число минут тайм-аута
    }while(!buff);//ждем нажатие на кнопку
    delay(2000);
    tm1637.clearDisplay();//на экран выводим 5Е
    tm1637.display(0,5);
    tm1637.display(1,14);
    while(!KBDread())//ждем нажатие на кнопку
    {
      randomSeed(millis());//инициализируем счетчик рандома
      delay(200);
    }
    ChemodanKey[0]=random(1,13);//из списка 1-12 первая цифра
    while(i<4)//набираем 4 цифры
    {
      buff=random(1,13);//из списка 1-12 следующая цифра
      ChmNM=1;
      for(j=0;j<i;j++)
      {
        if(ChemodanKey[j]==buff)//Если цифра повторяется
        {
          ChmNM=0;//сбрасываем счетчик - идем на повтор
        }
      }
      if (ChmNM)//если цифра новая - запоминаем, ищем следующую
      {
        ChemodanKey[i]=buff;
        i++;
      }
    }
    ChmNM=0;
    for (i=0;i<4;i++)
    {
      tm1637.display(i,ChemodanKey[i]);//выводим установленные цифры
                        //Serial.print(ChemodanKey[i],HEX); //для отладки
    }
                        //Serial.println(); //для отладки
    SirenaOUT();//мявкаем в динамик
    delay(2000);

    tm1637.clearDisplay();//стираем все
    tm1637.display(0,0);//на экран 0
    numKey=0;
    while(!EndGAME)//пока EndGAME==0 крутим цикл
    {
      if(ds.reset()) // если обнаружен ключ сбрасываем все в 0
      {
            for(i=0;i<=numKey;i++)
            {
              ChemodanRead[i]=0;//сбросили хранилище угаданных ключей
            }
            ChmNM=0;//изменили статус на 0
            numKey=0;//число угаданных 0
            tm1637.clearDisplay();//стираем все
            tm1637.display(0,0);//на экран 0
            if (KBDread())//если нажата кнопка стартуем новую игру
            {
              EndGAME=1;
            }
      }
      buff=KBDread();//читаем клавиатуру
      if(buff)//если кнопка нажата
      {
        ChmNM=0;
        for(i=0;i<4;i++)// проверяем цифру
        {
          if(buff==ChemodanKey[i])//если цифра есть в коде
          {
            ChmNM=1;//изменили статус на 1
            ChemodanRead[numKey]=ChemodanKey[i];//запомнили угаданную цифру
            SirenaOUT();//мявкнули в динамик
            tm1637.display(numKey,ChemodanRead[numKey]);//вывели на экран угаданную цифру
          }
        }
        if(!ChmNM)//если не угадали
        {
            for(i=0;i<=numKey;i++)
            {
              ChemodanRead[i]=0;//сбросили хранилище угаданных ключей
            }
            ChmNM=0;//изменили статус на 0
            numKey=0;//число угаданных 0
            tm1637.clearDisplay();//стираем все
            for(i=0;i<4;i++)
            {
              tm1637.display(i,0);//на экран 0
            }
                        //Serial.println(" ERROR "); //для отладки
            PrevMillis=millis();//запоминаем первый миллс
            while(millis()-PrevMillis<TimeCH*TimeXX)//в течении ХХ минут ревем сиреной
            {
              SirenaOUT();//сирена
              delay(1000);
                        //Serial.println(" ERROR 1"); //для отладки

            if(ds.reset()) // если обнаружен ключ сбрасываем все в 0
            {
              for(i=0;i<=numKey;i++)
              {
                ChemodanRead[i]=0;//сбросили хранилище угаданных ключей
              }
              PrevMillis=TimeCH*TimeXX+millis();
              ChmNM=0;//изменили статус на 0
              numKey=0;//число угаданных 0
              tm1637.clearDisplay();//стираем все
              tm1637.display(0,0);//на экран 0
              if (KBDread())//если нажата кнопка стартуем новую игру
              {
                EndGAME=1;
              }
            }
          }
          tm1637.clearDisplay();//стираем все
          tm1637.display(0,0);//на экран 0
        }else
        {
          numKey++;//если угадали - следующий номер
          delay(1000);
        }
      }
      if(numKey>3)//если угадали все 4 - гимн
      {
        SirenaOUT();
        SirenaOUT();
        SirenaOUT();
        EndGAME=1;
      }
    }
  }
}
void TimeDisplay (byte Ncmd, unsigned long buffTime)//Вывод на дисплей - 1 цифра номер команды, 2-4 - число минут текущей команды
{
  tm1637.display(0,Ncmd); //выводим на дисплей 1 цифру - команда
  tm1637.display(1,buffTime/100);//выводим на дисплей 1 цифру - сотни минут
  tm1637.display(2,buffTime%100/10);//выводим на дисплей 1 цифру - десятки минут
  tm1637.display(3,buffTime%10);//выводим на дисплей 1 цифру - минуты
  if(buffTime>999)
  {
    Seg_ON=1;
  }else
  {
    Seg_ON=0;
  }
  tm1637.point(Seg_ON);//вкл двоеточие между сегментами если минут больше 999
}

byte ScanTM(void)//проверка ключей ТМ на наличие в хранилище
{
  byte buff2=0;
  byte buff1=1;
  for(int y=0;y<20;y++)
  {
    if(TMlistKEY[y][0]!=255)//Если 1й байт ключа FF - ячейка пустая, пропускаем
    {
      buff1=1;
      for(int i=0;i<8;i++)
      {
        if(buffTM[i]!=TMlistKEY[y][i]){buff1=0;}  // сравниваем ключ с базой
      }
      if (buff1){buff2=y+1;}
    }
  }
  return buff2; //Возвращаем номер ключа или 0 если не найден
}

void SoundSET(void)
{
/*********************************************************
    //вывод звука
    for (int thisNote = 0; thisNote < 8; thisNote++) 
    {
      // to calculate the note duration, take one second divided by the note type.
      //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
      int noteDuration = 1000 / noteDurations[thisNote];
      tone(SoundPin, melody[thisNote], noteDuration);
      // to distinguish the notes, set a minimum time between them.
      // the note's duration + 30% seems to work well:
      int pauseBetweenNotes = noteDuration * 1.30;
      delay(pauseBetweenNotes);
      // stop the tone playing:
      noTone(SoundPin);
    }
*********************************************************/
}

void SirenaOUT(void)
{
/*********************************************************/
  //Сирена
  byte Dlit = 17;
  int Niz = 500;
  int Verh = 3000;
  byte Shag = 70;
    for (int j = Niz;j<= Verh;j+=Shag)
    {
      tone(SoundPin,j, Dlit);    
      delay(Dlit);                   
    }
    for (int j = Verh;j>= Niz;j-=Shag)
    {
      tone(SoundPin,j, Dlit);    
      delay(Dlit);                   
    }
/***********************************************************/
}

void StartBattary(void)
{
    long int Batt0=analogRead(Battary);
    long int Batt=Batt0*KBatt/1000;
    tm1637.display(0,Batt/1000); //выводим на дисплей 1 цифру - десятки В
    tm1637.display(1,(Batt%1000)/100);//выводим на дисплей 2 цифру - единицы В
    tm1637.display(2,(Batt%100)/10);//выводим на дисплей 3 цифру - десятые В
    tm1637.display(3,Batt%10);//выводим на дисплей 4 цифру - сотые В  
    delay(500);
}

 

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Amid пишет:

Выложи код, пожалуйста! 
Мне интересно.

Без схемы неактульно.

Но закомментировал как мог - для себя любимого.

 

Amid
Offline
Зарегистрирован: 03.12.2016

а схема секретна? :)

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Схема не секретная, просто лень рисовать.

Если на словах:

- подключена считка ТМ-ключей (1 пин, второй на минус)

- подключен 4-секционный 7-сегментный индикатор 2 пина

- подключена клава 3*4, пины расписаны.

Вот собственно и вся перифеотия.

В режиме ключей при наличии ТМ-ключа игрока включается таймер команды.

В режме кнопок при нажатии на свою кнопку включается таймер команды

номер команды и время выводится на индикатор.

При наличии админского ключа переходит в режим меню. Можно прописать или считать ключи, посмтортеть время, установить режим и т.д.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

at0mix пишет:

Тут еще труднее - потому что для создания проекта нужен не программер а аналитик - постановщик задачи!

Приведу пример.

я сделал реквизит для игры в страйкбол.

1. я разработал ТЗ на реквизит - для себя, неформально - но сделал. ТЗ включает функционал.

2. я прорисовал алгоритм действий реквизита.

3. я разбил алгоритм на модули.

4. я отработал на макете отдельные блоки алгоритма.

5. я собрал на макете прообраз

6. я собрал 6 действующих образцов.

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

сборку всего в кучу делал сам.

чего желаю.

это хорошо, вы большой молодец!  я как бы сам тоже собрал устройство, кому интересно могу выложить, мне не жалко, задал вопрос тем кому это интересно позаниматся, кто в силу своей скупости или бедности не может позволить себе купить устройство за 15-25 т.р. которе по себестоимости выходит в 1500, нет так нет, да так да. моя программа работает и не глючит, но хотелось бы добавить простоты в виде приложения на андроиде. и может еще каких нибудь мыслей, не удорожая устройство. и все. дешево, красиво и функционально. 

DESArt
Offline
Зарегистрирован: 26.02.2017

d13lider пишет:

Здраствствуйте ищу помошника, наставника, и кому это все интересно, будем разбиратся вместе или если вы профи и у вас есть время повозится со мной то я буду очень рад! есть проект GSM сигнализации с автозапуском на ардуино, используется там модуль gsm М590е, все работает отлично! от звонка запускает авто, с проверками скорости и т.д. плюс туда подключил брелок от сигнализации, который ставит на охрану автомобиль, снимает с охраны, и открывает багажник. уже портотип стоит в авто и катается около 2-ух месяцев, глюки некоторые постепенно убираются и добавляется функционал, щас стоит вопрос создания отдельного куска кода на соединение и управление всем этим (для меня "чудом") через интернет, приложение на смартфоне написать смогу(конечно пользуясь примерами) вопрос в том что не знаю как создать сервер для связи приложения и автомобиля, как реализовать связь с помощью GET запросов. 

Напиши что нибудь думаю придумаем, я как раз доделал сигнаху для дома и офиса с оповещением по SMS с таким же модулем

arDubino
Offline
Зарегистрирован: 12.01.2017

обязательно напишет :))))

з.ы.

поначитаются всяких тем и ютубов насмотреться и делают всякую херню.

и главное одно понять не могут что машина а) стоит возле квартиры в 99% или у офиса в котором ты же сидишь.

и нафиг тратить трафик сотовый когда можно сделать тупо вайфай. а все остальное только в случае отсутствия в зоне доступа.

DESArt
Offline
Зарегистрирован: 26.02.2017

хахах, ну делают херню - это преувеличение, есть много интересных проектов))

По поводу WiFi можно, но бессмысленно... видимо Вы не прорабатывали этот вопрос (а если это так то зачем писать такие комментарии)

Машина может быть в гараже, я могу уехать на поезде в командировку машину оставить на стоянке, и до подъезда к городу за 10 минут завести авто... и т.д.

Если в Вашем городе все таки есть здания где этажность больше 3, думаю проблематично будет через WiFi управлять авто

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

по смс и звонку вообще проблемм нет, тут вопрос про интернет именно

 

DESArt
Offline
Зарегистрирован: 26.02.2017

Вот я тоже хотел разобраться с интернетом

belousovev
Offline
Зарегистрирован: 14.02.2017

d13lider пишет:

что совсем нет никого кто мог помочь? или я что-то не правильно описал

мне тоже это интересно. А что Вы переживаете за трафик? Сейчас пакетные тарифы всякие есть (у нас в Челябинске, например, на Tele2 тариф 500 Мб за 99 р/мес). У меня, правда, Sim900 каждые 4 минуты отправляет инфу на ftp сервер. За неделю тратится менее 10 Мб.

belousovev
Offline
Зарегистрирован: 14.02.2017

На какой машине стоит это устройство (что-то как-то боязно ставить на машину не сертифицированную приблуду)? Мне интересно тема приложение на android. Я поверхносто (сильно не углублялся) пробывал найти инфу как с android связаться с ftp и прочитать, например, какой-нибудь файл *.txt.

d13lider, можно поконкретнее, что именно интересует (про интернет)?

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

belousovev пишет:

мне тоже это интересно. А что Вы переживаете за трафик? Сейчас пакетные тарифы всякие есть (у нас в Челябинске, например, на Tele2 тариф 500 Мб за 99 р/мес). У меня, правда, Sim900 каждые 4 минуты отправляет инфу на ftp сервер. За неделю тратится менее 10 Мб.

просто опыта нет, а слышал что очень много трафика потребляет. поэтому и подумал что лучше сделать соединение по звонку из приложения. 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

belousovev пишет:

На какой машине стоит это устройство (что-то как-то боязно ставить на машину не сертифицированную приблуду)? Мне интересно тема приложение на android. Я поверхносто (сильно не углублялся) пробывал найти инфу как с android связаться с ftp и прочитать, например, какой-нибудь файл *.txt.

d13lider, можно поконкретнее, что именно интересует (про интернет)?

вопрос в тупик поставил))) ну интересует связь через интернет, хочу зажечь светодиод через интернет, что бы дуина была подключена через M590 а на андроиде было приложение, в котором нажал на кнопку, светодиод зажегся, и появилась табличка "Светодиод включен"

belousovev
Offline
Зарегистрирован: 14.02.2017

По поводу большого трафика: да ты отправил 10 байт (на обычном тарифе Tele2), через минуту оператор округлил до 1Мб, бац у тебя со счета 5 рублей сняли. Выгоднее подключать пакет с интернетом. Потому что если как ты хочешь сделать по звонку это тоже будет дорого.

belousovev
Offline
Зарегистрирован: 14.02.2017

то есть тебе надо вырезку части из скетча, которая отвечает за связь с интернетом?

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

belousovev пишет:

По поводу большого трафика: да ты отправил 10 байт (на обычном тарифе Tele2), через минуту оператор округлил до 1Мб, бац у тебя со счета 5 рублей сняли. Выгоднее подключать пакет с интернетом. Потому что если как ты хочешь сделать по звонку это тоже будет дорого.

вы не поняли, звонок из приложения пришел, дуина сбросила вызов, пошло подключение через интернет, подключилась в приложении написанно "Соеденено" и все управление пошло через интернет, приложение закрылось- послали команду на разъединение

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

belousovev пишет:

то есть тебе надо вырезку части из скетча, которая отвечает за связь с интернетом?

ну если грубо говоря да, но самому дойти охото до этого, лучше бы помогли объяснить как это все наладживается 

belousovev
Offline
Зарегистрирован: 14.02.2017

я может быть ошибаюсь, но по-моему, к М590е (и к SIM900) подключиться удаленно нельзя (как, например, к удаленному столу по VPN). По-моему, хоть как arduino и android будут общаться через промежуточный сервер (если я ошибаюсь, то исправьте меня, пожалуйста).

belousovev
Offline
Зарегистрирован: 14.02.2017
d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

belousovev пишет:

я может быть ошибаюсь, но по-моему, к М590е (и к SIM900) подключиться удаленно нельзя (как, например, к удаленному столу по VPN). По-моему, хоть как arduino и android будут общаться через промежуточный сервер (если я ошибаюсь, то исправьте меня, пожалуйста).

да все верно, надо через сервер. но если это все заработает, я даже готов снять сервер. и платить за него.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

там про SIM900 он дороже, хотелось бы M590 использовать, с SIM900 думаю таких проблемм нет, там можно произвести соединение через адрес http а на M590 только через IP

belousovev
Offline
Зарегистрирован: 14.02.2017

я снимаю ftp сервер за 13 р/месяц ))))

belousovev
Offline
Зарегистрирован: 14.02.2017

Вот это не понял!

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

ну допустим через GET запросы если общаться, то надо прописывать путь к файлу, допустим как будет выглядеть путь у SIM900 
>http://lider.ru/1.php

а у M590 будет так:

>265.278.894.24/1.php

так вот получается что прямой IP адрес для GET запроса не возможно получить от хостинга, не разрешают они так... а свой сервак постоянно держатиь включенным нерентаблельно. это вот я так щас думаю, пока нашел только такой путь общения M590 с интернетом... может я что то не понял?

belousovev
Offline
Зарегистрирован: 14.02.2017

Вот вырезка из моего кода (не люблю я слово "скетч", как-то не привычно оно для меня).

//вводим IP-адрес ftp сервера
  Serial.println("AT+FTPSERV=\"191.117.13.121\"");delays();
  //вводим логин для ftp-сервера
  Serial.println("AT+FTPUN=\"abracadabra\"");delays();
  //вводим пароль для ftp-сервера
  Serial.println("AT+FTPPW=\"abracadabra\"");delays();
  //вводим имя файла
  Serial.println("AT+FTPPUTNAME=\"abracadabra.txt\"");delays();
  //вводим путь к файлу
  Serial.println("AT+FTPPUTPATH=\"/\"");delays();
  //указываем режим работы ftp
 
у меня на SIM900 все через IP работает.
d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

а подскажите где такой сервер за 13р и ip статичный?))) 

belousovev
Offline
Зарегистрирован: 14.02.2017

Давай по почте. Напиши мне belousovev9999999 @ 99999mail. 9999ru . Без девяток и пробелов.

griin
Offline
Зарегистрирован: 19.04.2015

Честно не пойму зачем так сложно. Некоторые сотов. операторы предоставляют услугу передачи данных. С первого сотового набираешь комманду соединиться с таким-то сотовым в режиме передачи данных и шлешь и читаешь то что тебе нужно. В електросетях давно используется.

belousovev
Offline
Зарегистрирован: 14.02.2017

griin пишет:

Честно не пойму зачем так сложно. Некоторые сотов. операторы предоставляют услугу передачи данных. С первого сотового набираешь комманду соединиться с таким-то сотовым в режиме передачи данных и шлешь и читаешь то что тебе нужно. В електросетях давно используется.

По подробнее можно? Примеры, ссылочки?

griin
Offline
Зарегистрирован: 19.04.2015

Подробнее сейчас не скажу. Года 4 назад устанавливал на предприятии для отдела энергетика. Автоматизированная система учета электроенергии. Программа под винды, ГСМ модем, вподстанции ГСМ модем с 485 и туда подключаются счетчики.