SOFTWARESERIAL GSM SIM 800L

vlad257
Offline
Зарегистрирован: 31.05.2020

Здравствуйте.

Возможно кто-то мне поможет.
Делаю проект на Ардуино уно.
использую
VOICE RECOGNITION 
MP3
GSM SIM800L
 
все один нуждаються в uart.
voice recognition и mp3 вместе работают нормально.
но когда поключаю gsm sim800l он не работает с ними.
Использую serial.end();
но конкретно gsm не работает.
И я не понимаю почему.
Заранее спасибо.
Код прилагается.
Функция sim - первая.
Использую ее в loop.
Остальное полностью рабочее.
Спасибо
b707
Offline
Зарегистрирован: 26.05.2017

код вставьте по правилам форума прямо в сообщение

vlad257
Offline
Зарегистрирован: 31.05.2020
#include <OneWire.h>
#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"
#include <DFPlayer_Mini_Mp3.h>
String SMSNUMBER = "xxxxxxxxxxxx";    // !!!!!!!!
SoftwareSerial sms (10, 11);
SoftwareSerial mp3 (0,1);

VR myVR(2, 3);   // voice recognition


uint8_t records[7]; // save record
uint8_t buf[64];

int ledyellow = 5 ;
int ledblue = 8;
int ledred = 9;

int pirmove = 4; //sensormove

int z = 0;
int m = 0;

char pass[4] = {'1', '2', '3', '4'};     //keypad
char buttons[4] = {'0', '0', '0', '0'};
int k = 0;
int b = 0;

#define on   (0) //voice comand
#define off  (1)
#define tm (2)

int ret;

int p;        //temperature
OneWire ds(13);


int g=0;


void sms1()
{  
   myVR.end();
   mp3.end();
   sms.begin(9600);
   
     sms.print("AT+CMGF=1\r");
  delay(100);

  
  // USE INTERNATIONAL FORMAT CODE FOR MOBILE NUMBERS
  sms.print("AT+CMGS=\"" + SMSNUMBER + "\"\r");
  delay(200);
  // Send the SMS
  sms.print("Security works\r");
  delay(400);

  // End AT command with a ^Z, ASCII code 26
  sms.println((char)26);
  delay(200);

  sms.end();
  delay(100);
  return; 
}
  






void setup()
{

  //myVR.begin(9600);
  //Serial.begin (9600);
  


  pinMode(ledblue, OUTPUT);
  pinMode(ledred, OUTPUT);
  pinMode(ledyellow, OUTPUT);

  pinMode(pirmove, INPUT); //move


mp3.begin(9600);  
  mp3_set_serial (mp3);  // mp3
  delay(100);
  mp3_set_volume(15);
mp3.end();  


}




void loop()
{

  int z = 0;
c:
  digitalWrite(ledred, LOW);
  digitalWrite(ledyellow, LOW);

int BV = analogRead(0);
if (BV>5 && BV<488){
digitalWrite(ledyellow, HIGH);
delay(200);
voice_check();
z=2;
}  


        //button check
  if (BV > 488) {
    digitalWrite(ledyellow, HIGH);
    key_pad();
    z = 2;

  }

  int pirvalue = digitalRead(pirmove);
  if (pirvalue == HIGH || z >= 2) {           //1:if 1 time move
    digitalWrite(ledblue, LOW);
    delay(1000);
    z = z + 1;

    if (pirvalue == HIGH || z >= 2) { //2: if 2 times move
      digitalWrite(ledred, HIGH);
       sms1();
        delay(200);
      
      mp3.begin(9600);   
      mp3_play (4);                   // remove protection
      delay(1200);
       mp3.end();  
                            //send sms about move

      do {
        mp3.begin(9600);  
        mp3_play (5);             //buzzer
        delay(1000);
        mp3.end();  


          int BV = analogRead(0);  
          if (BV>5 && BV<488){
          digitalWrite(ledyellow, HIGH);
          delay(200);
          voice_check();
          
          }  

        //button ckeck
        if (BV > 10) {
          key_pad();
        }

      }
      while (m < 100);



    }

    else {      //2:
      
      goto c;
    }
  }

  else if (pirvalue == LOW) { //1:
    digitalWrite(ledblue, HIGH);
    delay(2000);
    z = 0;
    goto c;
  }
}

////////////////////////////////////////////////////////////////////
void homie(){ //home mode
  digitalWrite(ledred, LOW);
  digitalWrite(ledyellow, LOW);
  digitalWrite(ledblue, LOW);
a:
int g = 0;
int z = 0;
int ret;  
myVR.begin(9600);                          
ret = myVR.recognize(buf, 50);
 if(ret>0){
        switch(buf[1]){
          case off:
myVR.end();
          mp3.begin(9600);  
             digitalWrite(ledblue, LOW);
             mp3_play (2); //"mp3/0002.mp3" put security
             delay(2000);
             
          mp3.end();     
             loop();
             break;
        case tm:      //temperature
myVR.end();
        
           temper();
           break;
        }
 }
 myVR.end();
  int BV = analogRead(0);  //button check
  if (BV>10){
  key_pad1();
   }    
  else{
    goto a;
    } 
}

////////////////////////////////////////////////////

void voice_check(){
 digitalWrite(ledyellow, LOW);
 int g=0;
  do{
  int ret;
  
myVR.begin(9600);
     

        ret = myVR.recognize(buf, 50); //voice check
        
        //myVR.print("33");
        if (ret > 0) {  
            switch(buf[1]){
              case on:
          //     myVR.print("33");
            myVR.end();
               mp3.begin(9600);  
                digitalWrite(ledblue, HIGH);
                mp3_play (3); //  hi
                delay(2000);
                mp3_play (1); // remove protection
                delay(2000);
              mp3.end();    
                temper(); //temperature
                 homie();
                break;
   
            }
            
         //myVR.end();        
        }
        
      delay(50);
     g=g+1;
  myVR.end();
  //return;
  }
  while (g<100);
  return;
}        
//////////////////////////////////////////////////////////////////////
void temper(){
   f:                                                                                     
  byte data[2];                                                                         
  
  ds.reset();                                                                           
  ds.write(0xCC);                                                                  
  ds.write(0x44);                                                                       
  
  delay(1000);                                                                          
  
  ds.reset();                                                                           
  ds.write(0xCC); 
  ds.write(0xBE);                                                                       
                                                                                    
  data[0] = ds.read();                                                                  
  data[1] = ds.read();                                                                  
                                                                                       
                                                                                       
                                                                                      
  float tem =  ((data[1] << 8) | data[0]) * 0.0625;
                                                                                    

  for(p=14; p<35; p++){
    if(tem>=(p-0.5) && (p+0.5)>tem)
    {
     mp3.begin(9600);  
       mp3_play (p); 
       delay(3500);
     mp3.end();    
       return;
    }
    
  }
  goto f;
}
/////////////////////////////////////////////////////////////////////////////
void key_pad1 (){
char buttons[4]={'0', '0', '0', '0'}; 
int k=0;
int b=0;
f:  
  if (k>3){
    
     return;
  }
  if(b == 4){
    if (buttons[0] == pass[0] && buttons[1] == pass[1] && buttons[2] == pass[2] && buttons[3] == pass[3]){
      digitalWrite(ledblue, HIGH);
      
      mp3.begin(9600);  
      mp3_play (2); // put security
      delay(2000);
      mp3.end();  
       loop();
    }
    else{
      
      return;   
    }
  }
  digitalWrite(ledyellow, HIGH);
  int BV = analogRead(0); 
  if (BV>1000){
    buttons[b]='1';
    delay(500);
        if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1; 
  }
  if (BV>910 && BV<930){
    buttons[b]='2';
    delay(500);
         if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;   
  }
  if (BV>835 && BV<855){
    buttons[b]='3';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>770 && BV<790){
    buttons[b] = '4';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>712 && BV<740){
    buttons[b] = '5';
    delay(500);
           if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>662 && BV<685){
    buttons[b]='6';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>622 && BV<645){
    buttons[b]='7';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>575 && BV<610){
    buttons[b]='8';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>545 && BV<572){
    buttons[b]='9';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>515 && BV<540){
    buttons[b]='*';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>488 && BV<512){
    buttons[b]='0';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>465 && BV<485){
    buttons[b]='#';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }
  goto f;
}
//////////////////////////////////////////////////////////////////////////////////
void key_pad (){
char buttons[4]={'0', '0', '0', '0'}; 
int k=0;
int b=0;
d:  
  if (k>3){
    
     return;
  }
  if(b == 4){
    if (buttons[0] == pass[0] && buttons[1] == pass[1] && buttons[2] == pass[2] && buttons[3] == pass[3]){
      digitalWrite(ledblue, HIGH);
      mp3.begin(9600);  
      mp3_play (3); // 
      delay(2000);
      mp3_play (1); // 
      delay(2000);
      mp3.end();  
       temper();
       homie();
    }
    else{
      
      return;   
    }
  }
  digitalWrite(ledyellow, HIGH);
  int BV = analogRead(0); 
  if (BV>1000){
    buttons[b]='1';
    delay(500);
        if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1; 
  }
  if (BV>910 && BV<930){
    buttons[b]='2';
    delay(500);
         if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;   
  }
  if (BV>835 && BV<855){
    buttons[b]='3';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>770 && BV<790){
    buttons[b] = '4';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>712 && BV<740){
    buttons[b] = '5';
    delay(500);
           if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>662 && BV<685){
    buttons[b]='6';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>622 && BV<645){
    buttons[b]='7';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>575 && BV<610){
    buttons[b]='8';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>545 && BV<572){
    buttons[b]='9';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>515 && BV<540){
    buttons[b]='*';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>488 && BV<512){
    buttons[b]='0';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }if (BV>465 && BV<485){
    buttons[b]='#';
    delay(500);
          if (buttons[b] != pass[b]){
        k=k+1;
        b = -1;
        }
    b=b+1;
  }
  goto d;
}

 

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

Сразу самое очевидное - зачем вы mp3 повесили на пины 0 и 1 ? Там находится аппаратный Сериал. Если вам аппаратный сериал ни для чего другого не нужен - используйте его для mp3 вместо программного.

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

vlad257
Offline
Зарегистрирован: 31.05.2020

раньше просто использовал mp3 не инициализируя его отдельно от serial.begin
сейчас поменял

SoftwareSerial mp3 (6,7);
но проблему мою это не решает.
всё так же работеат без gsm.

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

vlad257 пишет:

раньше просто использовал mp3 не инициализируя его отдельно от serial.begin
сейчас поменял

SoftwareSerial mp3 (6,7);
но проблему мою это не решает.
всё так же работеат без gsm.

ну тогда попробуйте повесить gsm на аппаратный сериал.

И. для начала - вы отдельно GSM на ардуине запускать пробовали? Ответы приходили? Вы знаете, как их обрабатывать? - что-то не вижу этого в коде...

vlad257
Offline
Зарегистрирован: 31.05.2020

Работает отдельно отлично.
в коде минимум функций, только смс. надо для начала чтобы хотя бы это работало.
Сейчас попробую подключить на апаратный.
спасибо большое.

Komandir
Offline
Зарегистрирован: 18.08.2018

А слабо 10 Software serial запустить ???

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

А где в loop работа с модемом?
Код не жизнеспособен, delay убивает всю интерактивность - обработку кнопок и работу с модемом.
Рекомендую сделать код работы со звуком без единого delay, потом уже крутить все остальное.

vlad257
Offline
Зарегистрирован: 31.05.2020

Скетч не хочет заходить на контролер когда gsm на 0 1.

Komandir
Offline
Зарегистрирован: 18.08.2018

... А вы как думали будет ? Либо порт для заливки либо периферия. Ещё и работать не будет, пока вы не оставите ОДНО устройство на шине !

vlad257
Offline
Зарегистрирован: 31.05.2020

andycat пишет:
А где в loop работа с модемом? Код не жизнеспособен, delay убивает всю интерактивность - обработку кнопок и работу с модемом. Рекомендую сделать код работы со звуком без единого delay, потом уже крутить все остальное.

Не понял вас, если чесно.
Какие функции gsm должны быть в loop?
delay нужны после озвучки, чтобы она была. То есть delay ровно столько, сколько длиться запись.

 

vlad257
Offline
Зарегистрирован: 31.05.2020

mp3 работает же на 0 1. И при этом и mp3 и voice recognition работают вместе. просто mp3 на обычном serial.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Вместо delay использовать таймеры или millis
Если из модема приходит какая либо информация по uart и в этот момент у вас delay, то вы просто потеряете этот ответ, соответственно и смс может корректно не отправиться или приняться.
В качестве примера http://arduino.ru/forum/apparatnye-voprosy/vse-o-sim800l-i-vse-chto-s-ni...

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

vlad257 пишет:

Скетч не хочет заходить на контролер когда gsm на 0 1.

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

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Usbasp проще купить.