сигнализация авто на GY 521 и DFPlayer

viki13viki
Offline
Зарегистрирован: 14.11.2016

Привет. Задачат такая. Сигнализация на ардуино нано + GY 521 + DFPlayer лай собаки для авто. Нашел проэкт с лающей собакой но на датчиек движения PIR. Нужно заменить PIR на GY 521. Нужно еще и функция для настойки чувствительности.  По электронике шарю а вот по програмированию тормоз.

скетч с датчиком движения

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include<Wire.h>

SoftwareSerial mySoftwareSerial(10, 11);                // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
int count;
const int pirPIN = 2;                                   // контакт  подключения датчика
int state = 0;
const int MPU_addr=0x68;  // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,GyX,GyY,GyZ;

void setup() {
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  mySoftwareSerial.begin(9600);
  Wire.begin();
  Serial.begin(115200);  
  if (!myDFPlayer.begin(mySoftwareSerial)) {            //Проверка
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("Всё работает!!!"));
    
  myDFPlayer.volume(25);                                //Установка громкости (0~30).
    delay(40000);                                       // Задержка 40 секунд на настройку датчика.
    myDFPlayer.play(4);
    count = myDFPlayer.readFileCounts();                //Количество файлов
}

void loop()
{
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr,14,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  Serial.print("AcX = "); Serial.print(AcX);
  Serial.print(" | AcY = "); Serial.print(AcY);
  Serial.print(" | AcZ = "); Serial.print(AcZ);
  Serial.print(" | GyX = "); Serial.print(GyX);
  Serial.print(" | GyY = "); Serial.print(GyY);
  Serial.print(" | GyZ = "); Serial.println(GyZ);
  delay(333);
   state = digitalRead(pirPIN);
   if(state == 1) {
    Serial.println("Тревога "); 
    if(myDFPlayer.readState() == 512) {
    myDFPlayer.play(random(1,count));
    }
    Serial.print("Номер трека ");
    Serial.println(myDFPlayer.readCurrentFileNumber());
    delay(5000);  
   }   
   if(state == 0) {
    Serial.println("Отбой Тревоги ");
//    myDFPlayer.pause();
   }
   if (myDFPlayer.available()) {
      printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Распечатка ошибок и статусов принтера
    }
}

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerUSBInserted:
      Serial.println("USB Inserted!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB Removed!");
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
  
}

скетч полной сигнализации с использованием датчика GY 521. тут человек полностью имеет все функции, чувствительность, от фальшивых срабатываний, подсчетов датчика и как бы авто не стояло криво, датчик запоминает положение и ведет наблюдение за отклонениями и многе другое связаное с GY 521. Вот скетч

#include "Kalman.h"
#include <Wire.h>
#include <SoftwareSerial.h>
#define Module_Start "Call Ready"
#define GSM_TYPE_SIM800
SoftwareSerial Serial_S(2 ,  3);
bool GSM_In_sms;
String GSM_Phone;
String GSM_text;
bool GSM_Reject_call;
bool GSM_start;
bool GSM_Net;
int GSM_dBm;
bool GSM_Received_SMS;
String GSM_Text_sms;
String GSM_T_Nomer;
bool GSM_Sent_SMS;
bool GSM_Call;
int GSM_Number_calls;
int GSM_Error_Code;
bool GSM_start_N; //Модем прислал сообщение о том, что он стартовал 
bool GSM_final; // закончена обработка запроса
bool GSM_wait; // идет ожидание ответа на команду
bool GSM_past_SMS;
bool GSM_command_SMS;
bool GSM_past_Reject_call;
bool GSM_command_Reject_call;
//bool GSM_Call_P1;
char GSM_ch;
   //символ пришетший в ком порт
byte GSM_errorCounter; // счетчик ошибок
byte GSM_numberRepeats;
//byte GSM_Dial_response_code;
byte GSM_team_room; //номер текущей функции 
byte GSM_count; // счетчик последовальности команд
unsigned long GSM_time; //Время посылки команды
unsigned long GSM_T_millis; //Время посылки команды
unsigned long GSM_time_n; //Время последнего опроса связи с сетью.
String GSM_line; // сообщение от модуля
String GSM_reply; //Ответ модуля на команду
String GSM_Phone_T=""; //Телефон во время подачи команд на звонок или отправку смс
int GSM_DTMF;
#define GSM_INCLUSION_DTMF
bool GSM_Outgoing_Call;
bool GSM_Take_Call;
bool GSM_Connect;
#define GSM_INCLUSION_CALLS
float gyro_axisX;
float gyro_axisY;
Kalman kalmanX;
Kalman kalmanY;
uint8_t IMUAddress= 0x68;
int var;
int16_t accX;
int16_t accY;
int16_t accZ;
int16_t tempRaw;
int16_t gyroX;
int16_t gyroY;
int16_t gyroZ;
float accXangle; // Angle calculate using the accelerometer
float accYangle;
float temp;
float gyroXangle= 180; // Angle calculate using the gyro
float gyroYangle= 180;
float compAngleX= 180; // Calculate the angle using a Kalman filter
float compAngleY= 180;
float kalAngleX; // Calculate the angle using a Kalman filter
float kalAngleY;
uint32_t timer;
int _gtv1;
int _gtv2;
int _gtv3;
bool _gtv4 = 0;
bool _gtv5 = 0;
bool _gtv6 = 0;
bool _gtv7 = 0;
String _gtv8;
bool _gtv10;
int _gtv11;
bool _gtv12 = 0;
bool _gtv14 = 0;
bool _gtv15 = 0;
bool _trgrt13 = 0;
bool _trgrt13I = 0;
bool _tim2I = 0;
bool _tim2O = 0;
unsigned long _tim2P = 0UL;
bool _tim9I = 0;
bool _tim9O = 0;
unsigned long _tim9P = 0UL;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _trgrt8 = 0;
bool _trgrt8I = 0;
bool _trgrt6 = 0;
bool _trgrt6I = 0;
bool _trgr1 = 0;
bool _trgrt2 = 0;
bool _trgrt2I = 0;
bool _trgrt14 = 0;
bool _trgrt14I = 0;
bool _trgrt9 = 0;
bool _trgrt9I = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
bool _trgrt12 = 0;
bool _trgrt12I = 0;
bool _trgrt5 = 0;
bool _trgrt5I = 0;
bool _tim7I = 0;
bool _tim7O = 0;
unsigned long _tim7P = 0UL;
bool _tim8I = 0;
bool _tim8O = 0;
unsigned long _tim8P = 0UL;
bool _tim4I = 0;
bool _tim4O = 0;
unsigned long _tim4P = 0UL;
bool _tim6I = 0;
bool _tim6O = 0;
unsigned long _tim6P = 0UL;
bool _tim5I = 0;
bool _tim5O = 0;
unsigned long _tim5P = 0UL;
bool _trgrt4 = 0;
bool _trgrt4I = 0;
bool _trgrt7 = 0;
bool _trgrt7I = 0;
bool _bounseInputD3S = 0;
bool _bounseInputD3O = 0;
unsigned long _bounseInputD3P = 0UL;
bool _tim3I = 0;
bool _tim3O = 0;
unsigned long _tim3P = 0UL;
bool _trgs1 = 0;
bool _trgrt11 = 0;
bool _trgrt11I = 0;
bool _trgrt10 = 0;
bool _trgrt10I = 0;
bool _trgrt3 = 0;
bool _trgrt3I = 0;
bool _bounseInputD11S = 0;
bool _bounseInputD11O = 0;
unsigned long _bounseInputD11P = 0UL;
void setup()
{
    pinMode(3, INPUT_PULLUP);
    pinMode(11, INPUT);
    pinMode(13, OUTPUT);
    digitalWrite(13, 0);
    pinMode(12, OUTPUT);
    digitalWrite(12, 0);
    pinMode(2, OUTPUT);
    digitalWrite(2, 0);
    pinMode(9, OUTPUT);
    digitalWrite(9, 0);
    pinMode(8, OUTPUT);
    digitalWrite(8, 0);
    pinMode(7, OUTPUT);
    digitalWrite(7, 0);
    pinMode(10, OUTPUT);
    digitalWrite(10, 0);
    pinMode(6, OUTPUT);
    digitalWrite(6, 0);
    _bounseInputD3O =  digitalRead(3);
    _bounseInputD11O =  digitalRead(11);
    Serial_S.println("AT+IPR=9600");
    Serial_S.println("AT&W");
    Serial_S.begin(9600);
    Wire.begin();
    i2cWrite(0x6B,0x00); // Disable sleep mode
    kalmanX.setAngle(180); // Set starting angle
    kalmanY.setAngle(180);
    timer = micros();
    var=0;
}
void loop()
{
    bool  _bounceInputTmpD3 =  (digitalRead (3));
    if (_bounseInputD3S)
    {
        if (millis() >= (_bounseInputD3P + 40))
        {
            _bounseInputD3O= _bounceInputTmpD3;
            _bounseInputD3S=0;
        }
    }
    else
    {
        if (_bounceInputTmpD3 != _bounseInputD3O)
        {
            _bounseInputD3S=1;
            _bounseInputD3P = millis();
        }
    }
    bool  _bounceInputTmpD11 =  (digitalRead (11));
    if (_bounseInputD11S)
    {
        if (millis() >= (_bounseInputD11P + 40))
        {
            _bounseInputD11O= _bounceInputTmpD11;
            _bounseInputD11S=0;
        }
    }
    else
    {
        if (_bounceInputTmpD11 != _bounseInputD11O)
        {
            _bounseInputD11S=1;
            _bounseInputD11P = millis();
        }
    }
    //Плата:1
//Наименование:SIM800
    if (1) 
    {
         if (_trgrt9I) 
        {
             _trgrt9 = 0;
        }
         else 
        {
            _trgrt9 = 1;
            _trgrt9I = 1;
        }
    }
     else 
    {
        _trgrt9 = 0;
        _trgrt9I = 0;
    }
    ;
    digitalWrite(12, _trgrt9);
    _gtv11 = GSM_DTMF;
    if (_gtv10)
    {
         if (_tim9I) 
        {
             if (_isTimer(_tim9P, 3000)) 
            {
                _tim9O = 1;
            }
        }
         else 
        {
            _tim9I =1;
            _tim9P = millis();
        }
    }
     else 
    {
        _tim9O = 0;
        _tim9I = 0;
    }
    if (_tim9O) 
    {
         if (_trgrt14I) 
        {
             _trgrt14 = 0;
        }
         else 
        {
            _trgrt14 = 1;
            _trgrt14I = 1;
        }
    }
     else 
    {
        _trgrt14 = 0;
        _trgrt14I = 0;
    }
    ;
    if (_gtv10) 
    {
         if (_trgrt13I) 
        {
             _trgrt13 = 0;
        }
         else 
        {
            _trgrt13 = 1;
            _trgrt13I = 1;
        }
    }
     else 
    {
        _trgrt13 = 0;
        _trgrt13I = 0;
    }
    ;
    GSM_In_sms = _trgrt14;
    GSM_Phone = String("+7xxxxxxxxxx");
    GSM_text = String("Proniknovenie");
    GSM_Reject_call = _trgrt13;
    GSM_Received_SMS =0; //Сброс статутса СМС Принята
    GSM_Sent_SMS =0; //Сброс статуса СМС Отправлена
    if (1)
    {
          if (GSM_team_room==3)
        {
                GSM_Number_calls =0;
                GSM_Text_sms="";
                GSM_T_Nomer ="";
              
        }
    }
    GSM_T_millis =millis();
        while(Serial_S.available())  //Получаем данные с модема
          
    {
        GSM_ch = Serial_S.read();
              
              if(GSM_ch == '\r') continue;
              if(GSM_ch == '\n') 
        {
             GSM_GotLineFromNeoway();
            GSM_line ="";
        }
              else  GSM_line += GSM_ch;
    }
    if (GSM_wait) //ожиание ответа на команду
      
    {
          
          if(GSM_line.length()>0)
        {
                if(GSM_line==F("> ")) 
            {
                GSM_count++;
                GSM_wait=0;
                GSM_line ="";
            }
        }
          if(GSM_T_millis>GSM_time) 
        {
            GSM_err (2,0);
        }
          
    }
    if (GSM_Call&&(GSM_team_room!=1))
      
    {
          
          GSM_team_room=1;
          
          GSM_Number_calls=1; //сброс числа гудков
           // GSM_resetExpectations() ; 
          
    }
    if (GSM_start_N)
    {
        if (!GSM_wait)
        {
            if (GSM_setup_comand())
            {
                GSM_start_N=0;
                GSM_start =1;
            }
        }
    }
// Инициализация
    if (GSM_start) //Не работать пока не старт
      
    {
        //______Проверка статуса сети
            if ((30000 >0)&&(GSM_team_room==0))  //проверять ли статутс сети
              
        {
                  if((GSM_T_millis-GSM_time_n) > 30000)
            {
                 GSM_team_room=3;
            }
                  
        }
        //______Конец Проверка статуса сети
        //______Отправка СМС
          if (GSM_In_sms  && !GSM_past_SMS) 
        {
              if (GSM_number_search())GSM_command_SMS =1;
              
        }
           // поступление команды на отправу СМС. Проверка корректности номера
          GSM_past_SMS= GSM_In_sms;
          if (GSM_command_SMS && (GSM_team_room==0)) 
        {
            GSM_team_room=2;
            GSM_command_SMS =0;
        }
          // начинать отправу СМС
//______Конец Отправка СМС    
        //______Команда сброс вызова или разрыв разговора 
          if (GSM_Reject_call  && !GSM_past_Reject_call) 
        {
             GSM_command_Reject_call =1;
        }
          GSM_past_Reject_call=GSM_Reject_call;
        //______Конец Команда сброс вызова или разрыв разговора 
          
        #ifdef GSM_INCLUSION_USSD  // Обработка вызова USSD запросов 
          GSM_causeProcessingUSSD();
        #endif
        #ifdef GSM_INCLUSION_DATA_TIME  //Обработка времени, даты, оператора
          GSM_causeProcessingDataTime();
        #endif
        #ifdef GSM_INCLUSION_CALLS  // исходящий вызов 
          if (GSM_causeProcessingCall()) 
        {
                if(GSM_number_search())
            {
                      GSM_wait=1; // ожитать
                      GSM_time =millis() + 20000; // время ожидания     
                      Serial_S.println("ATD"+ GSM_Phone_T+";");
                      GSM_team_room=5;
                  #ifdef GSM_DEBUG  // отладка    
                    Serial.println("Command: ATD"+ GSM_Phone_T+";");
                  
                  #endif
                    
            }
              
        }
        #endif
        //________ Обработка разных процессов
          switch (GSM_team_room) 
        {
              case 0:
                  break;
              case 1:  //Обработка входящих  вызовов 
                if (!GSM_wait)
            {
                      if (GSM_command_Reject_call) 
                {
                            if (GSM_singleCommand(F("ATH0"), 10))  
                    {
                        GSM_command_Reject_call=0;
                        GSM_Call=0;
                        GSM_count=0;
                        GSM_final=1;
                    }
                            
                }
                  
                #ifdef GSM_INCLUSION_CALLS
                #ifndef GSM_TYPE_M590
                    if (GSM_causeProcessingTake())
                {
                    GSM_Connect=1;
                    GSM_team_room=5;
                }
                  
                #endif  
                #endif  
                    
            }
                    
                if (!GSM_Call)
            {
                GSM_final =1;
                GSM_T_Nomer ="";
            }
                break;
              case 2: 
                if (!GSM_wait)
            {
                  GSM_final=GSM_sms_sent();
            }
             // отправка сообщения
                break;
              case 3: 
                if (!GSM_wait)
            {
                 GSM_final=GSM_net_status();
            }
// проверка связи с сетью
                break;
              case 4:  //приход смс
                 //if (!GSM_wait){ GSM_final=1; GSM_count=0; GSM_Error_Code =0;   }// 
                break;
            #ifdef GSM_INCLUSION_CALLS
              case 5:  //разговор 
                if (!GSM_wait) 
            {
                  
                      if (GSM_command_Reject_call) 
                {
                            if (GSM_singleCommand(F("ATH0"), 10))  
                    {
                        GSM_command_Reject_call=0;
                        GSM_Call=0;
                        GSM_count=0;
                        GSM_Connect=0;
                        GSM_final=1;
                    }
                          
                }
                      GSM_count=0;
                      
                    
            }
                break;
            #endif
            #ifdef GSM_INCLUSION_DATA_TIME
              case 6:  // дата время 
                if (!GSM_wait)
            {
                if (GSM_DataTime())
                {
                     GSM_final =1;
                }
            }
// запрос баланса
                break;
            #endif
            #ifdef GSM_INCLUSION_USSD
              case 7:  // USSD 
                if (!GSM_wait)
            {
                 GSM_final=GSM_USSD();
            }
// запрос баланса
                break;
            #endif
              
        }
        //________ Конец Обработка разных процессов
          if (GSM_final)
        {
            GSM_team_room=0;
            GSM_final=0;
        }
         //должно быть последним
    }
    _gtv8 = GSM_T_Nomer;
    digitalWrite(2, GSM_Net);
    if (((!(_gtv10)) && (_gtv12))) 
    {
         if (_trgrt12I) 
        {
             _trgrt12 = 0;
        }
         else 
        {
            _trgrt12 = 1;
            _trgrt12I = 1;
        }
    }
     else 
    {
        _trgrt12 = 0;
        _trgrt12I = 0;
    }
    ;
    GSM_Outgoing_Call = _trgrt12;
    GSM_Take_Call = ((_gtv8).equals(String("+7xxxxxxxxxx")));
    //Плата:2
//Наименование:Сигнализация
    if (!(_bounseInputD11O)) 
    {
         if (_trgrt6I) 
        {
             _trgrt6 = 0;
        }
         else 
        {
            _trgrt6 = 1;
            _trgrt6I = 1;
        }
    }
     else 
    {
        _trgrt6 = 0;
        _trgrt6I = 0;
    }
    ;
    if(((_gtv5) && (_trgrt6))) _trgs1 = 1;
    if(!(_gtv5)) _trgs1 = 0;
    digitalWrite(10, ((_gtv15) || (((((_gtv14) || (_trgs1))) && (_gtv4)))));
    digitalWrite(9, _trgs1);
    _gtv10 = _trgs1;
    //Плата:3
//Наименование:Датчик наклона
    _gtv6 = (_gtv11) == (1);
    _gtv7 = (_gtv11) == (2);
    while (var<100)
    {
        uint8_t* data = i2cRead(0x3B,14);
        accX = ((data[0] << 8) | data[1]);
        accY = ((data[2] << 8) | data[3]);
        accZ = ((data[4] << 8) | data[5]);
        tempRaw = ((data[6] << 8) | data[7]);
        gyroX = ((data[8] << 8) | data[9]);
        gyroY = ((data[10] << 8) | data[11]);
        gyroZ = ((data[12] << 8) | data[13]);
        accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG;
        accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;
        float gyroXrate = (float)gyroX/131.0;
        float gyroYrate = -((float)gyroY/131.0);
        //float accelXrate = (atan(accX / sqrt(accY * accY + accZ * accZ)));
//float accelYrate = (atan(accY / sqrt(accX * accX + accZ * accZ)));
        gyroXangle += kalmanX.getRate()*((float)(micros()-timer)/10000); // Calculate gyro angle using the unbiased rate
        gyroYangle += kalmanY.getRate()*((float)(micros()-timer)/10000);
        kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (float)(micros()-timer)/10000); // Calculate the angle using a Kalman filter
        kalAngleY = kalmanY.getAngle(accYangle, gyroYrate, (float)(micros()-timer)/10000);
        timer = micros();
        var++;
    }
    uint8_t* data = i2cRead(0x3B,14);
    accX = ((data[0] << 8) | data[1]);
    accY = ((data[2] << 8) | data[3]);
    accZ = ((data[4] << 8) | data[5]);
    tempRaw = ((data[6] << 8) | data[7]);
    gyroX = ((data[8] << 8) | data[9]);
    gyroY = ((data[10] << 8) | data[11]);
    gyroZ = ((data[12] << 8) | data[13]);
    accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG;
    accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;
    float gyroXrate = (float)gyroX/131.0;
    float gyroYrate = -((float)gyroY/131.0);
    gyroXangle += kalmanX.getRate()*((float)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate
    gyroYangle += kalmanY.getRate()*((float)(micros()-timer)/1000000);
    kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (float)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter
    kalAngleY = kalmanY.getAngle(accYangle, gyroYrate, (float)(micros()-timer)/1000000);
    timer = micros();
    gyro_axisX = kalAngleX;
    gyro_axisY = kalAngleY;
    if (_gtv5) 
    {
         if (_trgrt3I) 
        {
             _trgrt3 = 0;
        }
         else 
        {
            _trgrt3 = 1;
            _trgrt3I = 1;
        }
    }
     else 
    {
        _trgrt3 = 0;
        _trgrt3I = 0;
    }
    ;
    if ((((((((int(gyro_axisY)))-(90)) > ((_gtv1)+((map((_gtv3), (0), (1023), (1), (5)))))) || ((((int(gyro_axisY)))-(90)) < ((_gtv1)-((map((_gtv3), (0), (1023), (1), (5)))))))) || ((((((int(gyro_axisX)))-(90)) > ((_gtv2)+((map((_gtv3), (0), (1023), (1), (5)))))) || ((((int(gyro_axisX)))-(90)) < ((_gtv2)-((map((_gtv3), (0), (1023), (1), (5)))))))))) 
    {
         if (_trgrt10I) 
        {
             _trgrt10 = 0;
        }
         else 
        {
            _trgrt10 = 1;
            _trgrt10I = 1;
        }
    }
     else 
    {
        _trgrt10 = 0;
        _trgrt10I = 0;
    }
    ;
    _gtv12 = ((((_gtv5) && (_trgrt10))) && (_gtv5));
    if(((_gtv5) && (_trgrt10))) 
    {
        _tim1O = 1;
        _tim1I = 1;
    }
     else 
    {
         if(_tim1I) 
        {
            _tim1I = 0;
            _tim1P = millis();
        }
         else 
        {
             if (_tim1O) 
            {
                if (_isTimer(_tim1P, 5000)) _tim1O = 0;
            }
        }
    }
    _gtv14 = _tim1O;
    if (!(_bounseInputD3O))
    {
         if (_tim3I) 
        {
             if (_isTimer(_tim3P, 3000)) 
            {
                _tim3O = 1;
            }
        }
         else 
        {
            _tim3I =1;
            _tim3P = millis();
        }
    }
     else 
    {
        _tim3O = 0;
        _tim3I = 0;
    }
    if (_gtv7) 
    {
         if (_trgrt5I) 
        {
             _trgrt5 = 0;
        }
         else 
        {
            _trgrt5 = 1;
            _trgrt5I = 1;
        }
    }
     else 
    {
        _trgrt5 = 0;
        _trgrt5I = 0;
    }
    ;
    if (((_tim3O) || (_trgrt5))) 
    {
         if (_trgrt8I) 
        {
             _trgrt8 = 0;
        }
         else 
        {
            _trgrt8 = 1;
            _trgrt8I = 1;
        }
    }
     else 
    {
        _trgrt8 = 0;
        _trgrt8I = 0;
    }
    ;
    if(_trgrt8) 
    {
        _tim7O = 1;
        _tim7I = 1;
    }
     else 
    {
         if(_tim7I) 
        {
            _tim7I = 0;
            _tim7P = millis();
        }
         else 
        {
             if (_tim7O) 
            {
                if (_isTimer(_tim7P, 500)) _tim7O = 0;
            }
        }
    }
    digitalWrite(7, _tim7O);
    if (!(_trgrt8))
    {
         if (_tim5I) 
        {
             if (_isTimer(_tim5P, 250)) 
            {
                _tim5O = 1;
            }
        }
         else 
        {
            _tim5I =1;
            _tim5P = millis();
        }
    }
     else 
    {
        _tim5O = 0;
        _tim5I = 0;
    }
    if (_tim5O) 
    {
         if (_trgrt7I) 
        {
             _trgrt7 = 0;
        }
         else 
        {
            _trgrt7 = 1;
            _trgrt7I = 1;
        }
    }
     else 
    {
        _trgrt7 = 0;
        _trgrt7I = 0;
    }
    ;
    if(((_trgrt8) || (_trgrt7))) 
    {
        _tim6O = 1;
        _tim6I = 1;
    }
     else 
    {
         if(_tim6I) 
        {
            _tim6I = 0;
            _tim6P = millis();
        }
         else 
        {
             if (_tim6O) 
            {
                if (_isTimer(_tim6P, 100)) _tim6O = 0;
            }
        }
    }
    if (((_gtv6) || (!(_bounseInputD3O)))) 
    {
         if (_trgrt2I) 
        {
             _trgrt2 = 0;
        }
         else 
        {
            _trgrt2 = 1;
            _trgrt2I = 1;
        }
    }
     else 
    {
        _trgrt2 = 0;
        _trgrt2I = 0;
    }
    ;
    if(((_tim3O) || (_trgrt5))) _trgr1 = 0;
    if(_trgrt2) _trgr1 = 1;
    if (_trgr1) 
    {
         if (_trgrt4I) 
        {
             _trgrt4 = 0;
        }
         else 
        {
            _trgrt4 = 1;
            _trgrt4I = 1;
        }
    }
     else 
    {
        _trgrt4 = 0;
        _trgrt4I = 0;
    }
    ;
    if(_trgrt4) 
    {
        _tim4O = 1;
        _tim4I = 1;
    }
     else 
    {
         if(_tim4I) 
        {
            _tim4I = 0;
            _tim4P = millis();
        }
         else 
        {
             if (_tim4O) 
            {
                if (_isTimer(_tim4P, 100)) _tim4O = 0;
            }
        }
    }
    _gtv15 = ((_tim4O) || (_tim6O));
    if (_trgr1)
    {
         if (_tim2I) 
        {
             if (_isTimer(_tim2P, 10000)) 
            {
                _tim2O = 1;
            }
        }
         else 
        {
            _tim2I =1;
            _tim2P = millis();
        }
    }
     else 
    {
        _tim2O = 0;
        _tim2I = 0;
    }
    if (((_gtv6) || (_tim2O))) 
    {
         if (_trgrt11I) 
        {
             _trgrt11 = 0;
        }
         else 
        {
            _trgrt11 = 1;
            _trgrt11I = 1;
        }
    }
     else 
    {
        _trgrt11 = 0;
        _trgrt11I = 0;
    }
    ;
    if(_trgrt11) 
    {
        _tim8O = 1;
        _tim8I = 1;
    }
     else 
    {
         if(_tim8I) 
        {
            _tim8I = 0;
            _tim8P = millis();
        }
         else 
        {
             if (_tim8O) 
            {
                if (_isTimer(_tim8P, 500)) _tim8O = 0;
            }
        }
    }
    digitalWrite(8, _tim8O);
    _gtv5 = _tim2O;
    if (_gtv5) 
    {
         if (! _gen1I) 
        {
            _gen1I = 1;
            _gen1O = 1;
            _gen1P = millis();
        }
    }
     else 
    {
        _gen1I = 0 ;
        _gen1O= 0;
    }
    if (_gen1I) 
    {
          if (_isTimer (_gen1P , 500)) 
        {
             _gen1P = millis();
            _gen1O = ! _gen1O;
        }
    }
    _gtv4 = _gen1O;
    if (_gen1O) 
    {
        _gtv3 =  (analogRead (1));
    }
    digitalWrite(13, ((_trgr1) && (!(_gen1O))));
    digitalWrite(6, ((_tim4O) || (_tim6O) || (_tim1O) || (_gtv10)));
    if (_trgrt3) 
    {
        _gtv1 = ((int(gyro_axisY)))-(90);
    }
    if (_trgrt3) 
    {
        _gtv2 = ((int(gyro_axisX)))-(90);
    }
}
bool _isTimer(unsigned long startTime, unsigned long period)
{
    unsigned long currentTime;
    currentTime = millis();
    if (currentTime>= startTime) 
    {
        return (currentTime>=(startTime + period));
    }
     else 
    {
        return (currentTime >=(4294967295-startTime+period));
    }
}
bool GSM_setup_comand()
{
    switch (GSM_count) 
    {
        case 0: 
           GSM_count ++;
          
          break;
        case 1:
           GSM_Command(F("ATE0") ,2) ; //отключение эхо ответа
          break;
        case 2:   
           GSM_AT_Command(F("CPAS"),4);
               // проверка готовности модуля к работе 
          break;
        case 3: 
           GSM_analysisResponse(F("+CPAS: 0"));
            
          break;
        case 4: 
           GSM_AT_Command(F("CREG?"),10);
           //Проверка регистрации в сети    
          break;
        case 5: 
          if (GSM_analysisResponse(F("+CREG")))
        {
                if((GSM_reply.endsWith("1")) || (GSM_reply.endsWith("5"))) 
            {
                 GSM_Net =1;
            }
             // 1-В домашней сети, 5- в роуминге
                else 
            {
                 GSM_err(0,1);
                GSM_count--;
            }
                  
                
        }
          
          break;
        case 6: 
           GSM_AT_Command(F("CSCB=1") ,2);
             // Отключение приема широковещательных сообщений 
          break;
          
        case 7: 
           GSM_AT_Command(F("CLIP=1") ,2);
             // настройки автоматического определения номера
          break;
        case 8:
           GSM_AT_Command(F("CMGF=1") ,2) ; //настройки формата SMS сообщений, текстовый
          break;
        case 9: 
           GSM_AT_Command(F("CSCS=\"GSM\"") ,2);
           // выбора кодировки текста, кодировка ASCII
          break;
        case 10:
           GSM_AT_Command(F("CNMI=2,2,0,0,0") ,2) ; //выдовать смс в терминал и не сохранять в память
          break;
        case 11:
        #ifdef GSM_INCLUSION_DTMF  // Если добвален блок DTMF
          GSM_AT_Command(F("DDET=1") ,5); // Включение работы с DTMF
        #else
          GSM_count ++;
        #endif  
          break;
        #ifdef TELEFONNAYA_BOOK  // Если использовать телефонну книгу
        case 12:
           GSM_AT_Command(F("CPBS?"),2);
              
          break;
        case 13:
           GSM_analysisResponse(F("+CPBS: \"SM\""));
              
          break;
          
        case 14:
           GSM_AT_Command(F("CPBF=\""), GSM_Name_Contact , 2) ;
           GSM_index_array =0;
          break;
        case 15:
        #else  //Если не использовать телефонную книгу
        case 12:
        #endif  //Окнчание выбора по телефонной книге 
           GSM_count=0;
          
           GSM_Error_Code =0; //Сброc ошибки  
          return 1;
          break;
    }
    return 0;
}
void GSM_GotLineFromNeoway()
{
    bool flag_=0; //Анализ телефонной книги
    static bool isStringMessage;
    #ifdef GSM_DEBUG
    Serial.print("Message module: "); //Тест
    Serial.println(GSM_line); //Тест
    Serial.print("GSM_team_room: "); //Тест
    Serial.println(GSM_team_room); //Тест
    #endif
    if (GSM_line.length()>0)
      
    {
          
        //Обработка входящих СМС
            if (isStringMessage)
        {
                  GSM_Text_sms  =  GSM_line ; //выводим текст сообщения 
                  GSM_Received_SMS  =true; // Импульс приход сообщения
                  isStringMessage=0;
                  
                  return;
                
        }
          if (GSM_line.startsWith("+CMT"))  // пришло СМС 
            
        {
                flag_=1;
                GSM_resetExpectations();
                
                isStringMessage=1;
              
                GSM_reply="";
                
        }
        //Конец Обработка входящих СМС
        // Обработка входящих вызовов
          
          if (GSM_Call)
            
        {
                if (GSM_line.startsWith(F("+CLIP"))) 
            {
                flag_=1;
                GSM_reply="";
            }
                else if (GSM_line == F("NO CARRIER")) 
            {
                 GSM_Call=0;
            }
                
                
        }
          if (GSM_line == F("RING"))
        {
            //Входящий звонок 
                    if(!GSM_Call)GSM_resetExpectations();
                    GSM_Call=1;
                    GSM_Number_calls ++;
                    
                    
        }
        // ____ Обработка USSD sim800
        #ifdef GSM_TYPE_SIM800
        #ifdef GSM_INCLUSION_USSD
        if (GSM_line.startsWith("+CUSD"))  // пришел ответ по USSD
            
        {
                GSM_wait=0;
                GSM_count++;
                GSM_USSD_return  =   GSM_substring_commas(GSM_line,5) ;
                
        }
        #endif
        #endif
        //_______Конец обработки USSD SIM800
        #ifdef GSM_INCLUSION_CALLS  //Если добавлен блок работы со звонками
        #ifdef GSM_INCLUSION_DTMF  // Если добвален блок DTMF
          if (GSM_Connect)
        {
              if (GSM_line.startsWith(F("+DTMF"))) 
            {
                GSM_ID_DTMF(GSM_line);
            }
              
        }
        #endif
          if (GSM_team_room==5)
            
        {
                if (GSM_line == F("CONNECT"))GSM_Connect=1;
                else if (GSM_line == F("BUSY")) GSM_err (505,2);
                else if (GSM_line == F("NO ANSWER")) GSM_err (506,2);
                else if (GSM_line == F("NO CARRIER")) 
            {
                        if (GSM_Connect)
                {
                    GSM_Connect=0;
                    GSM_team_room=0;
                }
                        else GSM_err (507,2);
                      
            }
                
        }
        #endif
        // Конец Обработка входящих вызовов
          
          
          if(GSM_line == F("ERROR")) GSM_err (1, 0);
          else if(GSM_line == F("OK"))
        {
            GSM_wait=0;
            GSM_count++;
            GSM_errorCounter=0;
        }
          else 
        {
                GSM_reply+=GSM_line;
                
                
        }
          if (GSM_reply.length()>  160)
        {
            GSM_reply="";
            GSM_err(10100,2);
        }
//Защита от переполнения строки
        if (GSM_line == Module_Start)
        {
            GSM_start_N=1;
            GSM_start=0;
            GSM_err(0 , 2);
        }
//Сообщение от модуля о том, закончил загрузку 
        if (flag_)  //Получение номер телефона отправителя/звонящего
            
        {
                 GSM_T_Nomer =  GSM_substring_commas(GSM_line, 4);
              
                if(GSM_T_Nomer.indexOf("+")==-1)  GSM_T_Nomer=(String("+"))+ GSM_T_Nomer;
              
            #ifdef TELEFONNAYA_BOOK  // если используется телефооная книга
                int  GSM_ind_arr= GSM_StringArray(GSM_Telefon,  GSM_T_Nomer);
                if (GSM_ind_arr>-1)  GSM_T_Nomer = GSM_Contact [  GSM_ind_arr ];
            #endif
                flag_=0;
                
        }
        #ifdef TELEFONNAYA_BOOK  // если используется телефооная книга
          if (!GSM_start)
        {
                if (GSM_line.startsWith("+CPBF"))  // пришла запись телефонной книги
                  
            {
                if(GSM_index_array< GSM_Number_Contacts)
                {
                            GSM_Telefon[  GSM_index_array ] =  GSM_substring_commas(GSM_line, 5);
                            GSM_Contact[  GSM_index_array ]=  GSM_substring_commas(GSM_line, (GSM_line.lastIndexOf(","))) ;
                             GSM_index_array ++;
                }
                      
            }
              
        }
        #endif
    }
    // Получили строку ответа от Neoway. Любые ответы приходят в виде
// либо одной, либо нескольких строк, так что единица, которой мы должны
// оперировать - именно строка
// F("") -Хранить строку в Флеш памяти
}
void GSM_AT_Command(const __FlashStringHelper* str, String str2, byte _numRep)
{
    GSM_numberRepeats=_numRep;
    GSM_reply=""; //Сброс содержимого прошлого ответа модуля
     GSM_wait=1; // ожитать
     GSM_time =millis() + 20000; // время ожидания
    Serial_S.write("AT+");
    Serial_S.print(str);
    Serial_S.print(str2);
    Serial_S.write("\"\r\n");
    #ifdef GSM_DEBUG  // отладка
      Serial.write("Command: AT+");
      Serial.print(str);
      Serial.print(str2);
      Serial.write("\"\r\n");
      
    #endif
}
bool GSM_net_status()
{
    switch (GSM_count) 
    {
        case 0: 
           GSM_count ++;
          
          break;
        case 1: 
           GSM_AT_Command(F("CREG?") , 5);
           //Проверка регистрации в сети    
          break;
        case 2: 
          if (GSM_analysisResponse(F("+CREG")))
        {
                if((GSM_reply.endsWith("1")) || (GSM_reply.endsWith("5"))) 
            {
                 GSM_Net =1;
            }
             // 1-В домашней сети, 5- в роуминге
                else 
            {
                 GSM_Net =0;
            }
                
        }
          
          break;
            
        case 3:  // Проверка уровня сигнала 
           GSM_AT_Command(F("CSQ") , 5);
          
          break;
        case 4:   
          if (GSM_analysisResponse(F("+CSQ")))
        {
                     // 
                int t1= GSM_reply.indexOf(": ");
                if(t1>-1)    GSM_dBm  =((((GSM_reply.substring(t1+2,t1+4)).toInt())*(2))-(113));
                  
                if(GSM_dBm >0)   GSM_dBm =-120; //нет сети    
                
        }
            
          break;
        case 5: 
           GSM_count=0;
           GSM_time_n=millis(); // время последнего опроса  
           GSM_Error_Code =0; //Сброc ошибки
          return 1;
          break;
    }
    return 0;
}
bool GSM_sms_sent()
{
    switch (GSM_count) 
    {
        case 0: 
           GSM_count ++;
          
          break;
        case 1: 
           GSM_AT_Command(F("CMGF=1"),1);
             // Перевод сообщенй в текстовый режим  
          break;
        case 2: 
           GSM_AT_Command(F("CMGS=\""),  GSM_Phone_T ,1); // Отправка команды на начальный этап  отправки СМС
          break;
        case 3:  // передача текста СМС и отправка сообщения
          if (GSM_errorCounter)
        {
              GSM_err((200+ GSM_count) , 2);
            break;
        }
// выход из посылки команд если достигнуто придельное колличество ошибок
          Serial_S.println(GSM_text +String((char)26));
            
           GSM_wait=1; // ожитать
           GSM_time =millis() + 20000; // время ожидания
        #ifdef GSM_DEBUG  // отладка
          Serial.println(GSM_text +String((char)26));
            
        #endif
          break;
        case 4: 
           GSM_count=0;
          
           GSM_Sent_SMS =1;
           GSM_Error_Code =0; //Сброc ошибки
          return 1;
          
          break;
          
    }
    return 0;
}
String GSM_substring_commas(String text_analyze, int position)
{
    int t1=text_analyze.indexOf("\"", position);
    int t2=text_analyze.indexOf("\"",(t1+1));
    if(t1>-1)
    {
          if(t2>-1)  return text_analyze.substring(t1+1,t2);
          else return text_analyze.substring(t1+1);
    }
      
    return "";
}
bool GSM_number_search()
{
    if (GSM_Phone.length() <4) 
    {
        GSM_Error_Code =10005;
        return 0;
    }
    GSM_Phone_T = GSM_Phone ;
    #ifdef TELEFONNAYA_BOOK
    int ind_arr;
    ind_arr= GSM_StringArray(GSM_Contact ,  GSM_Phone);
    if (ind_arr>-1)  GSM_Phone_T = GSM_Telefon [ ind_arr ];
    else if(GSM_White_list) 
    {
        GSM_Error_Code =10006;
        return 0;
    }
      
    #endif
      
    return 1;
}
void GSM_resetExpectations()
{
//сброс текущей операции 
    GSM_wait=0; //сброс ожидания ответа
    GSM_count=0; //Сброс состояний обработки других функций
    GSM_time_n=GSM_T_millis; //отсрочка проверки статуса сети
    GSM_team_room=0;
}
void GSM_err(int error, byte _ret)
{
    GSM_errorCounter++ ;
    GSM_reply=""; //Сброс содержимого прошлого ответа модуля
    GSM_wait =0;
    if (_ret==0)
    {
          if (GSM_errorCounter >GSM_numberRepeats)
        {
                error = GSM_team_room*100+ GSM_count;
                _ret=2;
        }
          else return;
    }
    if (_ret==1)  GSM_count--;
    else if (_ret==2)
    {
          GSM_errorCounter=0;
          GSM_Error_Code =error;
          if (GSM_team_room==3)
        {
            GSM_Net =0;
            GSM_dBm =-120;
        }
          GSM_resetExpectations();
          
    }
}
void GSM_AT_Command(const __FlashStringHelper* str, byte _numRep)
{
    #ifdef GSM_DEBUG  // отладка  
      Serial.write("AT+ _ ");
      
    #endif
    Serial_S.write("AT+");
    GSM_Command(str,_numRep) ;
}
bool GSM_analysisResponse(const __FlashStringHelper* response)
{
    #ifdef GSM_DEBUG
    Serial.print("Expected Answer: "); //Тест
    Serial.println(response); //Тест
    Serial.print("Real  Answer: "); //Тест
    Serial.println(GSM_reply); //Тест
    #endif
    if (GSM_reply.startsWith(response))
    {
        GSM_count++;
        return 1;
    }
    GSM_err(0,1);
    return 0;
      
}
bool GSM_singleCommand(const __FlashStringHelper* str, byte _numRep)
{
    switch (GSM_count) 
    {
        case 0: 
          GSM_Command(str, _numRep) ;
          break;
        case 1: 
          GSM_count=0;
          
          GSM_Error_Code =0; //Сброc ошибки
          return 1;
          
          break;
    }
    return 0;
}
void GSM_Command(const __FlashStringHelper* str, byte _numRep)
{
    GSM_reply=""; //Сброс содержимого прошлого ответа модуля
    GSM_numberRepeats=_numRep;
    GSM_wait=1; // ожитать
    GSM_time =millis() + 20000; // время ожидания
    Serial_S.println(str);
    #ifdef GSM_DEBUG  // отладка
      Serial.write("Command: ");
      
      Serial.println(str);
    #endif
}
void GSM_ID_DTMF(String st)
{
    int www=(int(st.charAt(7)));
    switch (www) 
    {
        case 35:  
           GSM_DTMF =14;
          
          break;
        case 42:    
           GSM_DTMF =15;
          
          break;
        case 65:
           GSM_DTMF =10;
          break;
        case 66:  
           GSM_DTMF =11;
          break;
          
        case 67:
           GSM_DTMF =12;
          break;
        case 68:  
           GSM_DTMF =13;
          break;
          
        default:
        if (www>47 && www<58) GSM_DTMF =www-48;
    }
}
bool GSM_causeProcessingCall()
{
    static bool past_Outgoing_Call=0;
    static bool command_Outgoing_Call=0;
    if (GSM_Outgoing_Call   && !past_Outgoing_Call)  command_Outgoing_Call  =1;
    past_Outgoing_Call  = GSM_Outgoing_Call ;
    if (command_Outgoing_Call  && (GSM_team_room==0))  
    {
           command_Outgoing_Call  =0;
        return 1;
    }
     // начинать запрос времени 
    return 0;
}
bool GSM_causeProcessingTake()
{
    static bool past_Take_Call;
    static bool command_Take_Call;
    if (GSM_Take_Call    && !past_Take_Call)  
    {
         command_Take_Call=1;
    }
      past_Take_Call   =  GSM_Take_Call;
    if (command_Take_Call) 
    {
          switch (GSM_count) 
        {
              case 0: 
                GSM_count++;
                break;
              case 1: 
                GSM_Command(F("ATA"), 5);
               // Поднять трубку
              #ifdef GSM_DEBUG  // отладка    
                Serial.println("Command: ATA");
              
              #endif
                break;
              case 2: 
                GSM_count=0;
                command_Take_Call  =0;
                return 1;
                break;
              
              
        }
    }
    return 0;
}
void i2cWrite(uint8_t registerAddress, uint8_t data)
{
      Wire.beginTransmission(IMUAddress);
      Wire.write(registerAddress);
      Wire.write(data);
      Wire.endTransmission(); // Send stop
}
uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes)
{
      uint8_t data[nbytes];
      Wire.beginTransmission(IMUAddress);
      Wire.write(registerAddress);
      Wire.endTransmission(false); // Don't release the bus
      Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading
      for(uint8_t i = 0; i < nbytes; i++)
      data [i]= Wire.read();
      return data;
}

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А чего не в Ищу исполнителя? Там бы и не пинали.

b707
Offline
Зарегистрирован: 26.05.2017

Цитата:
Прошу не пинать, желающих пофлюдить типа, иди читай, иди изучай, прошу воздержатся, ну не дается мне программирование.

 вообще совет "иди изучай" тут вполне к месту. Но если такой совет нельзя - тогда советую перенести тему в "Ищу исполнителя"

Цитата:
Если есть добрые люди которые хотят помочь, буду очень признателен.

Если ваша признателельность будете подкреплена толстой пачкой долларов - желающих помочь будет больше :)

viki13viki
Offline
Зарегистрирован: 14.11.2016

Ясно. Спасибо за внимание. Денег нет, многодетный отец. Но спасибо за ваше внимание.

b707
Offline
Зарегистрирован: 26.05.2017

viki13viki пишет:

Ясно. Спасибо за внимание. Денег нет, многодетный отец. Но спасибо за ваше внимание.

вы ж тут не первый год. Цену нам знаете. И мы вам тоже :) Как там Алеха на телефоне поживает?

viki13viki
Offline
Зарегистрирован: 14.11.2016

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Вот никогда не думал, что такое напишу, но - почитайте у Гайвера. Он разжевал этот вопрос. И, главное, не предлагает своих библиотек.

b707
Offline
Зарегистрирован: 26.05.2017

viki13viki пишет:

поживает отлично, справился сам. 6 месяцев но справился.

тогда и тут есть шанс, эта задачка в разы проще

viki13viki
Offline
Зарегистрирован: 14.11.2016

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

b707
Offline
Зарегистрирован: 26.05.2017

viki13viki пишет:

могу тонны стихов и песен написать за один день и музыку к ним, но тупо дается програмирование.

а вы бартером...

viki13viki
Offline
Зарегистрирован: 14.11.2016

беспроблем, но кому в наше нах время нужно искуство.....

viki13viki
Offline
Зарегистрирован: 14.11.2016

лан, ребята, забейте. нет так нет.

viki13viki
Offline
Зарегистрирован: 14.11.2016

может ктото сейчас чутка подмогет, скрестил скетч собачий с другим скетчем сигнализации(он проще чем тот что с полной сигналкой выше). проблема что проигрываемый файл рандомно прерывается, не пригрывается до конца. и вторая проблема что файл 1 это файл приветствия myDFPlayer.play(1); как его исключить при рандомном проигрывании во время сработки сигнализации. и еще одно, может не те данные считываю? хотя все работет.если есть желание подправить, спасибою.если нет то денег нет. вот скетч.

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include "I2Cdev.h"
#include "MPU6050.h"

MPU6050 accelgyro;

SoftwareSerial mySoftwareSerial(10, 11);                // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
int count;
int state = 0;
int16_t ax, ay, az;
int16_t gx, gy, gz;
const int buttonPin = 12;
int buttonState = 0;
int alarm_Accel = 8;
int alarm_Gyro = 8;
int updateT = 500*1;
int logNumA = 0;
char command = 0;
double dT;
//******************************************************************************
// Acceleration Alarm Set - X,Y,Z
int ax_High = 20000; // Acceleration X - HIGH +
int ax_Low = -20000;
int ay_High = 20000; // Acceleration Y - HIGH +
int ay_Low = -20000;
int az_High = 20000; // Acceleration Z - HIGH +
int az_Low = -20000;

// *********************************************
// Gyro Alarm Set - X,Y,Z
int gx_High = 20000; // Gyro X - HIGH +
int gx_Low = -20000;
int gy_High = 20000; // Gyro Y - HIGH +
int gy_Low = -20000;
int gz_High = 20000; // Gyro Z - HIGH +
int gz_Low = -20000;


void setup()
{
  Wire.begin();
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);  
  if (!myDFPlayer.begin(mySoftwareSerial)) {            //Проверка
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();
    Serial.println("Testing device connections...");
    Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
    pinMode(alarm_Accel, OUTPUT);
    pinMode(alarm_Gyro, OUTPUT);
    pinMode(buttonPin, INPUT);
    accelgyro.resetSensors();
    accelgyro.setXAccelOffset(0);
    accelgyro.setYAccelOffset(0);
    accelgyro.setZAccelOffset(0);
    accelgyro.setXGyroOffset(0);
    accelgyro.setYGyroOffset(0);
    accelgyro.setZGyroOffset(0);
    delay(500);
  Serial.println(F("Всё работает!!!"));
    
  myDFPlayer.volume(25);                                //Установка громкости (0~30).
    delay(5000);                                       // Задержка 40 секунд на настройку датчика.
    myDFPlayer.play(1);
    count = myDFPlayer.readFileCounts();                //Количество файлов
}

void loop()
{
   read_switch();
   read_serial();
   state = digitalRead(alarm_Accel);
   state = digitalRead(alarm_Gyro);
   if(state == 1) {
    Serial.println("Тревога "); 
    if(myDFPlayer.readState() == 512) {
    myDFPlayer.play(random(1,count));
    }
    Serial.print("Номер трека ");
    Serial.println(myDFPlayer.readCurrentFileNumber());
    delay(10000);  
   }   
   if(state == 0) {
    Serial.println("Отбой Тревоги ");
//    myDFPlayer.pause();
   }
   if (myDFPlayer.available()) {
      printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Распечатка ошибок и статусов принтера
    }
}
//----------------------------------
void(* resetFunc) (void) = 0; //declare reset function @ address 0

void read_serial() {
  if(Serial.available() > 0){
  command = Serial.read();
  switch(command){
  case 'o':

  Serial.println("***********************************");
  Serial.println("Read Current Offset");
  Serial.println(" ");
  Serial.print("Accel X Offset: "); Serial.println(accelgyro.getXAccelOffset());
  Serial.print("Accel Y Offset: "); Serial.println(accelgyro.getYAccelOffset());
  Serial.print("Accel Z Offset: "); Serial.println(accelgyro.getZAccelOffset());
  Serial.println(" ");
  Serial.print("Gyro X Offset: "); Serial.println(accelgyro.getXGyroOffset());
  Serial.print("Gyro Y Offset: "); Serial.println(accelgyro.getYGyroOffset());
  Serial.print("Gyro Z Offset: "); Serial.println(accelgyro.getZGyroOffset());
  Serial.println("***********************************");
  Serial.println(" ");
  break;
  case 'r':
  Serial.println("Reset to Default");
  logNumA = 0;
  accelgyro.resetSensors();
  digitalWrite(alarm_Accel, LOW);
  digitalWrite(alarm_Gyro, LOW);
  resetFunc();
  break;
  case 'a':
  Serial.println("Accel X");
  logNumA = 0;
  accelgyro.resetSensors();
  digitalWrite(alarm_Accel, LOW);
  digitalWrite(alarm_Gyro, LOW);
  Serial.println("Acceleration X:");
  for(int i0=0; i0<15; i0++) {
  accelgyro.getAcceleration(&ax, &ay, &az);
//accelgyro.getRotation(&gx, &gy, &gz);
  Serial.print("Log No.: "); Serial.println(logNumA++);
//Serial.println(" ");
//Serial.print("X: ");
  Serial.println(ax);
  Serial.println(" ");
  delay(1000*1);
 }

  break;
  case 'b':
  Serial.println("Accel Y");
  logNumA = 0;
  accelgyro.resetSensors();
  digitalWrite(alarm_Accel, LOW);
  digitalWrite(alarm_Gyro, LOW);
  Serial.println("Acceleration Y:");
  for(int i1=0; i1<15; i1++) {
  accelgyro.getAcceleration(&ax, &ay, &az);
//accelgyro.getRotation(&gx, &gy, &gz);
  Serial.print("Log No.: "); Serial.println(logNumA++);
//Serial.println(" ");
//Serial.print("Y: ");
  Serial.println(ay);
  Serial.println(" ");
  delay(1000*1);
 }

  break;
  case 'c':
  Serial.println("Accel Z");
  logNumA = 0;
  accelgyro.resetSensors();
  digitalWrite(alarm_Accel, LOW);
  digitalWrite(alarm_Gyro, LOW);
  Serial.println("Acceleration Z:");
  for(int i2=0; i2<15; i2++) {
  accelgyro.getAcceleration(&ax, &ay, &az);
//accelgyro.getRotation(&gx, &gy, &gz);
  Serial.print("Log No.: "); Serial.println(logNumA++);
//Serial.println(" ");
//Serial.print("Z: ");
  Serial.println(az);
  Serial.println(" ");
  delay(1000*1);
 }

  break;

//****************

  case 'd':
  Serial.println("Gyro X");
  logNumA = 0;
  accelgyro.resetSensors();
  digitalWrite(alarm_Accel, LOW);
  digitalWrite(alarm_Gyro, LOW);
  Serial.println("Gyro Rotation X:");
  for(int i3=0; i3<15; i3++) {
//accelgyro.getAcceleration(&ax, &ay, &az);
  accelgyro.getRotation(&gx, &gy, &gz);
  Serial.print("Log No.: "); Serial.println(logNumA++);
//Serial.println(" ");
//Serial.print("X: ");
  Serial.println(gx);
  Serial.println(" ");
  delay(1000*1);
 }

  break;
  case 'e':
  Serial.println("Gyro Y");
  logNumA = 0;
  accelgyro.resetSensors();
  digitalWrite(alarm_Accel, LOW);
  digitalWrite(alarm_Gyro, LOW);
  Serial.println("Gyro Rotation Y:");
  for(int i4=0; i4<15; i4++) {
//accelgyro.getAcceleration(&ax, &ay, &az);
  accelgyro.getRotation(&gx, &gy, &gz);
  Serial.print("Log No.: "); Serial.println(logNumA++);
//Serial.println(" ");
//Serial.print("Y: ");
  Serial.println(gy);
  Serial.println(" ");
  delay(1000*1);
 }

  break;
  case 'f':
  Serial.println("Gyro Z");
  logNumA = 0;
  accelgyro.resetSensors();
  digitalWrite(alarm_Accel, LOW);
  digitalWrite(alarm_Gyro, LOW);
  Serial.println("Gyro Rotation Z:");
  for(int i5=0; i5<15; i5++) {
//accelgyro.getAcceleration(&ax, &ay, &az);
  accelgyro.getRotation(&gx, &gy, &gz);
  Serial.print("Log No.: "); Serial.println(logNumA++);
//Serial.println(" ");
//Serial.print("Z: ");
  Serial.println(gz);
  Serial.println(" ");
  delay(1000*1);
 }

  break;
   }
  }
 }

 void read_switch() {
  buttonState = digitalRead(buttonPin);
//Serial.print("Switch: "); Serial.println(buttonState);
  if (buttonState == HIGH) {
  Serial.print("Log No.: "); Serial.println(logNumA++);
  read_Accel();
  read_Gyro();
  if_Accel();
  if_Gyro();
 }

  else if (buttonState == LOW) {
  digitalWrite(alarm_Accel, LOW);
  digitalWrite(alarm_Gyro, LOW);
  }
 }

 void read_Accel() {
  accelgyro.getAcceleration(&ax, &ay, &az);
//ax = map(ax, -17000, 17000, -20, 20);
//ay = map(ay, -17000, 17000, -20, 20);
//az = map(az, -17000, 17000, -20, 20);
//Serial.println("*******************");

  Serial.println("Acceleration:");
  Serial.print("X: "); Serial.println(ax);
  Serial.print("Y: "); Serial.println(ay);
  Serial.print("Z: "); Serial.println(az);
  Serial.println(" ");
 }

 void read_Gyro() {
  accelgyro.getRotation(&gx, &gy, &gz);
//gx = map(gx, -17000, 17000, -20, 20);
//gy = map(gy, -17000, 17000, -20, 20);
//gz = map(gz, -17000, 17000, -20, 20);
  Serial.println("Gyro Rotation:");
  Serial.print("X: "); Serial.println(gx);
  Serial.print("Y: "); Serial.println(gy);
  Serial.print("Z: "); Serial.println(gz);
//Serial.println("*******************");
  Serial.println(" ");
 }

 void if_Accel() {
  if (ax >= ax_High) { // 100 - 6
  digitalWrite(alarm_Accel, HIGH);
  Serial.println("Accel X High");
  Serial.println(" ");
 }

  else if (ax <= ax_Low) { // -1 _ -100
  digitalWrite(alarm_Accel, HIGH);
  Serial.println("Accel X Low");
  Serial.println(" ");
 }

  else if (ay >= ay_High) { // -5 _ -100
  digitalWrite(alarm_Accel, HIGH);
  Serial.println("Accel Y High");
  Serial.println(" ");
 }

  else if (ay <= ay_Low) { // 100 - 1
  digitalWrite(alarm_Accel, HIGH);
  Serial.println("Accel Y Low");
  Serial.println(" ");
 }

  else if (az >= az_High) { // -5 _ -100
  digitalWrite(alarm_Accel, HIGH);
  Serial.println("Accel Z High");
  Serial.println(" ");
 }

  else if (az <= az_Low) { // 100 - 1
  digitalWrite(alarm_Accel, HIGH);
  Serial.println("Accel Z Low");
  Serial.println(" ");
 }

  else {
  digitalWrite(alarm_Accel, LOW);
  }
 }

   void if_Gyro() {
  if (gx >= gx_High) { // +
  digitalWrite(alarm_Gyro, HIGH);
  Serial.println("Gyro X High");
  Serial.println(" ");
 }

  else if (gx <= gx_Low) { // -
  digitalWrite(alarm_Gyro, HIGH);
  Serial.println("Gyro X Low");
  Serial.println(" ");
 }

  else if (gy >= gy_High) { // -
  digitalWrite(alarm_Gyro, HIGH);
  Serial.println("Gyro Y High");
  Serial.println(" ");
 }

  else if (gy <= gy_Low) { // +
  digitalWrite(alarm_Gyro, HIGH);
  Serial.println("Gyro Y Low");
  Serial.println(" ");
 }

  else if (gz >= gz_High) { // -
  digitalWrite(alarm_Gyro, HIGH);
  Serial.println("Gyro Z High");
  Serial.println(" ");
 }

  else if (gz <= gz_Low) { // +
  digitalWrite(alarm_Gyro, HIGH);
  Serial.println("Gyro Z Low");
  Serial.println(" ");
 }

  else {
  digitalWrite(alarm_Gyro, LOW);

  }

 }
//----------------------------------
void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerUSBInserted:
      Serial.println("USB Inserted!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB Removed!");
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
  
}

 

b707
Offline
Зарегистрирован: 26.05.2017

viki13viki пишет:

может ктото сейчас чутка подмогет, скрестил скетч собачий с другим скетчем сигнализации

...

вторая проблема что файл 1 это файл приветствия myDFPlayer.play(1); как его исключить при рандомном проигрывании

 

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

myDFPlayer.play(random(1,count));

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

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

b707
Offline
Зарегистрирован: 26.05.2017

Я отвечал только на вопрос, как исключить проигрывание файла 1 из рандомного списка

arduino random()

 

Почему у вас прерывается звучание - я не знаю. Какова примерно длительность роликов на DFplaer-е? - 3сек 20сек ... минута?

viki13viki
Offline
Зарегистрирован: 14.11.2016

спасибо иду читать. приветсвие 6 сек, остальные 2 шт 50 сек и 1 шт 40 сек

b707
Offline
Зарегистрирован: 26.05.2017

viki13viki пишет:

остальные 2 шт 50 сек и 1 шт 40 сек

ну а что вы тогда хотите, если вы запускаете проигрывание ролика и через 10 секунд его останавливаете? - конечно будет прерываться

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

viki13viki
Offline
Зарегистрирован: 14.11.2016

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

b707
Offline
Зарегистрирован: 26.05.2017

viki13viki пишет:
и забыл за обрыв в конце, тоже спасибо

дело не в обрыве. Вы в коде каждые 10 секунд запускаете новый трек, неудивительно, что прежний останавливается. Нужно читать с ДФплеера статус и не давать новых команд, пока он играет предыдущую песню.

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

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

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

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

b707
Offline
Зарегистрирован: 26.05.2017

viki13viki пишет:

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

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

Чуть подробнее по датчикам - в строчках 81 и 82 вы последовательно читаете два пина в одну переменную. Это означает, что результат первого чтения вы затираете вторым, то есть реально у вас данные первого датчика вообще никак не учитываются в программе.

viki13viki
Offline
Зарегистрирован: 14.11.2016

задаю вопрос и получаю удар, я попробовал скрестил, задал вопрос и получил агресивный ответ, как то не получается по вашей технике , пробуй и спрашивай. стремно уже справшивать, все равно я не усваиваю програмирование(старый уже места в памяти нету), не получается, а сделать хочется. с вами уйдет день на скетч а я сам сделаю за два месяца методами проб и ошибок, может так лучше..... еще раз извените за беспокойство.

b707
Offline
Зарегистрирован: 26.05.2017

viki13viki пишет:

а я сам сделаю за два месяца методами проб и ошибок, может так лучше..... еще раз извените за беспокойство.

да не за что.

А самому сделать - завсегда правильнее.

genia1991
Offline
Зарегистрирован: 25.12.2019

viki13viki пишет:

Привет. Задачат такая. Сигнализация на ардуино нано + GY 521 + DFPlayer лай собаки для авто.

лучше пойти путем попроще

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

viki13viki
Offline
Зарегистрирован: 14.11.2016

привет. спасибо что откликнулся genia1991. вчера до 4 утра колдовал. нашел скетч простой сигналки, отлично работает, а так же есть сигналка лай пса, но там используется PIR датчик движения. как уже не скрещивал, как не тыкал и менял, работает но есть косяки. сижу уже с утра. но увы избавится от косяков не получается, тупой я в программировании и функциях, чет там чутка понимаю, но не достаточно.  там всего то подменить датчик PIR на  gy512(mpu6050), для знающих это семечки на 10 минут, для меня это вечность неизвестного времени. конечно буду тыкать пока не выйду на чтото нормальное, но может ктото захочет помочь....(денег нет) ПИШИТЕ ТОЛЬКО ТЕ КТО ХОЧЕТ ПОМОЧЬ, ПОЖАЛУЙСТА. КТО ХОЧЕТ СКАЗАТЬ КАКОЙ Я ТУПОЙ, НЕ НУЖНО Я САМ ЗНАЮ ЧТО ТУПОЙ. СПАСИБО ЗА ПОНИМАНИЕ.....

никого не умоляю и не заставляю, вот что у меня получилось, все изменения делал в loop

вариант скрещивания 1.  проблема все работает но файлы не воспроизводит

// простая сигнализация
// датчик реагирует даже на постукивание 
// пальцем на противоположном конце стола
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
//---------------------------------
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(10, 11);                // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
int count;
//const int pirPIN = 2;                                   // контакт  подключения датчика
//int state = 0;
//-----------------------------------
MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;
long ACC, GYR;
long trACC, trGYR;
long maxACC, maxGYR;

void setup() {
  mySoftwareSerial.begin(9600);
  Wire.begin();
  Serial.begin(9600);
  if (!myDFPlayer.begin(mySoftwareSerial)) {            //Проверка
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("Всё работает!!!"));
  myDFPlayer.volume(5);                                //Установка громкости (0~30).
    delay(15000);                                       // Задержка 40 секунд на настройку датчика.
    myDFPlayer.play(1);
    count = myDFPlayer.readFileCounts();                //Количество файлов
  mpu.initialize();
  mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
  delay(2000);
  // "калибровка" максимальных значений
  for (int i = 0; i < 600; i++) { mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); ACC = abs(ax) + abs(ay) + abs(az); GYR = abs(gx) + abs(gy) + abs(gz); if (ACC > maxACC) maxACC = ACC;
    if (GYR > maxGYR) maxGYR = GYR;
    delay(5);
  }
  maxACC = maxACC + trACC;
  maxGYR = maxGYR + trGYR;
}
void loop() {
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  // сумма модулей
  ACC = abs(ax) + abs(ay) + abs(az);
  GYR = abs(gx) + abs(gy) + abs(gz);
  if (ACC > maxACC || GYR > maxGYR) {
    Serial.println("Тревога "); 
    if(myDFPlayer.readState() == 512) {
    myDFPlayer.play(random(count));
    }
    Serial.print("Номер трека ");
    Serial.println(myDFPlayer.readCurrentFileNumber());
    delay(50); 
  //Serial.println("Тревога ");
  //myDFPlayer.play(random(1,count)); 
  }
  delay(10);
}

вариант скрещивания 2. проблема что чувствительность становится на максимум и постоянно срабатывает, менять чувствительность не помогает

// простая сигнализация
// датчик реагирует даже на постукивание 
// пальцем на противоположном конце стола
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
//---------------------------------
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(10, 11);                // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
int count;
//const int pirPIN = 2;                                   // контакт  подключения датчика
//int state = 0;
//-----------------------------------
MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;
long ACC, GYR;
long trACC, trGYR;
long maxACC, maxGYR;

void setup() {
  mySoftwareSerial.begin(9600);
  Wire.begin();
  Serial.begin(9600);
  if (!myDFPlayer.begin(mySoftwareSerial)) {            //Проверка
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("Всё работает!!!"));
  myDFPlayer.volume(5);                                //Установка громкости (0~30).
    delay(15000);                                       // Задержка 40 секунд на настройку датчика.
    myDFPlayer.play(1);
    count = myDFPlayer.readFileCounts();                //Количество файлов
  mpu.initialize();
  mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
  delay(2000);
  // "калибровка" максимальных значений
  for (int i = 0; i < 600; i++) { mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); ACC = abs(ax) + abs(ay) + abs(az); GYR = abs(gx) + abs(gy) + abs(gz); if (ACC > maxACC) maxACC = ACC;
    if (GYR > maxGYR) maxGYR = GYR;
    delay(5);
  }
  maxACC = maxACC + trACC;
  maxGYR = maxGYR + trGYR;
}
void loop() {
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  // сумма модулей
  ACC = abs(ax) + abs(ay) + abs(az);
  GYR = abs(gx) + abs(gy) + abs(gz);
  if (ACC > maxACC || GYR > maxGYR) {
    Serial.println("Тревога "); 
    if(myDFPlayer.readState() == 512) {
    myDFPlayer.play(random(count));
    }
    //Serial.print("Номер трека ");
    //Serial.println(myDFPlayer.readCurrentFileNumber());
    //delay(50); 
  //Serial.println("Тревога ");
  //myDFPlayer.play(random(1,count)); 
  }
  delay(10);
}

ОРИГЕНАЛЫ СКЕТЧЕЙ

сигналка с собакой на PIR

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11);                // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
int count;
const int pirPIN = 2;                                   // контакт  подключения датчика
int state = 0;
void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);  
  if (!myDFPlayer.begin(mySoftwareSerial)) {            //Проверка
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("Всё работает!!!"));
    
  myDFPlayer.volume(25);                                //Установка громкости (0~30).
    delay(40000);                                       // Задержка 40 секунд на настройку датчика.
    myDFPlayer.play(4);
    count = myDFPlayer.readFileCounts();                //Количество файлов
}

void loop()
{
   state = digitalRead(pirPIN);
   if(state == 1) {
    Serial.println("Тревога "); 
    if(myDFPlayer.readState() == 512) {
    myDFPlayer.play(random(count));
    }
    Serial.print("Номер трека ");
    Serial.println(myDFPlayer.readCurrentFileNumber());
    delay(5000);  
   }   
   if(state == 0) {
    Serial.println("Отбой Тревоги ");
//    myDFPlayer.pause();
   }
   if (myDFPlayer.available()) {
      printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Распечатка ошибок и статусов принтера
    }
}

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerUSBInserted:
      Serial.println("USB Inserted!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB Removed!");
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
  
}

простая сигналка с настройкой чувствительности на gy512(mpu6050)

// простая сигнализация
// датчик реагирует даже на постукивание 
// пальцем на противоположном конце стола
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;
long ACC, GYR;
long maxACC, maxGYR;
void setup() {
  Wire.begin();
  Serial.begin(9600);
  mpu.initialize();
  mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
  delay(2000);
  // "калибровка" максимальных значений
  for (int i = 0; i < 30; i++) { mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); ACC = abs(ax) + abs(ay) + abs(az); GYR = abs(gx) + abs(gy) + abs(gz); if (ACC > maxACC) maxACC = ACC;
    if (GYR > maxGYR) maxGYR = GYR;
    delay(5);
  }
  maxACC = maxACC + trACC;
  maxGYR = maxGYR + trGYR;
}
void loop() {
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  // сумма модулей
  ACC = abs(ax) + abs(ay) + abs(az);
  GYR = abs(gx) + abs(gy) + abs(gz);
  if (ACC > maxACC || GYR > maxGYR) {
    Serial.println("KEK!");
  }
  delay(10);
}

 

genia1991
Offline
Зарегистрирован: 25.12.2019

вот простейшая сигналка.

https://microkontroller.ru/arduino-projects/detektor-dvizheniya-s-ispolz...

а это wav пллер:

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

https://tehnopage.ru/wav-pleer-arduino

viki13viki
Offline
Зарегистрирован: 14.11.2016

спасибо, но это теже грабли для меня с датчиком PIR

genia1991
Offline
Зарегистрирован: 25.12.2019

вам нужна еще  эта  mpu6050?

ее можно заменить датчиком удара

https://arduinomaster.ru/datchiki-arduino/datchik-vibratsii-arduino/

хватит ли чувствительности? надо тестить.   код там тоже супер простой

viki13viki
Offline
Зарегистрирован: 14.11.2016

скетч что я выложил как оригинал пост 25 оооочень чувствительный и мне нужен только mpu6050

мне просто нужно заминить pir на mpu6050 в скетче с собакой. я скрестил в посте 25, подправить нужно

genia1991
Offline
Зарегистрирован: 25.12.2019

mpu6050  - этот датчик для самых начинающих может показать сложным в применении

 

здесь еще pir есть:

https://maker.pro/arduino/projects/arduino-motion-detector-using-pir-sensor

genia1991
Offline
Зарегистрирован: 25.12.2019

viki13viki пишет:

мне просто нужно заминить pir на mpu6050 в скетче с собакой. я скрестил в посте 25, подправить нужно

там проще переписать все

viki13viki
Offline
Зарегистрирован: 14.11.2016

если бы я мог переписать, я бы переписал уже, но я дуб дубом. PIR не нужен, это будет в бусе стоять и при ударе или дергании будет лаять, датчик mpu6050 уже имею, по этому работаю с ним,  скетч ориген в 25 посте работает ооочень чувсьвительно.

genia1991
Offline
Зарегистрирован: 25.12.2019

viki13viki пишет:

если бы я мог переписать, я бы переписал уже, но я дуб дубом. PIR не нужен, это будет в бусе стоять и при ударе или дергании будет лаять, датчик mpu6050 уже имею, по этому работаю с ним,  скетч ориген в 25 посте работает ооочень чувсьвительно.

 

тогда скетч который я скинул wav плеера (dвыше скидывал ссылку) надо добавить в скетч из 25 поста

Эту строчку заменить на воспроизведение собаки

вот эту строчку:

 32 строчка   Serial.println("KEK!");32

на эту :

  tmrpcm.play("sounds/son8bit.wav");

viki13viki
Offline
Зарегистрирован: 14.11.2016

принял, ща попробую

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

viki13viki, а чем Вас PIR датчик не устраивает?

genia1991
Offline
Зарегистрирован: 25.12.2019

andriano пишет:

viki13viki, а чем Вас PIR датчик не устраивает?

собака тогда будет каждого прохожего пугать кто мимо пройдет :))))

viki13viki
Offline
Зарегистрирован: 14.11.2016

не дырявить же бус для вывода датчиков на ружу, и обвешивать со свех сторон

viki13viki
Offline
Зарегистрирован: 14.11.2016

пир будет всех пугать, это опасно, пожалуются а так только если бус дергать или бить тогда ГАВ ГАВ

genia1991
Offline
Зарегистрирован: 25.12.2019

вот лучше этот за основу взять. еще проще

http://domoticx.com/arduino-audio-afspelen-wav/

 

и очень надо быть внимательным при подключении всего

viki13viki
Offline
Зарегистрирован: 14.11.2016

ща пробую первый твой вареант, потом попробую второй.

genia1991
Offline
Зарегистрирован: 25.12.2019
// importeer de SD bibliotheek.
#include <SD.h>
// Chipselectpin voor de SD Card reader module
#define SD_ChipSelectPin 4
// importeer de WAV PCM bibliotheek.
#include <TMRpcm.h>
// Importeer de bibliotheek voor systeemfucnties.
#include <SPI.h>
 
// Maak een object aan TMRpcm
TMRpcm audio;

#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;
long ACC, GYR;
long maxACC, maxGYR;
void setup() {
    // Pin waar luidspreker(+) is aangesloten.
  audio.speakerPin = 9;
  // Kijk of de SD Card reader aangesloten is en geinitialiseerd kan worden.
  if (!SD.begin(SD_ChipSelectPin)) {
    Serial.println("SD Card gefaald!");  
    // Ga terug en doe verder niets meer.
    return;
  }
  Wire.begin();
  Serial.begin(9600);
  mpu.initialize();
  mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
  delay(2000);
  // "калибровка" максимальных значений
  for (int i = 0; i < 30; i++) { mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); ACC = abs(ax) + abs(ay) + abs(az); GYR = abs(gx) + abs(gy) + abs(gz); if (ACC > maxACC) maxACC = ACC;
    if (GYR > maxGYR) maxGYR = GYR;
    delay(5);
  }
  maxACC = maxACC + trACC;
  maxGYR = maxGYR + trGYR;
}
void loop() {
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  // сумма модулей
  ACC = abs(ax) + abs(ay) + abs(az);
  GYR = abs(gx) + abs(gy) + abs(gz);
  if (ACC > maxACC || GYR > maxGYR) {
    /////
      audio.play("1.wav");
  audio.loop(1);
  }
  /////
  delay(10);
}

  

 

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

оооо спасибо ща протестим, ток файлы подберу или конвертирую

genia1991
Offline
Зарегистрирован: 25.12.2019

так надо?  

по ссылке последней надо подключить правильно sd модуль. гарузить туда файл. карты не больше 16 гиг

В общем скетч должен работать. остальное надо добить

genia1991
Offline
Зарегистрирован: 25.12.2019

viki13viki пишет:

оооо спасибо ща протестим, ток файлы подберу или конвертирую

 

там не все так просто . должен быть файл в моно и еще какие то там настройки при конвертации.

почитайте за библиотеку ту. где то инфа есть

моно потом можно будет переделать в стерео если надо будет

 

короче. скетч 99% рабочий. а вот остальная часть тоже не такая простая как кажется

 

SD надо форматнуть. в ней без пааок дожен быть wav файл.  загуглите более подрожную иинфу . там подвоные камни есть и не один

viki13viki
Offline
Зарегистрирован: 14.11.2016

дело в том что у мене подключение по 4 пинам из плеера, тх и rx и питание и динамик на прямую к плееру. ок имею пищу для размышления иду ковырять, СПАСИБО

genia1991
Offline
Зарегистрирован: 25.12.2019

вот это надо загуглить TMRpcm и почитать как подготовить wav файл

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

ОК СПАСИБО. ПОТОМ ОТПИШУСЬ

genia1991
Offline
Зарегистрирован: 25.12.2019

viki13viki пишет:

дело в том что у мене подключение по 4 пинам из плеера, тх и rx и питание и динамик на прямую к плееру

 

какой плеер?

по скетчу только MPU + SD + динамик + ардуино получается

viki13viki
Offline
Зарегистрирован: 14.11.2016

DFPlayer + dinamik+arduino nano+mpu6050

genia1991
Offline
Зарегистрирован: 25.12.2019

название файла собаки такой должен быть 1.wav